Files
mokocli/tmp_wiki_rename.py
Jonathan Miller 033e948c79
Generic: Repo Health / Scripts governance (push) Blocked by required conditions
Generic: Repo Health / Repository health (push) Blocked by required conditions
Generic: Repo Health / Report Issues (push) Blocked by required conditions
Platform: mokoplatform CI / Gate 2: Unit Tests (8.1) (pull_request) Blocked by required conditions
Platform: mokoplatform CI / Gate 2: Unit Tests (8.2) (pull_request) Blocked by required conditions
Platform: mokoplatform CI / Gate 2: Unit Tests (8.3) (pull_request) Blocked by required conditions
Platform: mokoplatform CI / Gate 3: Self-Health Check (pull_request) Blocked by required conditions
Platform: mokoplatform CI / Gate 4: Governance (pull_request) Blocked by required conditions
Platform: mokoplatform CI / Gate 5: Template Integrity (pull_request) Blocked by required conditions
Platform: mokoplatform CI / CI Summary (pull_request) Blocked by required conditions
Universal: PR Check / Build RC Package (pull_request) Blocked by required conditions
Universal: PR Check / Report Issues (pull_request) Blocked by required conditions
Generic: Repo Health / Scripts governance (pull_request) Blocked by required conditions
Generic: Repo Health / Repository health (pull_request) Blocked by required conditions
Generic: Repo Health / Report Issues (pull_request) Blocked by required conditions
Generic: Repo Health / Site Health (push) Has been skipped
Generic: Repo Health / Access control (push) Successful in 1s
Generic: Repo Health / Site Health (pull_request) Has been skipped
Universal: PR Check / Branch Policy (pull_request) Failing after 2s
Generic: Repo Health / Access control (pull_request) Successful in 2s
Universal: PR Check / Validate PR (pull_request) Failing after 7s
Universal: Security Audit / Dependency Audit (pull_request) Successful in 7s
Universal: Auto Version Bump / Version Bump (push) Successful in 14s
Platform: mokoplatform CI / Gate 1: Code Quality (pull_request) Failing after 1m8s
feat: security advisory aggregator, manifest API rewrite, namespace rename (#150, #283)
- Add `security:advisories` command — cross-repo CVE scanner via composer audit
  with checkpoint resumability, severity filtering, and auto-issue creation
- Rewrite `manifest:read` to use Gitea manifest API as primary source with
  auto-detection fallback from source tree (no more manifest.xml dependency)
- Rename MokoStandards namespace → MokoCli across all files
- Rename MokoEnterprise namespace → MokoCli across all files
- Rename MokoStandardsParser class → ManifestParser
- Fix composer.json autoload paths: src/ → source/
2026-06-20 20:24:58 -05:00

38 lines
34 KiB
Python

import base64, re
protected_pat = re.compile(
r'(com_mokowaashq|pkg_mokowaashq|plg_webservices_mokowaashq|'
r'com_mokowaasannounce|mod_mokowaasannounce|mokowaasannounce|'
r'mokowaashq|ModMokowaasannounceHelper|#__mokowaasannounce)',
re.IGNORECASE
)
def apply_replacements(text):
parts = protected_pat.split(text)
result = []
for i, part in enumerate(parts):
if i % 2 == 0:
part = part.replace('MokoWaaSHQ', 'MokoSuiteHQ')
part = part.replace('MokoWaaSBase', 'MokoSuiteBase')
part = part.replace('MokoWaaS', 'MokoSuite')
part = part.replace('mokowaas', 'mokosuite')
result.append(part)
return ''.join(result)
pages = {
"Home": "IyBNb2tvU3VpdGVIUQoKQ2VudHJhbGl6ZWQgY29udHJvbCBwYW5lbCBmb3IgTW9rb1dhYVMgY2xpZW50IGluc3RhbGxhdGlvbnMgLS0gcmVjZWl2ZXMgaGVhcnRiZWF0cyBmcm9tIHJlbW90ZSBKb29tbGEgc2l0ZXMsIGRpc3BsYXlzIHN0YXR1cyBkYXNoYm9hcmQsIGFuZCBtYW5hZ2VzIHNpdGUgcmVnaXN0cmF0aW9ucwoKfCBGaWVsZCB8IFZhbHVlIHwKfC0tLXwtLS18CnwgKipUeXBlKiogfCBKb29tbGEgUGFja2FnZSAoY29tcG9uZW50ICsgd2Vic2VydmljZXMgcGx1Z2luKSB8CnwgKipWZXJzaW9uKiogfCAwMS4wMC4zNSB8CnwgKipKb29tbGEqKiB8IDUueCAvIDYueCB8CnwgKipQSFAqKiB8IDguMSsgfAp8ICoqTGljZW5zZSoqIHwgR1BMLTMuMC1vci1sYXRlciB8CnwgKipQbGF0Zm9ybSoqIHwgW01va29HaXRlYV0oaHR0cHM6Ly9naXQubW9rb2NvbnN1bHRpbmcudGVjaC9Nb2tvQ29uc3VsdGluZy9Nb2tvU3VpdGVIUSkgfAoKLS0tCgojIyBBcmNoaXRlY3R1cmUKCmBgYAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCAgICAgICAgIE1va29XYWFTSFEgQ29udHJvbCBQYW5lbCAgICAgICAgICAgICB8CnwgICAgICAgICAoQ2VudHJhbCBKb29tbGEgU2l0ZSkgICAgICAgICAgICAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfCAgY29tX21va293YWFzaHEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgICstIERhc2hib2FyZDogc2l0ZSBzdGF0dXMgb3ZlcnZpZXcgICAgICAgICAgfAp8ICArLSBTaXRlczogcmVnaXN0ZXIgJiBtYW5hZ2UgY2xpZW50IHNpdGVzICAgIHwKfCAgKy0gSGVhcnRiZWF0czogaGlzdG9yeSAmIGRpYWdub3N0aWNzICAgICAgICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8ICBwbGdfd2Vic2VydmljZXNfbW9rb3dhYXNocSAgICAgICAgICAgICAgICAgIHwKfCAgKy0gUE9TVCAvYXBpL3YxL21va293YWFzaHEvaGVhcnRiZWF0ICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgICAgICAgIF4gICAgICAgICAgICBeICAgICAgICAgICAgXgogICAgICAgICB8IGhlYXJ0YmVhdCAgfCBoZWFydGJlYXQgIHwgaGVhcnRiZWF0CiAgICArLS0tLS0tLS0rICAgKy0tLS0tLS0tKyAgICstLS0tLS0tLSsKICAgIHxDbGllbnQgMXwgICB8Q2xpZW50IDJ8ICAgfENsaWVudCBOfAogICAgfCBKb29tbGEgfCAgIHwgSm9vbWxhIHwgICB8IEpvb21sYSB8CiAgICB8ICtXYWFTICB8ICAgfCArV2FhUyAgfCAgIHwgK1dhYVMgIHwKICAgICstLS0tLS0tLSsgICArLS0tLS0tLS0rICAgKy0tLS0tLS0tKwpgYGAKCnwgRXh0ZW5zaW9uIHwgUHVycG9zZSB8CnwtLS18LS0tfAp8IGBjb21fbW9rb3dhYXNocWAgfCBBZG1pbiBkYXNoYm9hcmQsIHNpdGUgQ1JVRCwgaGVhcnRiZWF0IGhpc3RvcnkgfAp8IGBwbGdfd2Vic2VydmljZXNfbW9rb3dhYXNocWAgfCBSRVNUIEFQSSByb3V0ZSBmb3IgaGVhcnRiZWF0IGluZ2VzdGlvbiB8CnwgYHBrZ19tb2tvd2Fhc2hxYCB8IEJ1bmRsZXMgYm90aCBmb3Igc2luZ2xlLWNsaWNrIGluc3RhbGwgfAoKLS0tCgojIyBSZXF1aXJlbWVudHMKCnwgUmVxdWlyZW1lbnQgfCBNaW5pbXVtIHwKfC0tLXwtLS18CnwgSm9vbWxhIHwgNS54IG9yIDYueCB8CnwgUEhQIHwgOC4xKyB8CnwgTXlTUUwgfCA4LjArIHwKCi0tLQoKPiBbTW9rb1N0YW5kYXJkc10oaHR0cHM6Ly9naXQubW9rb2NvbnN1bHRpbmcudGVjaC9Nb2tvQ29uc3VsdGluZy9tb2tvcGxhdGZvcm0vd2lraS9Ib21lKQoKLS0tCgoqUmVwbzogW01va29TdWl0ZUhRXShodHRwczovL2dpdC5tb2tvY29uc3VsdGluZy50ZWNoL01va29Db25zdWx0aW5nL01va29TdWl0ZUhRKSDCtyBbTW9rb1N0YW5kYXJkc10oaHR0cHM6Ly9naXQubW9rb2NvbnN1bHRpbmcudGVjaC9Nb2tvQ29uc3VsdGluZy9tb2tvcGxhdGZvcm0vd2lraS9Ib21lKSoKCnwgUmV2aXNpb24gfCBEYXRlIHwgQXV0aG9yIHwgRGVzY3JpcHRpb24gfAp8LS0tfC0tLXwtLS18LS0tfAp8IDIuMCB8IDIwMjYtMDYtMTkgfCBNb2tvIENvbnN1bHRpbmcgfCBSZXdyaXRlIGZyb20gY29kZSByZXNlYXJjaCAtLSBhcmNoaXRlY3R1cmUsIGhlYXJ0YmVhdCBmbG93IHwKfCAxLjEgfCAyMDI2LTA2LTE4IHwgTW9rbyBDb25zdWx0aW5nIHwgRml4IHJlcG8gbmFtZSwgVVJMcyB8CnwgMS4wIHwgMjAyNi0wNS0wOSB8IE1va28gQ29uc3VsdGluZyB8IEluaXRpYWwgdmVyc2lvbiB8Cg==",
"guides/Configuration": "W+KGkCBCYWNrIHRvIEhvbWVdKEhvbWUpCgojIENvbmZpZ3VyYXRpb24KCkNvbmZpZ3VyYXRpb24gaXMgc3BsaXQgYmV0d2VlbiB0aGUgaG9zdCBjb21wb25lbnQgKGFubm91bmNlbWVudCBtYW5hZ2VtZW50KSBhbmQgdGhlIHJlbW90ZSBtb2R1bGUgKGRpc3BsYXkgc2V0dGluZ3MpLgoKIyMgSG9zdCBDb21wb25lbnQgQ29uZmlndXJhdGlvbgoKVGhlIGNvbXBvbmVudCBpdHNlbGYgaGFzIG1pbmltYWwgY29uZmlndXJhdGlvbi4gTWFuYWdlIGFubm91bmNlbWVudHMgYXQgKipDb21wb25lbnRzID4gTW9rb1dhYVNCYXNlKiogaW4gdGhlIEpvb21sYSBhZG1pbi4KCiMjIyBBbm5vdW5jZW1lbnQgRmllbGRzCgpFYWNoIGFubm91bmNlbWVudCBoYXM6Cgp8IEZpZWxkIHwgVHlwZSB8IERlc2NyaXB0aW9uIHwKfC0tLS0tLS18LS0tLS0tfC0tLS0tLS0tLS0tLS18CnwgKipUaXRsZSoqIHwgVGV4dCB8IEFubm91bmNlbWVudCBoZWFkbGluZSB8CnwgKipNZXNzYWdlKiogfCBUZXh0YXJlYSB8IEZ1bGwgYW5ub3VuY2VtZW50IGNvbnRlbnQgKHN1cHBvcnRzIGxpbmUgYnJlYWtzKSB8CnwgKipTdGF0dXMqKiB8IFB1Ymxpc2hlZC9VbnB1Ymxpc2hlZCB8IE9ubHkgcHVibGlzaGVkIGFubm91bmNlbWVudHMgYXBwZWFyIGluIEFQSSB8CnwgKipPcmRlcmluZyoqIHwgSW50ZWdlciB8IEN1c3RvbSBzb3J0IG9yZGVyIChkcmFnLWFuZC1kcm9wIGluIGxpc3QgdmlldykgfAoKIyMjIFBlcm1pc3Npb25zCgpDb25maWd1cmUgdmlhICoqQ29tcG9uZW50cyA+IE1va29XYWFTQmFzZSA+IE9wdGlvbnMgPiBQZXJtaXNzaW9ucyoqOgoKLSAqKkNyZWF0ZSoqOiBXaGljaCB1c2VyIGdyb3VwcyBjYW4gY3JlYXRlIG5ldyBhbm5vdW5jZW1lbnRzCi0gKipFZGl0Kio6IFdoaWNoIHVzZXIgZ3JvdXBzIGNhbiBlZGl0IGV4aXN0aW5nIGFubm91bmNlbWVudHMKLSAqKkRlbGV0ZSoqOiBXaGljaCB1c2VyIGdyb3VwcyBjYW4gZGVsZXRlIGFubm91bmNlbWVudHMKLSAqKk1hbmFnZSoqOiBXaGljaCB1c2VyIGdyb3VwcyBjYW4gYWNjZXNzIHRoZSBjb21wb25lbnQKCiMjIyBBUEkgRW5kcG9pbnQKClRoZSBKU09OIEFQSSBpcyBhdXRvbWF0aWNhbGx5IGF2YWlsYWJsZSBhdDoKCmBgYApodHRwczovL3lvdXItaG9zdC1zaXRlLmNvbS9pbmRleC5waHA/b3B0aW9uPWNvbV9tb2tvd2Fhc2Fubm91bmNlJnZpZXc9YXBpJmZvcm1hdD1qc29uCmBgYAoKUXVlcnkgcGFyYW1ldGVyczoKCnwgUGFyYW1ldGVyIHwgVmFsdWVzIHwgRGVmYXVsdCB8IERlc2NyaXB0aW9uIHwKfC0tLS0tLS0tLS0tfC0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tfAp8IGBsaW1pdGAgfCBJbnRlZ2VyIHwgNSB8IE1heGltdW0gYW5ub3VuY2VtZW50cyB0byByZXR1cm4gfAp8IGBvcmRlcmluZ2AgfCBgY3JlYXRlZGAsIGBvcmRlcmluZ2AgfCBgY3JlYXRlZGAgfCBTb3J0IGZpZWxkIHwKfCBgZGlyZWN0aW9uYCB8IGBBU0NgLCBgREVTQ2AgfCBgREVTQ2AgfCBTb3J0IGRpcmVjdGlvbiB8CgojIyBSZW1vdGUgTW9kdWxlIENvbmZpZ3VyYXRpb24KCkNvbmZpZ3VyZSBlYWNoIG1vZHVsZSBpbnN0YW5jZSBhdCAqKkV4dGVuc2lvbnMgPiBNb2R1bGVzKiogb24gdGhlIHJlbW90ZSBzaXRlLgoKIyMjIEJhc2ljIFRhYgoKfCBQYXJhbWV0ZXIgfCBUeXBlIHwgRGVmYXVsdCB8IFJlcXVpcmVkIHwgRGVzY3JpcHRpb24gfAp8LS0tLS0tLS0tLS18LS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS18CnwgKipIb3N0IFVSTCoqIChgaG9zdF91cmxgKSB8IFVSTCB8ICooZW1wdHkpKiB8IFllcyB8IEZ1bGwgVVJMIG9mIHRoZSBob3N0IHNpdGUgaW5jbHVkaW5nIHByb3RvY29sIChlLmcuLCBgaHR0cHM6Ly95b3VyLWhvc3Qtc2l0ZS5jb21gKSB8CnwgKipOdW1iZXIgb2YgQW5ub3VuY2VtZW50cyoqIChgY291bnRgKSB8IFRleHQvTnVtYmVyIHwgYDVgIHwgTm8gfCBIb3cgbWFueSBhbm5vdW5jZW1lbnRzIHRvIGRpc3BsYXkgfAp8ICoqT3JkZXJpbmcqKiAoYG9yZGVyaW5nYCkgfCBMaXN0IHwgYGNyZWF0ZWRgIHwgTm8gfCBTb3J0IGZpZWxkOiAiQnkgRGF0ZSAoTmV3ZXN0KSIgb3IgIkN1c3RvbSBPcmRlcmluZyIgfAp8ICoqRGlyZWN0aW9uKiogKGBkaXJlY3Rpb25gKSB8IExpc3QgfCBgREVTQ2AgfCBObyB8IFNvcnQgZGlyZWN0aW9uOiBEZXNjZW5kaW5nIG9yIEFzY2VuZGluZyB8CnwgKipTaG93IERhdGUqKiAoYHNob3dfZGF0ZWApIHwgUmFkaW8gKFllcy9ObykgfCBZZXMgfCBObyB8IFdoZXRoZXIgdG8gZGlzcGxheSB0aGUgY3JlYXRpb24gZGF0ZSB3aXRoIGVhY2ggYW5ub3VuY2VtZW50IHwKCiMjIyBBZHZhbmNlZCBUYWIKCnwgUGFyYW1ldGVyIHwgVHlwZSB8IERlZmF1bHQgfCBEZXNjcmlwdGlvbiB8CnwtLS0tLS0tLS0tLXwtLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tLS18CnwgKipBbHRlcm5hdGl2ZSBMYXlvdXQqKiAoYGxheW91dGApIHwgTW9kdWxlIExheW91dCB8ICooZGVmYXVsdCkqIHwgU2VsZWN0IGFuIGFsdGVybmF0aXZlIHRlbXBsYXRlIGxheW91dCB8CnwgKipNb2R1bGUgQ2xhc3MgU3VmZml4KiogKGBtb2R1bGVjbGFzc19zZnhgKSB8IFRleHQgfCAqKGVtcHR5KSogfCBDU1MgY2xhc3Mgc3VmZml4IGZvciBzdHlsaW5nIHwKfCAqKkNhY2hpbmcqKiAoYGNhY2hlYCkgfCBMaXN0IHwgVXNlIEdsb2JhbCB8IE1vZHVsZS1sZXZlbCBjYWNoZSB0b2dnbGUgfAp8ICoqQ2FjaGUgVGltZSoqIChgY2FjaGVfdGltZWApIHwgVGV4dCB8IGA5MDBgIHwgQ2FjaGUgZHVyYXRpb24gaW4gc2Vjb25kcyAoMTUgbWludXRlcykgfAoKIyMjIFN0YW5kYXJkIEpvb21sYSBNb2R1bGUgU2V0dGluZ3MKClRoZXNlIGFyZSBjb25maWd1cmVkIG9uIHRoZSBtb2R1bGUgZWRpdGluZyBwYWdlIGl0c2VsZjoKCnwgU2V0dGluZyB8IERlc2NyaXB0aW9uIHwKfC0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tfAp8ICoqVGl0bGUqKiB8IE1vZHVsZSB0aXRsZSBkaXNwbGF5ZWQgb24gdGhlIGZyb250ZW5kIHwKfCAqKlNob3cgVGl0bGUqKiB8IFdoZXRoZXIgdG8gZGlzcGxheSB0aGUgbW9kdWxlIHRpdGxlIHwKfCAqKlBvc2l0aW9uKiogfCBUZW1wbGF0ZSBwb3NpdGlvbiB3aGVyZSB0aGUgbW9kdWxlIGFwcGVhcnMgfAp8ICoqU3RhdHVzKiogfCBQdWJsaXNoZWQgb3IgVW5wdWJsaXNoZWQgfAp8ICoqQWNjZXNzKiogfCBXaGljaCBhY2Nlc3MgbGV2ZWxzIGNhbiBzZWUgdGhlIG1vZHVsZSB8CnwgKipNb2R1bGUgQXNzaWdubWVudCoqIHwgV2hpY2ggcGFnZXMgZGlzcGxheSB0aGUgbW9kdWxlIChBbGwsIE5vbmUsIHNwZWNpZmljIG1lbnUgaXRlbXMpIHwKCiMjIENhY2hpbmcgQmVoYXZpb3IKClRoZSBtb2R1bGUgaW1wbGVtZW50cyB0d28gbGV2ZWxzIG9mIGNhY2hpbmc6CgojIyMgMS4gSGVscGVyLUxldmVsIENhY2hlICgxNSBtaW51dGVzKQoKVGhlIGBoZWxwZXIucGhwYCBjYWNoZXMgdGhlIHJhdyBBUEkgcmVzcG9uc2UgdXNpbmcgSm9vbWxhJ3Mgb3V0cHV0IGNhY2hlOgoKYGBgcGhwCiRjYWNoZSA9IEpGYWN0b3J5OjpnZXRDYWNoZSgnbW9kX21va293YWFzYW5ub3VuY2UnLCAnb3V0cHV0Jyk7CmBgYAoKVGhlIGNhY2hlIGtleSBpcyBhbiBNRDUgaGFzaCBvZiB0aGUgZnVsbCBBUEkgVVJMLCBzbyBkaWZmZXJlbnQgY29uZmlndXJhdGlvbnMgKGRpZmZlcmVudCBsaW1pdCwgb3JkZXJpbmcsIGV0Yy4pIGFyZSBjYWNoZWQgc2VwYXJhdGVseS4KCiMjIyAyLiBNb2R1bGUtTGV2ZWwgQ2FjaGUgKGNvbmZpZ3VyYWJsZSkKClRoZSBKb29tbGEgbW9kdWxlIGZyYW1ld29yayBwcm92aWRlcyBhZGRpdGlvbmFsIGNhY2hpbmcgdmlhIHRoZSBBZHZhbmNlZCB0YWIgc2V0dGluZ3MuIFRoZSBkZWZhdWx0IGBjYWNoZV90aW1lYCBvZiA5MDAgc2Vjb25kcyAoMTUgbWludXRlcykgY29udHJvbHMgaG93IG9mdGVuIHRoZSBtb2R1bGUgb3V0cHV0IEhUTUwgaXMgcmVnZW5lcmF0ZWQuCgojIyMgQ2FjaGUgQ2xlYXJpbmcKClRvIGZvcmNlIGFuIGltbWVkaWF0ZSB1cGRhdGUgYWZ0ZXIgY2hhbmdpbmcgYW5ub3VuY2VtZW50cyBvbiB0aGUgaG9zdDoKCjEuIE9uIHRoZSByZW1vdGUgc2l0ZTogKipTeXN0ZW0gPiBDbGVhciBDYWNoZSoqCjIuIE9yIHdhaXQgZm9yIHRoZSBjYWNoZSB0byBleHBpcmUgbmF0dXJhbGx5ICgxNSBtaW51dGVzKQoKIyMgRXhhbXBsZSBDb25maWd1cmF0aW9uCgpGb3IgYSB0eXBpY2FsIHNldHVwIGRpc3BsYXlpbmcgdGhlIDMgbW9zdCByZWNlbnQgYW5ub3VuY2VtZW50cyB3aXRoIGRhdGVzOgoKfCBTZXR0aW5nIHwgVmFsdWUgfAp8LS0tLS0tLS0tfC0tLS0tLS18CnwgSG9zdCBVUkwgfCBgaHR0cHM6Ly9jZW50cmFsLmV4YW1wbGUuY29tYCB8CnwgTnVtYmVyIG9mIEFubm91bmNlbWVudHMgfCBgM2AgfAp8IE9yZGVyaW5nIHwgQnkgRGF0ZSAoTmV3ZXN0KSB8CnwgRGlyZWN0aW9uIHwgRGVzY2VuZGluZyB8CnwgU2hvdyBEYXRlIHwgWWVzIHwKfCBDYWNoZSBUaW1lIHwgYDkwMGAgfAoKLS0tCgoKLS0tCgoqUmVwbzogW01va29XYWFTQmFzZV0oaHR0cHM6Ly9naXQubW9rb2NvbnN1bHRpbmcudGVjaC9Nb2tvQ29uc3VsdGluZy9Nb2tvV2FhU0Jhc2UpIMK3IFtNb2tvU3RhbmRhcmRzXShodHRwczovL2dpdC5tb2tvY29uc3VsdGluZy50ZWNoL01va29Db25zdWx0aW5nL21va29wbGF0Zm9ybS93aWtpL0hvbWUpKgoKfCBSZXZpc2lvbiB8IERhdGUgfCBBdXRob3IgfCBEZXNjcmlwdGlvbiB8CnwtLS18LS0tfC0tLXwtLS18CnwgMS4wIHwgMjAyNi0wNS0wOSB8IE1va28gQ29uc3VsdGluZyB8IEluaXRpYWwgdmVyc2lvbiB8Cg==",
"guides/Contributing": "W+KGkCBCYWNrIHRvIEhvbWVdKEhvbWUpCgojIENvbnRyaWJ1dGluZyB0byBNb2tvIENvbnN1bHRpbmcgUHJvamVjdHMKClRoYW5rIHlvdSBmb3IgeW91ciBpbnRlcmVzdCBpbiBjb250cmlidXRpbmcuIEFsbCBNb2tvIENvbnN1bHRpbmcgcmVwb3NpdG9yaWVzIGZvbGxvdyB0aGlzIHVuaXZlcnNhbCB3b3JrZmxvdyBhbmQgdmVyc2lvbiBwb2xpY3kuCgojIyBCcmFuY2hpbmcgV29ya2Zsb3cKCmBgYApmZWF0dXJlLyog4pSA4pSAUFLilIDilIA+IGRldiDilIDilIBkcmFmdCBQUuKUgOKUgD4gKHJlbmFtZWQgdG8gcmMpIOKUgOKUgG1lcmdl4pSA4pSAPiBtYWluCmBgYAoKIyMjIFN0ZXAgYnkgc3RlcAoKMS4gKipDcmVhdGUgYSBmZWF0dXJlIGJyYW5jaCoqIGZyb20gYGRldmA6CiAgIGBgYGJhc2gKICAgZ2l0IGNoZWNrb3V0IGRldiAmJiBnaXQgcHVsbAogICBnaXQgY2hlY2tvdXQgLWIgZmVhdHVyZS9teS1jaGFuZ2UKICAgYGBgCgoyLiAqKldvcmsgYW5kIGNvbW1pdCoqIG9uIHlvdXIgZmVhdHVyZSBicmFuY2guIFB1c2ggdG8gb3JpZ2luLgoKMy4gKipPcGVuIGEgUFIqKjogYGZlYXR1cmUvbXktY2hhbmdlYCDihpIgYGRldmAuIEFmdGVyIHJldmlldyBhbmQgY2hlY2tzLCBtZXJnZSBpdC4KCjQuICoqV2hlbiByZWFkeSBmb3IgcmVsZWFzZSoqLCBvcGVuIGEgKipkcmFmdCBQUioqOiBgZGV2YCDihpIgYG1haW5gLgogICAtIFRoaXMgYXV0b21hdGljYWxseSByZW5hbWVzIHRoZSBzb3VyY2UgYnJhbmNoIHRvIGByY2AgKHJlbGVhc2UgY2FuZGlkYXRlKQogICAtIEFuIFJDIHByZS1yZWxlYXNlIGlzIGJ1aWx0IGFuZCB1cGxvYWRlZAoKNS4gKipBbHBoYSBhbmQgYmV0YSBicmFuY2hlcyoqIGFyZSBjcmVhdGVkIGJ5IG1hbnVhbGx5IHJlbmFtaW5nIHRoZSBicmFuY2ggYmVmb3JlIHRoZSBSQyBzdGFnZToKICAgLSBSZW5hbWUgYGRldmAgdG8gYGFscGhhYCBmb3IgZWFybHkgdGVzdGluZyDihpIgYWxwaGEgcHJlLXJlbGVhc2UgaXMgYnVpbHQKICAgLSBSZW5hbWUgYGFscGhhYCB0byBgYmV0YWAgZm9yIGZlYXR1cmUtY29tcGxldGUgdGVzdGluZyDihpIgYmV0YSBwcmUtcmVsZWFzZSBpcyBidWlsdAogICAtIFdoZW4gdGhlIGRyYWZ0IFBSIGlzIGNyZWF0ZWQsIHRoZSBicmFuY2ggaXMgcmVuYW1lZCB0byBgcmNgCgo2LiAqKk9uY2UgUFIgY2hlY2tzIHBhc3MqKiBvbiB0aGUgYHJjYCBicmFuY2gsIG1hcmsgdGhlIFBSIGFzIHJlYWR5IGFuZCBtZXJnZSB0byBgbWFpbmAuCgo3LiAqKk1lcmdpbmcgdG8gbWFpbioqIHRyaWdnZXJzIHRoZSBzdGFibGUgcmVsZWFzZSBwaXBlbGluZToKICAgLSBNaW5vciB2ZXJzaW9uIGJ1bXAgKGUuZy4sIGAwMi4wOS54eGAg4oaSIGAwMi4xMC4wMGApCiAgIC0gU3RhYmlsaXR5IHN1ZmZpeCBzdHJpcHBlZCAoY2xlYW4gdmVyc2lvbikKICAgLSBNb2tvR2l0ZWEgcmVsZWFzZSBjcmVhdGVkIHdpdGggWklQL3Rhci5neiBwYWNrYWdlcwogICAtIGB1cGRhdGVzLnhtbGAgdXBkYXRlZCAoSm9vbWxhIGV4dGVuc2lvbnMpCiAgIC0gYGRldmAgYnJhbmNoIHJlY3JlYXRlZCBmcm9tIGBtYWluYAoKIyMjIEJyYW5jaCBzdW1tYXJ5Cgp8IEJyYW5jaCB8IFB1cnBvc2UgfCBDcmVhdGVkIGJ5IHwKfC0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLXwKfCBgZmVhdHVyZS8qYCB8IE5ldyBmZWF0dXJlcyBhbmQgZml4ZXMgfCBEZXZlbG9wZXIgfAp8IGBkZXZgIHwgSW50ZWdyYXRpb24gYnJhbmNoIHwgQXV0by1yZWNyZWF0ZWQgYWZ0ZXIgcmVsZWFzZSB8CnwgYGFscGhhYCB8IEFscGhhIHByZS1yZWxlYXNlIHRlc3RpbmcgfCBNYW51YWwgcmVuYW1lIGZyb20gYGRldmAgfAp8IGBiZXRhYCB8IEJldGEgcHJlLXJlbGVhc2UgdGVzdGluZyB8IE1hbnVhbCByZW5hbWUgZnJvbSBgYWxwaGFgIHwKfCBgcmNgIHwgUmVsZWFzZSBjYW5kaWRhdGUgfCBBdXRvLXJlbmFtZWQgb24gZHJhZnQgUFIgdG8gbWFpbiB8CnwgYG1haW5gIHwgU3RhYmxlIHJlbGVhc2VzIHwgUHJvdGVjdGVkLCBtZXJnZSBvbmx5IHwKfCBgdmVyc2lvbi9YWC5ZWS5aWmAgfCBBcmNoaXZlZCByZWxlYXNlIHNuYXBzaG90cyB8IEF1dG8tY3JlYXRlZCBieSBDSSB8CgojIyMgUHJvdGVjdGVkIGJyYW5jaGVzCgp8IEJyYW5jaCB8IERpcmVjdCBwdXNoIHwgTWVyZ2UgdmlhIHwKfC0tLS0tLS0tfC0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwKfCBgbWFpbmAgfCBCbG9ja2VkIChDSSBib3Qgd2hpdGVsaXN0ZWQpIHwgUFIgbWVyZ2Ugb25seSB8CnwgYGRldmAgfCBCbG9ja2VkIChDSSBib3Qgd2hpdGVsaXN0ZWQpIHwgUFIgbWVyZ2UgZnJvbSBmZWF0dXJlLyogfAp8IGByY2AgfCBCbG9ja2VkIChDSSBib3Qgd2hpdGVsaXN0ZWQpIHwgQXV0by1jcmVhdGVkIG9uIGRyYWZ0IFBSIHwKfCBgYWxwaGFgIHwgQmxvY2tlZCAoQ0kgYm90IHdoaXRlbGlzdGVkKSB8IE1hbnVhbCByZW5hbWUgfAp8IGBiZXRhYCB8IEJsb2NrZWQgKENJIGJvdCB3aGl0ZWxpc3RlZCkgfCBNYW51YWwgcmVuYW1lIHwKfCBgZmVhdHVyZS8qYCB8IE9wZW4gfCBOL0EgKHNvdXJjZSBicmFuY2gpIHwKCiMjIFZlcnNpb24gUG9saWN5CgojIyMgRm9ybWF0CgpBbGwgdmVyc2lvbnMgdXNlIGBYWC5ZWS5aWmAg4oCUIHRocmVlIHR3by1kaWdpdCBzZWdtZW50cywgemVyby1wYWRkZWQ6CgotICoqWFgqKiDigJQgTWFqb3IgdmVyc2lvbiAoYnJlYWtpbmcgY2hhbmdlcykKLSAqKllZKiog4oCUIE1pbm9yIHZlcnNpb24gKG5ldyBmZWF0dXJlcywgYnVtcGVkIG9uIHJlbGVhc2UgdG8gbWFpbikKLSAqKlpaKiog4oCUIFBhdGNoIHZlcnNpb24gKGF1dG8taW5jcmVtZW50ZWQgb24gZXZlcnkgcHVzaCB0byBkZXYvZmVhdHVyZSBicmFuY2hlcykKClJvbGxvdmVyOiBwYXRjaCBgOTlgIOKGkiBgMDBgIGluY3JlbWVudHMgbWlub3I7IG1pbm9yIGA5OWAg4oaSIGAwMGAgaW5jcmVtZW50cyBtYWpvci4KCiMjIyBTdGFiaWxpdHkgc3VmZml4ZXMKCkVhY2ggYnJhbmNoIGFwcGVuZHMgYSBzdWZmaXggdG8gaW5kaWNhdGUgc3RhYmlsaXR5OgoKfCBCcmFuY2ggfCBTdWZmaXggfCBFeGFtcGxlIHwKfC0tLS0tLS0tfC0tLS0tLS0tfC0tLS0tLS0tLXwKfCBgbWFpbmAgfCAobm9uZSkgfCBgMDIuMDkuMDBgIHwKfCBgZGV2YCB8IGAtZGV2YCB8IGAwMi4wOS4wMS1kZXZgIHwKfCBgZmVhdHVyZS8qYCB8IGAtZGV2YCB8IGAwMi4wOS4wMS1kZXZgIHwKfCBgYWxwaGFgIHwgYC1hbHBoYWAgfCBgMDIuMDkuMDEtYWxwaGFgIHwKfCBgYmV0YWAgfCBgLWJldGFgIHwgYDAyLjA5LjAxLWJldGFgIHwKfCBgcmNgIHwgYC1yY2AgfCBgMDIuMDkuMDEtcmNgIHwKCiMjIENvZGUgU3RhbmRhcmRzCgotICoqUEhQKio6IFBTUi0xMiwgdGFicyBmb3IgaW5kZW50YXRpb24KLSAqKkNvcHlyaWdodCoqOiBhbGwgZmlsZXMgbXVzdCBpbmNsdWRlIHRoZSBNb2tvIENvbnN1bHRpbmcgY29weXJpZ2h0IGhlYWRlcgotICoqTGljZW5zZSoqOiBTUERYIGlkZW50aWZpZXIgYEdQTC0zLjAtb3ItbGF0ZXJgIChvciBhcyBzcGVjaWZpZWQgcGVyIHJlcG8pCi0gKipBdHRyaWJ1dGlvbioqOiB1c2UgYEF1dGhvcmVkLWJ5OiBNb2tvIENvbnN1bHRpbmdgIGluIGNvbW1pdHMsIG5vdCBpbmRpdmlkdWFsIG5hbWVzCgojIyBDb21taXQgTWVzc2FnZXMKClVzZSBjb252ZW50aW9uYWwgY29tbWl0IGZvcm1hdDoKCmBgYAp0eXBlKHNjb3BlKTogc2hvcnQgZGVzY3JpcHRpb24KCk9wdGlvbmFsIGJvZHkgd2l0aCBjb250ZXh0LgoKQXV0aG9yZWQtYnk6IE1va28gQ29uc3VsdGluZwpgYGAKClR5cGVzOiBgZmVhdGAsIGBmaXhgLCBgY2hvcmVgLCBgZG9jc2AsIGBzdHlsZWAsIGByZWZhY3RvcmAsIGB0ZXN0YCwgYGNpYAoKU3BlY2lhbCBmbGFncyBpbiBjb21taXQgbWVzc2FnZXM6Ci0gYFtza2lwIGNpXWAg4oCUIHNraXAgYWxsIENJIHdvcmtmbG93cwotIGBbc2tpcCBidW1wXWAg4oCUIHNraXAgYXV0byB2ZXJzaW9uIGJ1bXAgb25seQoKIyMgUmVwb3J0aW5nIElzc3VlcwoKVXNlIHRoZSByZXBvc2l0b3J5J3MgaXNzdWUgdHJhY2tlciB3aXRoIHRoZSBhcHByb3ByaWF0ZSB0ZW1wbGF0ZS4KCi0tLQoKKlJlcG86IFtNb2tvV2FhU0Jhc2VdKGh0dHBzOi8vZ2l0Lm1va29jb25zdWx0aW5nLnRlY2gvTW9rb0NvbnN1bHRpbmcvTW9rb1dhYVNCYXNlKSDCtyBbTW9rb1N0YW5kYXJkc10oaHR0cHM6Ly9naXQubW9rb2NvbnN1bHRpbmcudGVjaC9Nb2tvQ29uc3VsdGluZy9tb2tvcGxhdGZvcm0vd2lraS9Ib21lKSoKCnwgUmV2aXNpb24gfCBEYXRlIHwgQXV0aG9yIHwgRGVzY3JpcHRpb24gfAp8LS0tfC0tLXwtLS18LS0tfAp8IDEuMCB8IDIwMjYtMDYtMDYgfCBNb2tvIENvbnN1bHRpbmcgfCBJbml0aWFsIHZlcnNpb24gZnJvbSBUZW1wbGF0ZS1Kb29tbGEgfAo=",
"guides/Installation": "W+KGkCBCYWNrIHRvIEhvbWVdKEhvbWUpCgojIEluc3RhbGxhdGlvbgoKTW9rb1dhYVNCYXNlIHVzZXMgYSB0d28tcGFydCBpbnN0YWxsYXRpb246IHRoZSAqKmNvbXBvbmVudCoqIG9uIHRoZSBob3N0IHNpdGUgYW5kIHRoZSAqKm1vZHVsZSoqIG9uIHJlbW90ZSBzaXRlcy4KCiMjIFJlcXVpcmVtZW50cwoKfCBSZXF1aXJlbWVudCB8IE1pbmltdW0gfAp8LS0tfC0tLXwKfCAqKkpvb21sYSoqIHwgMy54IG9yIGxhdGVyIHwKfCAqKlBIUCoqIHwgNS42IG9yIGxhdGVyIHwKfCAqKk15U1FMKiogfCA1LjUgb3IgbGF0ZXIgKGhvc3Qgc2l0ZSBvbmx5KSB8CnwgKipOZXR3b3JrKiogfCBSZW1vdGUgc2l0ZXMgbXVzdCBiZSBhYmxlIHRvIHJlYWNoIHRoZSBob3N0IHNpdGUgdmlhIEhUVFAvSFRUUFMgfAoKIyMgUGFydCAxOiBIb3N0IFNpdGUgKENvbXBvbmVudCkKCkluc3RhbGwgdGhlIGNvbXBvbmVudCBvbiB0aGUgKipvbmUgY2VudHJhbCBzaXRlKiogd2hlcmUgYW5ub3VuY2VtZW50cyB3aWxsIGJlIG1hbmFnZWQuCgojIyMgUGFja2FnZSB0aGUgQ29tcG9uZW50CgpgYGBiYXNoCmNkIHNyYy8KemlwIC1yIGNvbV9tb2tvd2Fhc2Fubm91bmNlLnppcCBjb21fbW9rb3dhYXNhbm5vdW5jZS8KYGBgCgojIyMgSW5zdGFsbCB2aWEgSm9vbWxhIEFkbWluCgoxLiBMb2cgaW4gdG8gdGhlIEpvb21sYSBhZG1pbmlzdHJhdG9yIHBhbmVsCjIuIE5hdmlnYXRlIHRvICoqRXh0ZW5zaW9ucyA+IE1hbmFnZSA+IEluc3RhbGwqKgozLiBDbGljayAqKlVwbG9hZCBQYWNrYWdlIEZpbGUqKgo0LiBTZWxlY3QgYGNvbV9tb2tvd2Fhc2Fubm91bmNlLnppcGAgYW5kIGNsaWNrICoqVXBsb2FkICYgSW5zdGFsbCoqCgojIyMgVmVyaWZ5IEluc3RhbGxhdGlvbgoKMS4gR28gdG8gKipDb21wb25lbnRzKiogaW4gdGhlIGFkbWluIG1lbnUKMi4gQ2xpY2sgKipNb2tvV2FhU0Jhc2UqKiB0byBvcGVuIHRoZSBtYW5hZ2VtZW50IGludGVyZmFjZQozLiBUZXN0IHRoZSBBUEkgZW5kcG9pbnQgaW4geW91ciBicm93c2VyOgoKYGBgCmh0dHBzOi8veW91ci1ob3N0LXNpdGUuY29tL2luZGV4LnBocD9vcHRpb249Y29tX21va293YWFzYW5ub3VuY2Umdmlldz1hcGkmZm9ybWF0PWpzb24KYGBgCgpFeHBlY3RlZCByZXNwb25zZSAoZW1wdHkgYXQgZmlyc3QpOgoKYGBganNvbgp7CiAgInN1Y2Nlc3MiOiB0cnVlLAogICJjb3VudCI6IDAsCiAgImFubm91bmNlbWVudHMiOiBbXQp9CmBgYAoKU2F2ZSB0aGlzIFVSTCAtLSByZW1vdGUgbW9kdWxlcyB3aWxsIG5lZWQgaXQuCgojIyMgQ29uZmlndXJlIFBlcm1pc3Npb25zIChPcHRpb25hbCkKCjEuIEdvIHRvICoqQ29tcG9uZW50cyA+IE1va29XYWFTQmFzZSA+IE9wdGlvbnMgPiBQZXJtaXNzaW9ucyoqCjIuIENvbmZpZ3VyZSB3aGljaCB1c2VyIGdyb3VwcyBjYW4gY3JlYXRlLCBlZGl0LCBkZWxldGUsIGFuZCBtYW5hZ2UgYW5ub3VuY2VtZW50cwoKIyMgUGFydCAyOiBSZW1vdGUgU2l0ZXMgKE1vZHVsZSkKCkluc3RhbGwgdGhlIG1vZHVsZSBvbiAqKmVhY2ggc2l0ZSoqIHRoYXQgc2hvdWxkIGRpc3BsYXkgYW5ub3VuY2VtZW50cyBmcm9tIHRoZSBob3N0LgoKIyMjIFBhY2thZ2UgdGhlIE1vZHVsZQoKYGBgYmFzaApjZCBzcmMvCnppcCAtciBtb2RfbW9rb3dhYXNhbm5vdW5jZS56aXAgbW9kX21va293YWFzYW5ub3VuY2UvCmBgYAoKIyMjIEluc3RhbGwgdmlhIEpvb21sYSBBZG1pbgoKMS4gTG9nIGluIHRvIHRoZSByZW1vdGUgc2l0ZSdzIEpvb21sYSBhZG1pbgoyLiBOYXZpZ2F0ZSB0byAqKkV4dGVuc2lvbnMgPiBNYW5hZ2UgPiBJbnN0YWxsKioKMy4gVXBsb2FkIGBtb2RfbW9rb3dhYXNhbm5vdW5jZS56aXBgCgojIyMgQ3JlYXRlIGEgTW9kdWxlIEluc3RhbmNlCgoxLiBHbyB0byAqKkV4dGVuc2lvbnMgPiBNb2R1bGVzID4gTmV3KioKMi4gU2VsZWN0ICoqTW9rb1dhYVNCYXNlKioKMy4gQ29uZmlndXJlOgoKfCBTZXR0aW5nIHwgVmFsdWUgfAp8LS0tLS0tLS0tfC0tLS0tLS18CnwgKipUaXRsZSoqIHwgZS5nLiwgIkxhdGVzdCBBbm5vdW5jZW1lbnRzIiB8CnwgKipQb3NpdGlvbioqIHwgU2VsZWN0IGEgdGVtcGxhdGUgcG9zaXRpb24gfAp8ICoqU3RhdHVzKiogfCBQdWJsaXNoZWQgfAp8ICoqSG9zdCBVUkwqKiB8IGBodHRwczovL3lvdXItaG9zdC1zaXRlLmNvbWAgKHRoZSBzaXRlIHdoZXJlIHRoZSBjb21wb25lbnQgaXMgaW5zdGFsbGVkKSB8Cgo0LiBBZGp1c3QgZGlzcGxheSBvcHRpb25zIChzZWUgW0NvbmZpZ3VyYXRpb25dKENvbmZpZ3VyYXRpb24pKQo1LiBTZXQgbW9kdWxlIGFzc2lnbm1lbnQgKHdoaWNoIHBhZ2VzIHNob3cgdGhlIG1vZHVsZSkKNi4gQ2xpY2sgKipTYXZlICYgQ2xvc2UqKgoKIyMjIFZlcmlmeSB0aGUgTW9kdWxlCgoxLiBWaXNpdCB0aGUgcmVtb3RlIHNpdGUncyBmcm9udGVuZAoyLiBOYXZpZ2F0ZSB0byBhIHBhZ2Ugd2hlcmUgdGhlIG1vZHVsZSBpcyBhc3NpZ25lZAozLiBBbm5vdW5jZW1lbnRzIGZyb20gdGhlIGhvc3Qgc2hvdWxkIGFwcGVhcgoKIyMgQWx0ZXJuYXRpdmUgSW5zdGFsbGF0aW9uOiBEaXJlY3RvcnkgVXBsb2FkCgpJZiB5b3UgaGF2ZSBGVFAvU1NIIGFjY2VzczoKCjEuIFVwbG9hZCBgY29tX21va293YWFzYW5ub3VuY2UvYCB0byBgL2FkbWluaXN0cmF0b3IvY29tcG9uZW50cy9jb21fbW9rb3dhYXNhbm5vdW5jZS9gCjIuIFVwbG9hZCBgbW9kX21va293YWFzYW5ub3VuY2UvYCB0byBgL21vZHVsZXMvbW9kX21va293YWFzYW5ub3VuY2UvYAozLiBJbiBKb29tbGEgYWRtaW46ICoqRXh0ZW5zaW9ucyA+IE1hbmFnZSA+IERpc2NvdmVyID4gRGlzY292ZXIgPiBJbnN0YWxsKioKCiMjIENyZWF0aW5nIFlvdXIgRmlyc3QgQW5ub3VuY2VtZW50CgoxLiBPbiB0aGUgKipob3N0IHNpdGUqKiwgZ28gdG8gKipDb21wb25lbnRzID4gTW9rb1dhYVNCYXNlKioKMi4gQ2xpY2sgKipOZXcqKgozLiBFbnRlciBhIHRpdGxlIGFuZCBtZXNzYWdlCjQuIFNldCBzdGF0dXMgdG8gKipQdWJsaXNoZWQqKgo1LiBDbGljayAqKlNhdmUgJiBDbG9zZSoqCgpUaGUgYW5ub3VuY2VtZW50IHdpbGwgYXBwZWFyIG9uIHJlbW90ZSBzaXRlcyB3aXRoaW4gMTUgbWludXRlcyAodGhlIGRlZmF1bHQgY2FjaGUgZHVyYXRpb24pLgoKIyMgVW5pbnN0YWxsYXRpb24KCiMjIyBSZW1vdmUgdGhlIE1vZHVsZSAoUmVtb3RlIFNpdGVzKQoKMS4gKipFeHRlbnNpb25zID4gTWFuYWdlID4gTWFuYWdlKiogPiBzZWFyY2ggIk1va29XYWFTQmFzZSIgPiBzZWxlY3QgbW9kdWxlID4gKipVbmluc3RhbGwqKgoKIyMjIFJlbW92ZSB0aGUgQ29tcG9uZW50IChIb3N0IFNpdGUpCgoxLiAqKkV4dGVuc2lvbnMgPiBNYW5hZ2UgPiBNYW5hZ2UqKiA+IHNlYXJjaCAiTW9rb1dhYVNCYXNlIiA+IHNlbGVjdCBjb21wb25lbnQgPiAqKlVuaW5zdGFsbCoqCgpXYXJuaW5nOiBVbmluc3RhbGxpbmcgdGhlIGNvbXBvbmVudCBkZWxldGVzIHRoZSBgI19fbW9rb3dhYXNhbm5vdW5jZWAgZGF0YWJhc2UgdGFibGUgYW5kIGFsbCBhbm5vdW5jZW1lbnQgZGF0YS4gQmFjayB1cCBmaXJzdCBpZiBuZWVkZWQuCgojIyBUcm91Ymxlc2hvb3RpbmcKCnwgUHJvYmxlbSB8IFNvbHV0aW9uIHwKfC0tLS0tLS0tLXwtLS0tLS0tLS0tfAp8IENvbXBvbmVudCBub3QgYXBwZWFyaW5nIHwgQ2xlYXIgSm9vbWxhIGNhY2hlOyBjaGVjayB1c2VyIHBlcm1pc3Npb25zIHwKfCBNb2R1bGUgc2hvd3Mgbm8gYW5ub3VuY2VtZW50cyB8IFZlcmlmeSBIb3N0IFVSTCBpbmNsdWRlcyBwcm90b2NvbCAoYGh0dHBzOi8vYCk7IGNoZWNrIHRoYXQgYW5ub3VuY2VtZW50cyBhcmUgcHVibGlzaGVkIG9uIGhvc3QgfAp8IENvbm5lY3Rpb24gZXJyb3JzIHwgVmVyaWZ5IGhvc3QgaXMgcHVibGljbHkgYWNjZXNzaWJsZTsgY2hlY2sgZmlyZXdhbGwgcnVsZXM7IGVuc3VyZSBgYWxsb3dfdXJsX2ZvcGVuYCBvciBjVVJMIGlzIGVuYWJsZWQgfAp8IERhdGFiYXNlIGVycm9ycyAoaG9zdCkgfCBDaGVjayBNeVNRTCBpcyBydW5uaW5nOyB2ZXJpZnkgYENSRUFURSBUQUJMRWAgcGVybWlzc2lvbnMgfAoKLS0tCgoKLS0tCgoqUmVwbzogW01va29XYWFTQmFzZV0oaHR0cHM6Ly9naXQubW9rb2NvbnN1bHRpbmcudGVjaC9Nb2tvQ29uc3VsdGluZy9Nb2tvV2FhU0Jhc2UpIMK3IFtNb2tvU3RhbmRhcmRzXShodHRwczovL2dpdC5tb2tvY29uc3VsdGluZy50ZWNoL01va29Db25zdWx0aW5nL21va29wbGF0Zm9ybS93aWtpL0hvbWUpKgoKfCBSZXZpc2lvbiB8IERhdGUgfCBBdXRob3IgfCBEZXNjcmlwdGlvbiB8CnwtLS18LS0tfC0tLXwtLS18CnwgMS4wIHwgMjAyNi0wNS0wOSB8IE1va28gQ29uc3VsdGluZyB8IEluaXRpYWwgdmVyc2lvbiB8Cg==",
"reference/Architecture": "W+KGkCBCYWNrIHRvIEhvbWVdKEhvbWUpCgojIEFyY2hpdGVjdHVyZQoKTW9rb1dhYVNCYXNlIHVzZXMgYSBkaXN0cmlidXRlZCBjbGllbnQtc2VydmVyIGFyY2hpdGVjdHVyZSB3aGVyZSBvbmUgaG9zdCBzaXRlIG1hbmFnZXMgYW5ub3VuY2VtZW50cyBhbmQgYW55IG51bWJlciBvZiByZW1vdGUgc2l0ZXMgZmV0Y2ggYW5kIGRpc3BsYXkgdGhlbSB2aWEgYSBKU09OIEFQSS4KCiMjIFN5c3RlbSBEaWFncmFtCgpgYGAK4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQCuKUgiAgICAgICAgIEhvc3QgSm9vbWxhIFNpdGUgICAgICAgICAgICAg4pSCCuKUgiAgKENlbnRyYWwgTWFuYWdlbWVudCkgICAgICAgICAgICAgICDilIIK4pSCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilIIK4pSCICDilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJAgICAg4pSCCuKUgiAg4pSCICBjb21fbW9rb3dhYXNhbm5vdW5jZSAgICAgICDilIIgICAg4pSCCuKUgiAg4pSCICAoQWRtaW4gQ29tcG9uZW50KSAgICAgICAgICDilIIgICAg4pSCCuKUgiAg4pSCICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilIIgICAg4pSCCuKUgiAg4pSCICAtIENSVUQgZm9yIGFubm91bmNlbWVudHMgICDilIIgICAg4pSCCuKUgiAg4pSCICAtIERhdGFiYXNlIHN0b3JhZ2UgICAgICAgICDilIIgICAg4pSCCuKUgiAg4pSCICAtIEpTT04gQVBJIGVuZHBvaW50ICAgICAgICDilIIgICAg4pSCCuKUgiAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYICAgIOKUggrilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilKzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJgKICAgICAgICAgICAgICAgIOKUgiAgICAgICAgICAgICAg4pSCCiAgICAgICAgICAgICAgIOKUgiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgIOKUggogICAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUtOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUrOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkAogICAgIOKUgiAgICAgICAgICAgICAgICAgICDilIIgICAgICAgICAgICAgIOKUggogICAgIOKWvCAgICAgICAgICAgICAgICAgICDilrwgICAgICAgICAgICAgIOKWvArilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJAgICAgICAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkCAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkArilIIgUmVtb3RlIDEg4pSCICAgICAgICDilIIgUmVtb3RlIDIg4pSCICAg4pSCIFJlbW90ZSBOIOKUggrilIIgICAgICAgICAg4pSCICAgICAgICDilIIgICAgICAgICAg4pSCICAg4pSCICAgICAgICAgIOKUggrilIIgbW9kX2FubiAg4pSCICAgICAgICDilIIgbW9kX2FubiAg4pSCICAg4pSCIG1vZF9hbm4gIOKUggrilIIgKEZldGNoICAg4pSCICAgICAgICDilIIgKEZldGNoICAg4pSCICAg4pSCIChGZXRjaCAgIOKUggrilIIgJiBDYWNoZSAg4pSCICAgICAgICDilIIgJiBDYWNoZSAg4pSCICAg4pSCICYgQ2FjaGUgIOKUggrilIIgJiBEaXNwbGF54pSCICAgICAgICDilIIgJiBEaXNwbGF54pSCICAg4pSCICYgRGlzcGxheeKUggrilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJggICAgICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmCAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmApgYGAKCiMjIEhvc3QgU2l0ZSBDb21wb25lbnRzCgpUaGUgaG9zdCBzaXRlIHJ1bnMgYGNvbV9tb2tvd2Fhc2Fubm91bmNlYCBhcyBhbiBhZG1pbi1vbmx5IGNvbXBvbmVudC4gTm8gbW9kdWxlIGlzIG5lZWRlZCBvbiB0aGUgaG9zdC4KCiMjIyBEaXJlY3RvcnkgU3RydWN0dXJlCgpgYGAKY29tX21va293YWFzYW5ub3VuY2UvCuKUnOKUgOKUgCBtb2tvd2Fhc2Fubm91bmNlLnhtbCAgICAgICAjIENvbXBvbmVudCBtYW5pZmVzdArilJzilIDilIAgYWRtaW4vCuKUgiAgIOKUnOKUgOKUgCBtb2tvd2Fhc2Fubm91bmNlLnBocCAgICMgQWRtaW4gZW50cnkgcG9pbnQK4pSCICAg4pSc4pSA4pSAIGNvbnRyb2xsZXIucGhwICAgICAgICAgIyBNYWluIGNvbnRyb2xsZXIK4pSCICAg4pSc4pSA4pSAIGNvbmZpZy54bWwgICAgICAgICAgICAgIyBDb21wb25lbnQgY29uZmlndXJhdGlvbgrilIIgICDilJzilIDilIAgY29udHJvbGxlcnMvCuKUgiAgIOKUgiAgIOKUlOKUgOKUgCBhbm5vdW5jZW1lbnQucGhwICAgIyBTaW5nbGUgYW5ub3VuY2VtZW50IGNvbnRyb2xsZXIK4pSCICAg4pSc4pSA4pSAIG1vZGVscy8K4pSCICAg4pSCICAg4pSc4pSA4pSAIGFubm91bmNlbWVudC5waHAgICAjIFNpbmdsZSBhbm5vdW5jZW1lbnQgbW9kZWwK4pSCICAg4pSCICAg4pSc4pSA4pSAIGFubm91bmNlbWVudHMucGhwICAjIExpc3QgbW9kZWwK4pSCICAg4pSCICAg4pSU4pSA4pSAIGZvcm1zLwrilIIgICDilIIgICAgICAgIOKUlOKUgOKUgCBhbm5vdW5jZW1lbnQueG1sICAjIEVkaXQgZm9ybSBkZWZpbml0aW9uCuKUgiAgIOKUnOKUgOKUgCB2aWV3cy8gICAgICAgICAgICAgICAgICMgQWRtaW4gdmlldyB0ZW1wbGF0ZXMK4pSCICAg4pSc4pSA4pSAIHRhYmxlcy8K4pSCICAg4pSCICAg4pSU4pSA4pSAIGFubm91bmNlbWVudC5waHAgICAjIERhdGFiYXNlIHRhYmxlIGNsYXNzCuKUgiAgIOKUnOKUgOKUgCBoZWxwZXJzLwrilIIgICDilIIgICDilJTilIDilIAgYW5ub3VuY2VtZW50cy5waHAgICMgU3VibWVudSBhbmQgcGVybWlzc2lvbiBoZWxwZXJzCuKUgiAgIOKUnOKUgOKUgCBzcWwvICAgICAgICAgICAgICAgICAgICMgSW5zdGFsbC91bmluc3RhbGwgU1FMIHNjcmlwdHMK4pSCICAg4pSU4pSA4pSAIGxhbmd1YWdlLwrilIIgICAgICAgIOKUlOKUgOKUgCBlbi1HQi8gICAgICAgICAgICAgIyBMYW5ndWFnZSBmaWxlcwrilJTilIDilIAgc2l0ZS8gICAgICAgICAgICAgICAgICAgICAgIyBTaXRlLXNpZGUgKEFQSSBlbmRwb2ludCkKYGBgCgojIyMgRGF0YWJhc2UgVGFibGUKClRoZSBjb21wb25lbnQgY3JlYXRlcyBhIHNpbmdsZSB0YWJsZSBgI19fbW9rb3dhYXNhbm5vdW5jZWAgd2l0aCBmaWVsZHMgZm9yIHRpdGxlLCBtZXNzYWdlLCBwdWJsaXNoZWQgc3RhdGUsIG9yZGVyaW5nLCBhbmQgdGltZXN0YW1wcy4KCiMjIyBKU09OIEFQSQoKVGhlIHNpdGUtc2lkZSB2aWV3IHByb3ZpZGVzIGEgcHVibGljIEpTT04gZW5kcG9pbnQ6CgpgYGAKR0VUIC9pbmRleC5waHA/b3B0aW9uPWNvbV9tb2tvd2Fhc2Fubm91bmNlJnZpZXc9YXBpJmZvcm1hdD1qc29uCiAgICAmb3JkZXJpbmc9Y3JlYXRlZCAgICAgIyBTb3J0IGZpZWxkIChjcmVhdGVkIG9yIG9yZGVyaW5nKQogICAgJmRpcmVjdGlvbj1ERVNDICAgICAgICMgU29ydCBkaXJlY3Rpb24gKEFTQyBvciBERVNDKQpgYGAKClJlc3BvbnNlIGZvcm1hdDoKCmBgYGpzb24KewogICJzdWNjZXNzIjogdHJ1ZSwKICAiY291bnQiOiAyLAogICJhbm5vdW5jZW1lbnRzIjogWwogICAgewogICAgICAiaWQiOiAxLAogICAgICAidGl0bGUiOiAiU2NoZWR1bGVkIE1haW50ZW5hbmNlIiwKICAgICAgIm1lc3NhZ2UiOiAiU2l0ZSB3aWxsIGJlIGRvd24gU2F0dXJkYXkgMi00IEFNL
iIsCiAgICAgICJjcmVhdGVkIjogIjIwMjYtMDUtMDEgMTI6MDA6MDAiLAogICAgICAib3JkZXJpbmciOiAxCiAgICB9CiAgXQp9CmBgYAoKIyMgUmVtb3RlIE1vZHVsZQoKUmVtb3RlIHNpdGVzIHJ1biBgbW9kX21va293YWFzYW5ub3VuY2VgLCB3aGljaCBmZXRjaGVzIGFubm91bmNlbWVudHMgZnJvbSB0aGUgaG9zdCBBUEkgYW5kIGRpc3BsYXlzIHRoZW0uCgojIyMgRGlyZWN0b3J5IFN0cnVjdHVyZQoKYGBgCm1vZF9tb2tvd2Fhc2Fubm91bmNlLwrilJzilIDilIAgbW9kX21va293YWFzYW5ub3VuY2UueG1sICAgIyBNb2R1bGUgbWFuaWZlc3QK4pSc4pSA4pSAIG1vZF9tb2tvd2Fhc2Fubm91bmNlLnBocCAgICMgRW50cnkgcG9pbnQK4pSc4pSA4pSAIGhlbHBlci5waHAgICAgICAgICAgICAgICAgIyBBUEkgZmV0Y2hpbmcgbG9naWMK4pSc4pSA4pSAIHRtcGwvCuKUgiAgIOKUlOKUgOKUgCBkZWZhdWx0LnBocCAgICAgICAgICAgICMgRGlzcGxheSB0ZW1wbGF0ZQrilJTilIDilIAgbGFuZ3VhZ2UvCiAgICDilJTilIDilIAgZW4tR0IvICAgICAgICAgICAgICAgICAjIExhbmd1YWdlIGZpbGVzCmBgYAoKIyMjIERhdGEgRmxvdwoKMS4gTW9kdWxlIGxvYWRzIGFuZCByZWFkcyBgaG9zdF91cmxgIHBhcmFtZXRlcgoyLiBgTW9kTW9rb3dhYXNhbm5vdW5jZUhlbHBlcjo6Z2V0QW5ub3VuY2VtZW50cygpYCBpcyBjYWxsZWQKMy4gSGVscGVyIGNoZWNrcyBKb29tbGEgY2FjaGUgZm9yIGEgY2FjaGVkIHJlc3BvbnNlIChrZXllZCBieSBBUEkgVVJMIGhhc2gpCjQuIElmIGNhY2hlIG1pc3M6IHNlbmRzIEhUVFAgR0VUIHRvIGhvc3QgQVBJIHZpYSBgSkh0dHBGYWN0b3J5OjpnZXRIdHRwKClgIHdpdGggMTAtc2Vjb25kIHRpbWVvdXQKNS4gVmFsaWRhdGVzIHJlc3BvbnNlIChIVFRQIDIwMCwgYHN1Y2Nlc3M6IHRydWVgKQo2LiBDYWNoZXMgcmVzdWx0IGZvciAxNSBtaW51dGVzICh2aWEgSm9vbWxhJ3Mgb3V0cHV0IGNhY2hlKQo3LiBSZXR1cm5zIGFycmF5IG9mIGFubm91bmNlbWVudCBvYmplY3RzIHRvIHRlbXBsYXRlIGZvciByZW5kZXJpbmcKCiMjIyBDYWNoaW5nCgpUaGUgbW9kdWxlIHVzZXMgSm9vbWxhJ3MgYnVpbHQtaW4gY2FjaGUgc3lzdGVtOgoKYGBgcGhwCiRjYWNoZSA9IEpGYWN0b3J5OjpnZXRDYWNoZSgnbW9kX21va293YWFzYW5ub3VuY2UnLCAnb3V0cHV0Jyk7CiRjYWNoZUtleSA9IG1kNSgkYXBpVXJsKTsKYGBgCgotIENhY2hlIGdyb3VwOiBgbW9kX21va293YWFzYW5ub3VuY2VgCi0gQ2FjaGUga2V5OiBNRDUgaGFzaCBvZiB0aGUgZnVsbCBBUEkgVVJMIChpbmNsdWRlcyBsaW1pdCwgb3JkZXJpbmcsIGRpcmVjdGlvbiBwYXJhbWV0ZXJzKQotIER1cmF0aW9uOiAxNSBtaW51dGVzIChKb29tbGEgZGVmYXVsdCBjYWNoZSBsaWZldGltZSkKLSBBZGRpdGlvbmFsIG1vZHVsZS1sZXZlbCBjYWNoZSBzZXR0aW5ncyBhdmFpbGFibGUgaW4gQWR2YW5jZWQgdGFiIChkZWZhdWx0OiA5MDAgc2Vjb25kcykKCiMjIyBFcnJvciBIYW5kbGluZwoKVGhlIGhlbHBlciBoYW5kbGVzIHNldmVyYWwgZmFpbHVyZSBtb2RlczoKCnwgQ29uZGl0aW9uIHwgQmVoYXZpb3IgfAp8LS0tLS0tLS0tLS18LS0tLS0tLS0tLXwKfCBFbXB0eSBob3N0IFVSTCB8IFdhcm5pbmcgbWVzc2FnZSwgcmV0dXJucyBlbXB0eSBhcnJheSB8CnwgSFRUUCBlcnJvciAobm9uLTIwMCkgfCBFcnJvciBtZXNzYWdlIHdpdGggc3RhdHVzIGNvZGUsIHJldHVybnMgZW1wdHkgYXJyYXkgfAp8IEludmFsaWQgSlNPTiByZXNwb25zZSB8IEVycm9yIG1lc3NhZ2UsIHJldHVybnMgZW1wdHkgYXJyYXkgfAp8IGBzdWNjZXNzOiBmYWxzZWAgaW4gcmVzcG9uc2UgfCBEaXNwbGF5cyBlcnJvciBmcm9tIEFQSSByZXNwb25zZSB8CnwgTmV0d29yay9jb25uZWN0aW9uIGZhaWx1cmUgfCBDYXRjaGVzIGV4Y2VwdGlvbiwgZGlzcGxheXMgZXJyb3IgbWVzc2FnZSB8CgpBbGwgZXJyb3JzIHVzZSBgSkZhY3Rvcnk6OmdldEFwcGxpY2F0aW9uKCktPmVucXVldWVNZXNzYWdlKClgIHRvIGRpc3BsYXkgdXNlci1mYWNpbmcgbWVzc2FnZXMgd2l0aG91dCBicmVha2luZyB0aGUgcGFnZS4KCiMjIFNlY3VyaXR5CgotICoqSG9zdCBzaWRlKio6IEpFWEVDIGNoZWNrcyBvbiBhbGwgZmlsZXMsIGlucHV0IGZpbHRlcmluZyB2aWEgSm9vbWxhJ3MgcXVlcnkgYnVpbGRlciwgcGVybWlzc2lvbiBjaGVja3MgdmlhIEFDTAotICoqTW9kdWxlIHNpZGUqKjogVVJMIHNhbml0aXphdGlvbiwgb3V0cHV0IGVzY2FwaW5nLCBIVFRQLW9ubHkgY29tbXVuaWNhdGlvbgotICoqQVBJKio6IFB1YmxpYyByZWFkLW9ubHkgZW5kcG9pbnQgKG5vIGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkIGZvciBmZXRjaGluZyBhbm5vdW5jZW1lbnRzKQoKLS0tCgoKLS0tCgoqUmVwbzogW01va29XYWFTQmFzZV0oaHR0cHM6Ly9naXQubW9rb2NvbnN1bHRpbmcudGVjaC9Nb2tvQ29uc3VsdGluZy9Nb2tvV2FhU0Jhc2UpIMK3IFtNb2tvU3RhbmRhcmRzXShodHRwczovL2dpdC5tb2tvY29uc3VsdGluZy50ZWNoL01va29Db25zdWx0aW5nL21va29wbGF0Zm9ybS93aWtpL0hvbWUpKgoKfCBSZXZpc2lvbiB8IERhdGUgfCBBdXRob3IgfCBEZXNjcmlwdGlvbiB8CnwtLS18LS0tfC0tLXwtLS18CnwgMS4wIHwgMjAyNi0wNS0wOSB8IE1va28gQ29uc3VsdGluZyB8IEluaXRpYWwgdmVyc2lvbiB8Cg==",
"reference/Security": "W+KGkCBCYWNrIHRvIEhvbWVdKEhvbWUpCgojIFNlY3VyaXR5IFBvbGljeQoKIyMgU3VwcG9ydGVkIFZlcnNpb25zCgpTZWN1cml0eSB1cGRhdGVzIGFyZSBwcm92aWRlZCBmb3IgdGhlIGZvbGxvd2luZyB2ZXJzaW9uczoKCnwgVmVyc2lvbiB8IFN1cHBvcnRlZCAgICAgICAgICB8CnwgLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLSB8CnwgMDEueC54ICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgPCAwMS4wICB8IDp4OiAgICAgICAgICAgICAgICB8CgpPbmx5IHRoZSBjdXJyZW50IG1ham9yIHZlcnNpb24gcmVjZWl2ZXMgc2VjdXJpdHkgdXBkYXRlcy4KCiMjIFJlcG9ydGluZyBhIFZ1bG5lcmFiaWxpdHkKCiMjIyBXaGVyZSB0byBSZXBvcnQKCioqRE8gTk9UKiogY3JlYXRlIHB1YmxpYyBpc3N1ZXMgZm9yIHNlY3VyaXR5IHZ1bG5lcmFiaWxpdGllcy4KClJlcG9ydCBzZWN1cml0eSB2dWxuZXJhYmlsaXRpZXMgcHJpdmF0ZWx5IHRvOgoKKipFbWFpbCoqOiBgc2VjdXJpdHlAbW9rb2NvbnN1bHRpbmcudGVjaGAKCioqU3ViamVjdCBMaW5lKio6IGBbU0VDVVJJVFldIE1va29XYWFTQmFzZSAtIEJyaWVmIERlc2NyaXB0aW9uYAoKIyMjIFdoYXQgdG8gSW5jbHVkZQoKMS4gKipEZXNjcmlwdGlvbioqOiBDbGVhciBleHBsYW5hdGlvbiBvZiB0aGUgdnVsbmVyYWJpbGl0eQoyLiAqKkltcGFjdCoqOiBQb3RlbnRpYWwgc2VjdXJpdHkgaW1wYWN0IGFuZCBzZXZlcml0eSBhc3Nlc3NtZW50CjMuICoqQWZmZWN0ZWQgVmVyc2lvbnMqKjogV2hpY2ggdmVyc2lvbnMgYXJlIHZ1bG5lcmFibGUKNC4gKipSZXByb2R1Y3Rpb24gU3RlcHMqKjogRGV0YWlsZWQgc3RlcHMgdG8gcmVwcm9kdWNlIHRoZSBpc3N1ZQo1LiAqKlByb29mIG9mIENvbmNlcHQqKjogQ29kZSwgY29uZmlndXJhdGlvbiwgb3IgZGVtb25zdHJhdGlvbiAoaWYgYXBwbGljYWJsZSkKNi4gKipTdWdnZXN0ZWQgRml4Kio6IFByb3Bvc2VkIHJlbWVkaWF0aW9uIChpZiBrbm93bikKCiMjIyBSZXNwb25zZSBUaW1lbGluZQoKKiAqKkluaXRpYWwgUmVzcG9uc2UqKjogV2l0aGluIDMgYnVzaW5lc3MgZGF5cwoqICoqQXNzZXNzbWVudCBDb21wbGV0ZSoqOiBXaXRoaW4gNyBidXNpbmVzcyBkYXlzCiogKipGaXggVGltZWxpbmUqKjogRGVwZW5kcyBvbiBzZXZlcml0eSAoc2VlIGJlbG93KQoqICoqRGlzY2xvc3VyZSoqOiBDb29yZGluYXRlZCB3aXRoIHJlcG9ydGVyCgojIyBTZXZlcml0eSBDbGFzc2lmaWNhdGlvbgoKIyMjIENyaXRpY2FsCiogUmVtb3RlIGNvZGUgZXhlY3V0aW9uCiogQXV0aGVudGljYXRpb24gYnlwYXNzCiogRGF0YSBicmVhY2ggb3IgZXhwb3N1cmUgb2Ygc2Vuc2l0aXZlIGluZm9ybWF0aW9uCiogKipGaXggVGltZWxpbmUqKjogNyBkYXlzCgojIyMgSGlnaAoqIFByaXZpbGVnZSBlc2NhbGF0aW9uCiogU1FMIGluamVjdGlvbiBvciBjb21tYW5kIGluamVjdGlvbgoqIENyb3NzLXNpdGUgc2NyaXB0aW5nIChYU1MpIHdpdGggc2lnbmlmaWNhbnQgaW1wYWN0CiogKipGaXggVGltZWxpbmUqKjogMTQgZGF5cwoKIyMjIE1lZGl1bQoqIEluZm9ybWF0aW9uIGRpc2Nsb3N1cmUgKGxpbWl0ZWQgc2NvcGUpCiogRGVuaWFsIG9mIHNlcnZpY2UKKiBTZWN1cml0eSBtaXNjb25maWd1cmF0aW9ucyB3aXRoIG1vZGVyYXRlIGltcGFjdAoqICoqRml4IFRpbWVsaW5lKio6IDMwIGRheXMKCiMjIyBMb3cKKiBTZWN1cml0eSBiZXN0IHByYWN0aWNlIHZpb2xhdGlvbnMKKiBNaW5vciBpbmZvcm1hdGlvbiBsZWFrcwoqIElzc3VlcyByZXF1aXJpbmcgdXNlciBpbnRlcmFjdGlvbiBvciBjb21wbGV4IHByZWNvbmRpdGlvbnMKKiAqKkZpeCBUaW1lbGluZSoqOiA2MCBkYXlzIG9yIG5leHQgcmVsZWFzZQoKIyMgSm9vbWxhIEV4dGVuc2lvbiBTZWN1cml0eQoKKiBGb2xsb3cgSm9vbWxhIHNlY3VyaXR5IGJlc3QgcHJhY3RpY2VzCiogVmFsaWRhdGUgYW5kIHNhbml0aXplIGFsbCB1c2VyIGlucHV0CiogVXNlIEpvb21sYSdzIGRhdGFiYXNlIEFQSSB0byBwcmV2ZW50IFNRTCBpbmplY3Rpb24KKiBQcm9wZXJseSBlc2NhcGUgb3V0cHV0IHRvIHByZXZlbnQgWFNTCiogSW1wbGVtZW50IHByb3BlciBhY2Nlc3MgY29udHJvbCBjaGVja3MKKiBVc2UgSm9vbWxhJ3Mgc2Vzc2lvbiBhbmQgYXV0aGVudGljYXRpb24gQVBJcwoqIEtlZXAgSm9vbWxhIGFuZCBkZXBlbmRlbmNpZXMgdXAgdG8gZGF0ZQoKIyMgQ29udGFjdAoKKiAqKlNlY3VyaXR5IFRlYW0qKjogc2VjdXJpdHlAbW9rb2NvbnN1bHRpbmcudGVjaAoqICoqUHJpbWFyeSBDb250YWN0Kio6IGhlbGxvQG1va29jb25zdWx0aW5nLnRlY2gKCiMjIE91dCBvZiBTY29wZQoKKiBJc3N1ZXMgaW4gdGhpcmQtcGFydHkgZGVwZW5kZW5jaWVzIChyZXBvcnQgZGlyZWN0bHkgdG8gbWFpbnRhaW5lcnMpCiogU29jaWFsIGVuZ2luZWVyaW5nIGF0dGFja3MKKiBQaHlzaWNhbCBzZWN1cml0eSBpc3N1ZXMKKiBEZW5pYWwgb2Ygc2VydmljZSB2aWEgcmVzb3VyY2UgZXhoYXVzdGlvbiB3aXRob3V0IGFtcGxpZmljYXRpb24KKiBUaGVvcmV0aWNhbCB2dWxuZXJhYmlsaXRpZXMgd2l0aG91dCBwcm9vZiBvZiBleHBsb2l0YWJpbGl0eQoKLS0tCgoqUmVwbzogW01va29XYWFTQmFzZV0oaHR0cHM6Ly9naXQubW9rb2NvbnN1bHRpbmcudGVjaC9Nb2tvQ29uc3VsdGluZy9Nb2tvV2FhU0Jhc2UpIMK3IFtNb2tvU3RhbmRhcmRzXShodHRwczovL2dpdC5tb2tvY29uc3VsdGluZy50ZWNoL01va29Db25zdWx0aW5nL21va29wbGF0Zm9ybS93aWtpL0hvbWUpKgoKfCBSZXZpc2lvbiB8IERhdGUgfCBBdXRob3IgfCBEZXNjcmlwdGlvbiB8CnwtLS18LS0tfC0tLXwtLS18CnwgMS4wIHwgMjAyNi0wNi0wNiB8IE1va28gQ29uc3VsdGluZyB8IEluaXRpYWwgdmVyc2lvbiBmcm9tIFRlbXBsYXRlLUpvb21sYSB8Cg=="
}
for page_name, b64 in pages.items():
original = base64.b64decode(b64).decode('utf-8')
updated = apply_replacements(original)
new_b64 = base64.b64encode(updated.encode('utf-8')).decode('ascii')
changed = original != updated
print(f'PAGE:{page_name}|CHANGED:{changed}|B64:{new_b64}')