@horietakehiro/aws-cdk-utul 0.33.0 → 0.33.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/buildspec_schedule.yaml +42 -0
- package/lib/types/cfn-resource-types/aws-amazonmq-broker.d.ts +2 -1
- package/lib/types/cfn-resource-types/aws-amazonmq-broker.js +1 -1
- package/lib/types/cfn-resource-types/aws-appconfig-configurationprofile.d.ts +4 -0
- package/lib/types/cfn-resource-types/aws-appconfig-configurationprofile.js +1 -1
- package/lib/types/cfn-resource-types/aws-appconfig-deployment.d.ts +40 -4
- package/lib/types/cfn-resource-types/aws-appconfig-deployment.js +1 -1
- package/lib/types/cfn-resource-types/aws-appconfig-environment.d.ts +4 -0
- package/lib/types/cfn-resource-types/aws-appconfig-environment.js +1 -1
- package/lib/types/cfn-resource-types/aws-autoscaling-autoscalinggroup.d.ts +17 -0
- package/lib/types/cfn-resource-types/aws-autoscaling-autoscalinggroup.js +1 -1
- package/lib/types/cfn-resource-types/aws-bedrock-agent.d.ts +5 -0
- package/lib/types/cfn-resource-types/aws-bedrock-agent.js +1 -1
- package/lib/types/cfn-resource-types/aws-bedrock-datasource.d.ts +25 -16
- package/lib/types/cfn-resource-types/aws-bedrock-datasource.js +1 -1
- package/lib/types/cfn-resource-types/aws-bedrock-knowledgebase.d.ts +48 -3
- package/lib/types/cfn-resource-types/aws-bedrock-knowledgebase.js +1 -1
- package/lib/types/cfn-resource-types/aws-bedrock-prompt.d.ts +158 -3
- package/lib/types/cfn-resource-types/aws-bedrock-prompt.js +1 -1
- package/lib/types/cfn-resource-types/aws-cassandra-keyspace.d.ts +4 -0
- package/lib/types/cfn-resource-types/aws-cassandra-keyspace.js +1 -1
- package/lib/types/cfn-resource-types/aws-cassandra-type.d.ts +41 -0
- package/lib/types/cfn-resource-types/aws-cassandra-type.js +3 -0
- package/lib/types/cfn-resource-types/aws-cleanrooms-collaboration.d.ts +18 -0
- package/lib/types/cfn-resource-types/aws-cleanrooms-collaboration.js +1 -1
- package/lib/types/cfn-resource-types/aws-cleanrooms-membership.d.ts +11 -0
- package/lib/types/cfn-resource-types/aws-cleanrooms-membership.js +1 -1
- package/lib/types/cfn-resource-types/aws-cloudformation-guardhook.d.ts +1 -1
- package/lib/types/cfn-resource-types/aws-cloudformation-guardhook.js +1 -1
- package/lib/types/cfn-resource-types/aws-cloudformation-lambdahook.d.ts +1 -1
- package/lib/types/cfn-resource-types/aws-cloudformation-lambdahook.js +1 -1
- package/lib/types/cfn-resource-types/aws-cloudfront-anycastiplist.d.ts +27 -0
- package/lib/types/cfn-resource-types/aws-cloudfront-anycastiplist.js +3 -0
- package/lib/types/cfn-resource-types/aws-cloudfront-distribution.d.ts +24 -7
- package/lib/types/cfn-resource-types/aws-cloudfront-distribution.js +1 -1
- package/lib/types/cfn-resource-types/aws-connect-queue.d.ts +0 -1
- package/lib/types/cfn-resource-types/aws-connect-queue.js +1 -1
- package/lib/types/cfn-resource-types/aws-customerprofiles-eventtrigger.d.ts +162 -0
- package/lib/types/cfn-resource-types/aws-customerprofiles-eventtrigger.js +3 -0
- package/lib/types/cfn-resource-types/aws-databrew-dataset.d.ts +9 -0
- package/lib/types/cfn-resource-types/aws-databrew-dataset.js +1 -1
- package/lib/types/cfn-resource-types/aws-datazone-datasource.d.ts +23 -1
- package/lib/types/cfn-resource-types/aws-datazone-datasource.js +1 -1
- package/lib/types/cfn-resource-types/aws-datazone-projectmembership.d.ts +1 -1
- package/lib/types/cfn-resource-types/aws-datazone-projectmembership.js +1 -1
- package/lib/types/cfn-resource-types/aws-datazone-subscriptiontarget.d.ts +1 -1
- package/lib/types/cfn-resource-types/aws-datazone-subscriptiontarget.js +1 -1
- package/lib/types/cfn-resource-types/aws-dms-dataprovider.d.ts +1 -1
- package/lib/types/cfn-resource-types/aws-dms-dataprovider.js +1 -1
- package/lib/types/cfn-resource-types/aws-docdb-dbcluster.d.ts +3 -0
- package/lib/types/cfn-resource-types/aws-docdb-dbcluster.js +1 -1
- package/lib/types/cfn-resource-types/aws-dynamodb-globaltable.d.ts +5 -3
- package/lib/types/cfn-resource-types/aws-dynamodb-globaltable.js +1 -1
- package/lib/types/cfn-resource-types/aws-dynamodb-table.d.ts +1 -0
- package/lib/types/cfn-resource-types/aws-dynamodb-table.js +1 -1
- package/lib/types/cfn-resource-types/aws-ec2-ec2fleet.d.ts +10 -0
- package/lib/types/cfn-resource-types/aws-ec2-ec2fleet.js +1 -1
- package/lib/types/cfn-resource-types/aws-ec2-launchtemplate.d.ts +1022 -0
- package/lib/types/cfn-resource-types/aws-ec2-launchtemplate.js +3 -0
- package/lib/types/cfn-resource-types/aws-ec2-networkacl.d.ts +1 -0
- package/lib/types/cfn-resource-types/aws-ec2-networkacl.js +1 -1
- package/lib/types/cfn-resource-types/aws-ec2-spotfleet.d.ts +136 -126
- package/lib/types/cfn-resource-types/aws-ec2-spotfleet.js +1 -1
- package/lib/types/cfn-resource-types/aws-ec2-volume.d.ts +5 -5
- package/lib/types/cfn-resource-types/aws-ec2-volume.js +1 -1
- package/lib/types/cfn-resource-types/aws-ec2-vpccidrblock.d.ts +4 -0
- package/lib/types/cfn-resource-types/aws-ec2-vpccidrblock.js +1 -1
- package/lib/types/cfn-resource-types/aws-ec2-vpcendpoint.d.ts +27 -14
- package/lib/types/cfn-resource-types/aws-ec2-vpcendpoint.js +1 -1
- package/lib/types/cfn-resource-types/aws-ec2-vpcendpointservice.d.ts +8 -0
- package/lib/types/cfn-resource-types/aws-ec2-vpcendpointservice.js +1 -1
- package/lib/types/cfn-resource-types/aws-ecs-service.d.ts +6 -3
- package/lib/types/cfn-resource-types/aws-ecs-service.js +1 -1
- package/lib/types/cfn-resource-types/aws-ecs-taskdefinition.d.ts +5 -2
- package/lib/types/cfn-resource-types/aws-ecs-taskdefinition.js +1 -1
- package/lib/types/cfn-resource-types/aws-efs-filesystem.d.ts +10 -1
- package/lib/types/cfn-resource-types/aws-efs-filesystem.js +1 -1
- package/lib/types/cfn-resource-types/aws-fis-experimenttemplate.d.ts +1 -1
- package/lib/types/cfn-resource-types/aws-fis-experimenttemplate.js +1 -1
- package/lib/types/cfn-resource-types/aws-imagebuilder-image.d.ts +45 -45
- package/lib/types/cfn-resource-types/aws-imagebuilder-image.js +1 -1
- package/lib/types/cfn-resource-types/aws-lex-bot.d.ts +17 -0
- package/lib/types/cfn-resource-types/aws-lex-bot.js +1 -1
- package/lib/types/cfn-resource-types/aws-logs-loggroup.d.ts +11 -0
- package/lib/types/cfn-resource-types/aws-logs-loggroup.js +1 -1
- package/lib/types/cfn-resource-types/aws-logs-metricfilter.d.ts +4 -0
- package/lib/types/cfn-resource-types/aws-logs-metricfilter.js +1 -1
- package/lib/types/cfn-resource-types/aws-logs-subscriptionfilter.d.ts +4 -0
- package/lib/types/cfn-resource-types/aws-logs-subscriptionfilter.js +1 -1
- package/lib/types/cfn-resource-types/aws-mediaconnect-bridge.d.ts +10 -0
- package/lib/types/cfn-resource-types/aws-mediaconnect-bridge.js +1 -1
- package/lib/types/cfn-resource-types/aws-mediaconnect-bridgesource.d.ts +10 -0
- package/lib/types/cfn-resource-types/aws-mediaconnect-bridgesource.js +1 -1
- package/lib/types/cfn-resource-types/aws-mediaconvert-queue.d.ts +1 -0
- package/lib/types/cfn-resource-types/aws-mediaconvert-queue.js +1 -1
- package/lib/types/cfn-resource-types/aws-opensearchservice-domain.d.ts +10 -0
- package/lib/types/cfn-resource-types/aws-opensearchservice-domain.js +1 -1
- package/lib/types/cfn-resource-types/aws-pcs-cluster.d.ts +151 -0
- package/lib/types/cfn-resource-types/aws-pcs-cluster.js +3 -0
- package/lib/types/cfn-resource-types/aws-pcs-computenodegroup.d.ts +142 -0
- package/lib/types/cfn-resource-types/aws-pcs-computenodegroup.js +3 -0
- package/lib/types/cfn-resource-types/aws-pcs-queue.d.ts +65 -0
- package/lib/types/cfn-resource-types/aws-pcs-queue.js +3 -0
- package/lib/types/cfn-resource-types/aws-qbusiness-dataaccessor.d.ts +1 -1
- package/lib/types/cfn-resource-types/aws-qbusiness-dataaccessor.js +1 -1
- package/lib/types/cfn-resource-types/aws-quicksight-analysis.d.ts +4218 -0
- package/lib/types/cfn-resource-types/aws-quicksight-analysis.js +3 -0
- package/lib/types/cfn-resource-types/aws-quicksight-custompermissions.d.ts +48 -0
- package/lib/types/cfn-resource-types/aws-quicksight-custompermissions.js +3 -0
- package/lib/types/cfn-resource-types/aws-quicksight-dashboard.d.ts +4338 -0
- package/lib/types/cfn-resource-types/aws-quicksight-dashboard.js +3 -0
- package/lib/types/cfn-resource-types/aws-quicksight-dataset.d.ts +16 -22
- package/lib/types/cfn-resource-types/aws-quicksight-dataset.js +1 -1
- package/lib/types/cfn-resource-types/aws-quicksight-template.d.ts +4018 -0
- package/lib/types/cfn-resource-types/aws-quicksight-template.js +3 -0
- package/lib/types/cfn-resource-types/aws-rds-dbcluster.d.ts +24 -13
- package/lib/types/cfn-resource-types/aws-rds-dbcluster.js +1 -1
- package/lib/types/cfn-resource-types/aws-rds-dbinstance.d.ts +1 -0
- package/lib/types/cfn-resource-types/aws-rds-dbinstance.js +1 -1
- package/lib/types/cfn-resource-types/aws-redshift-integration.d.ts +3 -5
- package/lib/types/cfn-resource-types/aws-redshift-integration.js +1 -1
- package/lib/types/cfn-resource-types/aws-resiliencehub-app.d.ts +4 -0
- package/lib/types/cfn-resource-types/aws-resiliencehub-app.js +1 -1
- package/lib/types/cfn-resource-types/aws-sagemaker-cluster.d.ts +52 -52
- package/lib/types/cfn-resource-types/aws-sagemaker-cluster.js +1 -1
- package/lib/types/cfn-resource-types/aws-sagemaker-domain.d.ts +5 -0
- package/lib/types/cfn-resource-types/aws-sagemaker-domain.js +1 -1
- package/lib/types/cfn-resource-types/aws-sagemaker-endpointconfig.d.ts +0 -1
- package/lib/types/cfn-resource-types/aws-sagemaker-endpointconfig.js +1 -1
- package/lib/types/cfn-resource-types/aws-sagemaker-partnerapp.d.ts +89 -0
- package/lib/types/cfn-resource-types/aws-sagemaker-partnerapp.js +3 -0
- package/lib/types/cfn-resource-types/aws-sagemaker-space.d.ts +4 -0
- package/lib/types/cfn-resource-types/aws-sagemaker-space.js +1 -1
- package/lib/types/cfn-resource-types/aws-sagemaker-userprofile.d.ts +5 -0
- package/lib/types/cfn-resource-types/aws-sagemaker-userprofile.js +1 -1
- package/lib/types/cfn-resource-types/aws-securityhub-configurationpolicy.d.ts +1 -1
- package/lib/types/cfn-resource-types/aws-securityhub-configurationpolicy.js +1 -1
- package/lib/types/cfn-resource-types/aws-ses-configurationset.d.ts +4 -0
- package/lib/types/cfn-resource-types/aws-ses-configurationset.js +1 -1
- package/lib/types/cfn-resource-types/aws-ses-mailmanagerruleset.d.ts +10 -1
- package/lib/types/cfn-resource-types/aws-ses-mailmanagerruleset.js +1 -1
- package/lib/types/cfn-resource-types/aws-ssmquicksetup-configurationmanager.d.ts +1 -1
- package/lib/types/cfn-resource-types/aws-ssmquicksetup-configurationmanager.js +1 -1
- package/lib/types/cfn-resource-types/aws-synthetics-canary.d.ts +4 -0
- package/lib/types/cfn-resource-types/aws-synthetics-canary.js +1 -1
- package/lib/types/cfn-resource-types/aws-wisdom-aiagent.d.ts +1 -0
- package/lib/types/cfn-resource-types/aws-wisdom-aiagent.js +1 -1
- package/lib/types/cfn-resource-types/aws-wisdom-aiprompt.d.ts +1 -0
- package/lib/types/cfn-resource-types/aws-wisdom-aiprompt.js +1 -1
- package/lib/types/cfn-resource-types.d.ts +24 -6
- package/lib/types/cfn-resource-types.js +50 -32
- package/package.json +2 -2
- package/lib/types/cfn-resource-types/aws-iot1click-device.d.ts +0 -8
- package/lib/types/cfn-resource-types/aws-iot1click-device.js +0 -3
- package/lib/types/cfn-resource-types/aws-iot1click-placement.d.ts +0 -14
- package/lib/types/cfn-resource-types/aws-iot1click-placement.js +0 -3
- package/lib/types/cfn-resource-types/aws-iot1click-project.d.ts +0 -18
- package/lib/types/cfn-resource-types/aws-iot1click-project.js +0 -3
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzLWVjcy10YXNrZGVmaW5pdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImF3cy1lY3MtdGFza2RlZmluaXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUmVnaXN0ZXJzIGEgbmV3IHRhc2sgZGVmaW5pdGlvbiBmcm9tIHRoZSBzdXBwbGllZCBgYGZhbWlseWBgIGFuZCBgYGNvbnRhaW5lckRlZmluaXRpb25zYGAuIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGRhdGEgdm9sdW1lcyB0byB5b3VyIGNvbnRhaW5lcnMgd2l0aCB0aGUgYGB2b2x1bWVzYGAgcGFyYW1ldGVyLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0YXNrIGRlZmluaXRpb24gcGFyYW1ldGVycyBhbmQgZGVmYXVsdHMsIHNlZSBbQW1hem9uIEVDUyBUYXNrIERlZmluaXRpb25zXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS90YXNrX2RlZmludGlvbnMuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICogIFlvdSBjYW4gc3BlY2lmeSBhIHJvbGUgZm9yIHlvdXIgdGFzayB3aXRoIHRoZSBgYHRhc2tSb2xlQXJuYGAgcGFyYW1ldGVyLiBXaGVuIHlvdSBzcGVjaWZ5IGEgcm9sZSBmb3IgYSB0YXNrLCBpdHMgY29udGFpbmVycyBjYW4gdGhlbiB1c2UgdGhlIGxhdGVzdCB2ZXJzaW9ucyBvZiB0aGUgQ0xJIG9yIFNES3MgdG8gbWFrZSBBUEkgcmVxdWVzdHMgdG8gdGhlIEFXUyBzZXJ2aWNlcyB0aGF0IGFyZSBzcGVjaWZpZWQgaW4gdGhlIHBvbGljeSB0aGF0J3MgYXNzb2NpYXRlZCB3aXRoIHRoZSByb2xlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtJQU0gUm9sZXMgZm9yIFRhc2tzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS90YXNrLWlhbS1yb2xlcy5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKiAgWW91IGNhbiBzcGVjaWZ5IGEgRG9ja2VyIG5ldHdvcmtpbmcgbW9kZSBmb3IgdGhlIGNvbnRhaW5lcnMgaW4geW91ciB0YXNrIGRlZmluaXRpb24gd2l0aCB0aGUgYGBuZXR3b3JrTW9kZWBgIHBhcmFtZXRlci4gSWYgeW91IHNwZWNpZnkgdGhlIGBgYXdzdnBjYGAgbmV0d29yayBtb2RlLCB0aGUgdGFzayBpcyBhbGxvY2F0ZWQgYW4gZWxhc3RpYyBuZXR3b3JrIGludGVyZmFjZSwgYW5kIHlvdSBtdXN0IHNwZWNpZnkgYSBbTmV0d29ya0NvbmZpZ3VyYXRpb25dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTmV0d29ya0NvbmZpZ3VyYXRpb24uaHRtbCkgd2hlbiB5b3UgY3JlYXRlIGEgc2VydmljZSBvciBydW4gYSB0YXNrIHdpdGggdGhlIHRhc2sgZGVmaW5pdGlvbi4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbVGFzayBOZXR3b3JraW5nXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS90YXNrLW5ldHdvcmtpbmcuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICogICBJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUgb3IgZXhhbXBsZXMsIHRoZSBBdXRob3JpemF0aW9uIGhlYWRlciBjb250ZW50cyAoYGBBVVRIUEFSQU1TYGApIG11c3QgYmUgcmVwbGFjZWQgd2l0aCBhbiBBV1MgU2lnbmF0dXJlIFZlcnNpb24gNCBzaWduYXR1cmUuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1NpZ25hdHVyZSBWZXJzaW9uIDQgU2lnbmluZyBQcm9jZXNzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2VuZXJhbC9sYXRlc3QvZ3Ivc2lnbmF0dXJlLXZlcnNpb24tNC5odG1sKSBpbiB0aGUgKkdlbmVyYWwgUmVmZXJlbmNlKi5cbiAqICBZb3Ugb25seSBuZWVkIHRvIGxlYXJuIGhvdyB0byBzaWduIEhUVFAgcmVxdWVzdHMgaWYgeW91IGludGVuZCB0byBjcmVhdGUgdGhlbSBtYW51YWxseS4gV2hlbiB5b3UgdXNlIHRoZSBbXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xpLykgb3Igb25lIG9mIHRoZSBbU0RLc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3Rvb2xzLykgdG8gbWFrZSByZXF1ZXN0cyB0byBBV1MsIHRoZXNlIHRvb2xzIGF1dG9tYXRpY2FsbHkgc2lnbiB0aGUgcmVxdWVzdHMgZm9yIHlvdSwgd2l0aCB0aGUgYWNjZXNzIGtleSB0aGF0IHlvdSBzcGVjaWZ5IHdoZW4geW91IGNvbmZpZ3VyZSB0aGUgdG9vbHMuIFdoZW4geW91IHVzZSB0aGVzZSB0b29scywgeW91IGRvbid0IGhhdmUgdG8gc2lnbiByZXF1ZXN0cyB5b3Vyc2VsZi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBfQVdTX0VDU19UQVNLREVGSU5JVElPTiB7XG4vKipcbiAqIFRoZSBzaG9ydCBuYW1lIG9yIGZ1bGwgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIElBTWxvbmcgcm9sZSB0aGF0IGdyYW50cyBjb250YWluZXJzIGluIHRoZSB0YXNrIHBlcm1pc3Npb24gdG8gY2FsbCBBV1MgQVBJcyBvbiB5b3VyIGJlaGFsZi4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQW1hem9uIEVDUyBUYXNrIFJvbGVdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3Rhc2staWFtLXJvbGVzLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICBJQU0gcm9sZXMgZm9yIHRhc2tzIG9uIFdpbmRvd3MgcmVxdWlyZSB0aGF0IHRoZSBgYC1FbmFibGVUYXNrSUFNUm9sZWBgIG9wdGlvbiBpcyBzZXQgd2hlbiB5b3UgbGF1bmNoIHRoZSBBbWF6b24gRUNTLW9wdGltaXplZCBXaW5kb3dzIEFNSS4gWW91ciBjb250YWluZXJzIG11c3QgYWxzbyBydW4gc29tZSBjb25maWd1cmF0aW9uIGNvZGUgdG8gdXNlIHRoZSBmZWF0dXJlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtXaW5kb3dzIElBTSByb2xlcyBmb3IgdGFza3NdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3dpbmRvd3NfdGFza19JQU1fcm9sZXMuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICogICBTdHJpbmcgdmFsaWRhdGlvbiBpcyBkb25lIG9uIHRoZSBFQ1Mgc2lkZS4gSWYgYW4gaW52YWxpZCBzdHJpbmcgdmFsdWUgaXMgZ2l2ZW4gZm9yIGBgVGFza1JvbGVBcm5gYCwgaXQgbWF5IGNhdXNlIHRoZSBDbG91ZGZvcm1hdGlvbiBqb2IgdG8gaGFuZy5cbiAqL1xuVGFza1JvbGVBcm4/OiBzdHJpbmdcbi8qKlxuICogVGhlIElQQyByZXNvdXJjZSBuYW1lc3BhY2UgdG8gdXNlIGZvciB0aGUgY29udGFpbmVycyBpbiB0aGUgdGFzay4gVGhlIHZhbGlkIHZhbHVlcyBhcmUgYGBob3N0YGAsIGBgdGFza2BgLCBvciBgYG5vbmVgYC4gSWYgYGBob3N0YGAgaXMgc3BlY2lmaWVkLCB0aGVuIGFsbCBjb250YWluZXJzIHdpdGhpbiB0aGUgdGFza3MgdGhhdCBzcGVjaWZpZWQgdGhlIGBgaG9zdGBgIElQQyBtb2RlIG9uIHRoZSBzYW1lIGNvbnRhaW5lciBpbnN0YW5jZSBzaGFyZSB0aGUgc2FtZSBJUEMgcmVzb3VyY2VzIHdpdGggdGhlIGhvc3QgQW1hem9uIEVDMiBpbnN0YW5jZS4gSWYgYGB0YXNrYGAgaXMgc3BlY2lmaWVkLCBhbGwgY29udGFpbmVycyB3aXRoaW4gdGhlIHNwZWNpZmllZCB0YXNrIHNoYXJlIHRoZSBzYW1lIElQQyByZXNvdXJjZXMuIElmIGBgbm9uZWBgIGlzIHNwZWNpZmllZCwgdGhlbiBJUEMgcmVzb3VyY2VzIHdpdGhpbiB0aGUgY29udGFpbmVycyBvZiBhIHRhc2sgYXJlIHByaXZhdGUgYW5kIG5vdCBzaGFyZWQgd2l0aCBvdGhlciBjb250YWluZXJzIGluIGEgdGFzayBvciBvbiB0aGUgY29udGFpbmVyIGluc3RhbmNlLiBJZiBubyB2YWx1ZSBpcyBzcGVjaWZpZWQsIHRoZW4gdGhlIElQQyByZXNvdXJjZSBuYW1lc3BhY2Ugc2hhcmluZyBkZXBlbmRzIG9uIHRoZSBEb2NrZXIgZGFlbW9uIHNldHRpbmcgb24gdGhlIGNvbnRhaW5lciBpbnN0YW5jZS5cbiAqICBJZiB0aGUgYGBob3N0YGAgSVBDIG1vZGUgaXMgdXNlZCwgYmUgYXdhcmUgdGhhdCB0aGVyZSBpcyBhIGhlaWdodGVuZWQgcmlzayBvZiB1bmRlc2lyZWQgSVBDIG5hbWVzcGFjZSBleHBvc2UuXG4gKiAgSWYgeW91IGFyZSBzZXR0aW5nIG5hbWVzcGFjZWQga2VybmVsIHBhcmFtZXRlcnMgdXNpbmcgYGBzeXN0ZW1Db250cm9sc2BgIGZvciB0aGUgY29udGFpbmVycyBpbiB0aGUgdGFzaywgdGhlIGZvbGxvd2luZyB3aWxsIGFwcGx5IHRvIHlvdXIgSVBDIHJlc291cmNlIG5hbWVzcGFjZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbU3lzdGVtIENvbnRyb2xzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS90YXNrX2RlZmluaXRpb25fcGFyYW1ldGVycy5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKiAgICsgIEZvciB0YXNrcyB0aGF0IHVzZSB0aGUgYGBob3N0YGAgSVBDIG1vZGUsIElQQyBuYW1lc3BhY2UgcmVsYXRlZCBgYHN5c3RlbUNvbnRyb2xzYGAgYXJlIG5vdCBzdXBwb3J0ZWQuXG4gKiAgICsgIEZvciB0YXNrcyB0aGF0IHVzZSB0aGUgYGB0YXNrYGAgSVBDIG1vZGUsIElQQyBuYW1lc3BhY2UgcmVsYXRlZCBgYHN5c3RlbUNvbnRyb2xzYGAgd2lsbCBhcHBseSB0byBhbGwgY29udGFpbmVycyB3aXRoaW4gYSB0YXNrLlxuICogICBcbiAqICAgVGhpcyBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZCBmb3IgV2luZG93cyBjb250YWluZXJzIG9yIHRhc2tzIHJ1biBvbiBGQVJHQVRFbG9uZy5cbiAqL1xuSXBjTW9kZT86IHN0cmluZ1xuLyoqXG4gKiBUaGUgRWxhc3RpYyBJbmZlcmVuY2UgYWNjZWxlcmF0b3JzIHRvIHVzZSBmb3IgdGhlIGNvbnRhaW5lcnMgaW4gdGhlIHRhc2suXG4gKi9cbkluZmVyZW5jZUFjY2VsZXJhdG9ycz86IEluZmVyZW5jZUFjY2VsZXJhdG9yW11cbi8qKlxuICogVGhlIGFtb3VudCAoaW4gTWlCKSBvZiBtZW1vcnkgdXNlZCBieSB0aGUgdGFzay5cbiAqICBJZiB5b3VyIHRhc2tzIHJ1bnMgb24gQW1hem9uIEVDMiBpbnN0YW5jZXMsIHlvdSBtdXN0IHNwZWNpZnkgZWl0aGVyIGEgdGFzay1sZXZlbCBtZW1vcnkgdmFsdWUgb3IgYSBjb250YWluZXItbGV2ZWwgbWVtb3J5IHZhbHVlLiBUaGlzIGZpZWxkIGlzIG9wdGlvbmFsIGFuZCBhbnkgdmFsdWUgY2FuIGJlIHVzZWQuIElmIGEgdGFzay1sZXZlbCBtZW1vcnkgdmFsdWUgaXMgc3BlY2lmaWVkLCB0aGUgY29udGFpbmVyLWxldmVsIG1lbW9yeSB2YWx1ZSBpcyBvcHRpb25hbC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvbnRhaW5lci1sZXZlbCBtZW1vcnkgYW5kIG1lbW9yeSByZXNlcnZhdGlvbiwgc2VlIFtDb250YWluZXJEZWZpbml0aW9uXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NvbnRhaW5lckRlZmluaXRpb24uaHRtbCkuXG4gKiAgSWYgeW91ciB0YXNrcyBydW5zIG9uIEZBUkdBVEVsb25nLCB0aGlzIGZpZWxkIGlzIHJlcXVpcmVkLiBZb3UgbXVzdCB1c2Ugb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzLiBUaGUgdmFsdWUgeW91IGNob29zZSBkZXRlcm1pbmVzIHlvdXIgcmFuZ2Ugb2YgdmFsaWQgdmFsdWVzIGZvciB0aGUgYGBjcHVgYCBwYXJhbWV0ZXIuXG4gKiAgICsgIDUxMiAoMC41IEdCKSwgMTAyNCAoMSBHQiksIDIwNDggKDIgR0IpIC0gQXZhaWxhYmxlIGBgY3B1YGAgdmFsdWVzOiAyNTYgKC4yNSB2Q1BVKVxuICogICArICAxMDI0ICgxIEdCKSwgMjA0OCAoMiBHQiksIDMwNzIgKDMgR0IpLCA0MDk2ICg0IEdCKSAtIEF2YWlsYWJsZSBgYGNwdWBgIHZhbHVlczogNTEyICguNSB2Q1BVKVxuICogICArICAyMDQ4ICgyIEdCKSwgMzA3MiAoMyBHQiksIDQwOTYgKDQgR0IpLCA1MTIwICg1IEdCKSwgNjE0NCAoNiBHQiksIDcxNjggKDcgR0IpLCA4MTkyICg4IEdCKSAtIEF2YWlsYWJsZSBgYGNwdWBgIHZhbHVlczogMTAyNCAoMSB2Q1BVKVxuICogICArICBCZXR3ZWVuIDQwOTYgKDQgR0IpIGFuZCAxNjM4NCAoMTYgR0IpIGluIGluY3JlbWVudHMgb2YgMTAyNCAoMSBHQikgLSBBdmFpbGFibGUgYGBjcHVgYCB2YWx1ZXM6IDIwNDggKDIgdkNQVSlcbiAqICAgKyAgQmV0d2VlbiA4MTkyICg4IEdCKSBhbmQgMzA3MjAgKDMwIEdCKSBpbiBpbmNyZW1lbnRzIG9mIDEwMjQgKDEgR0IpIC0gQXZhaWxhYmxlIGBgY3B1YGAgdmFsdWVzOiA0MDk2ICg0IHZDUFUpXG4gKiAgICsgIEJldHdlZW4gMTYgR0IgYW5kIDYwIEdCIGluIDQgR0IgaW5jcmVtZW50cyAtIEF2YWlsYWJsZSBgYGNwdWBgIHZhbHVlczogODE5MiAoOCB2Q1BVKVxuICogIFRoaXMgb3B0aW9uIHJlcXVpcmVzIExpbnV4IHBsYXRmb3JtIGBgMS40LjBgYCBvciBsYXRlci5cbiAqICAgKyAgQmV0d2VlbiAzMkdCIGFuZCAxMjAgR0IgaW4gOCBHQiBpbmNyZW1lbnRzIC0gQXZhaWxhYmxlIGBgY3B1YGAgdmFsdWVzOiAxNjM4NCAoMTYgdkNQVSlcbiAqICBUaGlzIG9wdGlvbiByZXF1aXJlcyBMaW51eCBwbGF0Zm9ybSBgYDEuNC4wYGAgb3IgbGF0ZXIuXG4gKi9cbk1lbW9yeT86IHN0cmluZ1xuLyoqXG4gKiBBbiBhcnJheSBvZiBwbGFjZW1lbnQgY29uc3RyYWludCBvYmplY3RzIHRvIHVzZSBmb3IgdGFza3MuXG4gKiAgIFRoaXMgcGFyYW1ldGVyIGlzbid0IHN1cHBvcnRlZCBmb3IgdGFza3MgcnVuIG9uIEZBUkdBVEVsb25nLlxuICovXG5QbGFjZW1lbnRDb25zdHJhaW50cz86IFRhc2tEZWZpbml0aW9uUGxhY2VtZW50Q29uc3RyYWludFtdXG4vKipcbiAqIFRoZSBudW1iZXIgb2YgYGBjcHVgYCB1bml0cyB1c2VkIGJ5IHRoZSB0YXNrLiBJZiB5b3UgdXNlIHRoZSBFQzIgbGF1bmNoIHR5cGUsIHRoaXMgZmllbGQgaXMgb3B0aW9uYWwuIEFueSB2YWx1ZSBjYW4gYmUgdXNlZC4gSWYgeW91IHVzZSB0aGUgRmFyZ2F0ZSBsYXVuY2ggdHlwZSwgdGhpcyBmaWVsZCBpcyByZXF1aXJlZC4gWW91IG11c3QgdXNlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcy4gVGhlIHZhbHVlIHRoYXQgeW91IGNob29zZSBkZXRlcm1pbmVzIHlvdXIgcmFuZ2Ugb2YgdmFsaWQgdmFsdWVzIGZvciB0aGUgYGBtZW1vcnlgYCBwYXJhbWV0ZXIuXG4gKiAgSWYgeW91IHVzZSB0aGUgRUMyIGxhdW5jaCB0eXBlLCB0aGlzIGZpZWxkIGlzIG9wdGlvbmFsLiBTdXBwb3J0ZWQgdmFsdWVzIGFyZSBiZXR3ZWVuIGBgMTI4YGAgQ1BVIHVuaXRzIChgYDAuMTI1YGAgdkNQVXMpIGFuZCBgYDEwMjQwYGAgQ1BVIHVuaXRzIChgYDEwYGAgdkNQVXMpLlxuICogIFRoZSBDUFUgdW5pdHMgY2Fubm90IGJlIGxlc3MgdGhhbiAxIHZDUFUgd2hlbiB5b3UgdXNlIFdpbmRvd3MgY29udGFpbmVycyBvbiBGYXJnYXRlLlxuICogICArICAyNTYgKC4yNSB2Q1BVKSAtIEF2YWlsYWJsZSBgYG1lbW9yeWBgIHZhbHVlczogNTEyICgwLjUgR0IpLCAxMDI0ICgxIEdCKSwgMjA0OCAoMiBHQilcbiAqICAgKyAgNTEyICguNSB2Q1BVKSAtIEF2YWlsYWJsZSBgYG1lbW9yeWBgIHZhbHVlczogMTAyNCAoMSBHQiksIDIwNDggKDIgR0IpLCAzMDcyICgzIEdCKSwgNDA5NiAoNCBHQilcbiAqICAgKyAgMTAyNCAoMSB2Q1BVKSAtIEF2YWlsYWJsZSBgYG1lbW9yeWBgIHZhbHVlczogMjA0OCAoMiBHQiksIDMwNzIgKDMgR0IpLCA0MDk2ICg0IEdCKSwgNTEyMCAoNSBHQiksIDYxNDQgKDYgR0IpLCA3MTY4ICg3IEdCKSwgODE5MiAoOCBHQilcbiAqICAgKyAgMjA0OCAoMiB2Q1BVKSAtIEF2YWlsYWJsZSBgYG1lbW9yeWBgIHZhbHVlczogNDA5NiAoNCBHQikgYW5kIDE2Mzg0ICgxNiBHQikgaW4gaW5jcmVtZW50cyBvZiAxMDI0ICgxIEdCKVxuICogICArICA0MDk2ICg0IHZDUFUpIC0gQXZhaWxhYmxlIGBgbWVtb3J5YGAgdmFsdWVzOiA4MTkyICg4IEdCKSBhbmQgMzA3MjAgKDMwIEdCKSBpbiBpbmNyZW1lbnRzIG9mIDEwMjQgKDEgR0IpXG4gKiAgICsgIDgxOTIgKDggdkNQVSkgLSBBdmFpbGFibGUgYGBtZW1vcnlgYCB2YWx1ZXM6IDE2IEdCIGFuZCA2MCBHQiBpbiA0IEdCIGluY3JlbWVudHNcbiAqICBUaGlzIG9wdGlvbiByZXF1aXJlcyBMaW51eCBwbGF0Zm9ybSBgYDEuNC4wYGAgb3IgbGF0ZXIuXG4gKiAgICsgIDE2Mzg0ICgxNnZDUFUpIC0gQXZhaWxhYmxlIGBgbWVtb3J5YGAgdmFsdWVzOiAzMkdCIGFuZCAxMjAgR0IgaW4gOCBHQiBpbmNyZW1lbnRzXG4gKiAgVGhpcyBvcHRpb24gcmVxdWlyZXMgTGludXggcGxhdGZvcm0gYGAxLjQuMGBgIG9yIGxhdGVyLlxuICovXG5DcHU/OiBzdHJpbmdcbi8qKlxuICogVGhlIHRhc2sgbGF1bmNoIHR5cGVzIHRoZSB0YXNrIGRlZmluaXRpb24gd2FzIHZhbGlkYXRlZCBhZ2FpbnN0LiBUaGUgdmFsaWQgdmFsdWVzIGFyZSBgYEVDMmBgLCBgYEZBUkdBVEVgYCwgYW5kIGBgRVhURVJOQUxgYC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQW1hem9uIEVDUyBsYXVuY2ggdHlwZXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2xhdW5jaF90eXBlcy5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKi9cblJlcXVpcmVzQ29tcGF0aWJpbGl0aWVzPzogc3RyaW5nW11cbi8qKlxuICogVGhlIERvY2tlciBuZXR3b3JraW5nIG1vZGUgdG8gdXNlIGZvciB0aGUgY29udGFpbmVycyBpbiB0aGUgdGFzay4gVGhlIHZhbGlkIHZhbHVlcyBhcmUgYGBub25lYGAsIGBgYnJpZGdlYGAsIGBgYXdzdnBjYGAsIGFuZCBgYGhvc3RgYC4gSWYgbm8gbmV0d29yayBtb2RlIGlzIHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgaXMgYGBicmlkZ2VgYC5cbiAqICBGb3IgQW1hem9uIEVDUyB0YXNrcyBvbiBGYXJnYXRlLCB0aGUgYGBhd3N2cGNgYCBuZXR3b3JrIG1vZGUgaXMgcmVxdWlyZWQuIEZvciBBbWF6b24gRUNTIHRhc2tzIG9uIEFtYXpvbiBFQzIgTGludXggaW5zdGFuY2VzLCBhbnkgbmV0d29yayBtb2RlIGNhbiBiZSB1c2VkLiBGb3IgQW1hem9uIEVDUyB0YXNrcyBvbiBBbWF6b24gRUMyIFdpbmRvd3MgaW5zdGFuY2VzLCBgYDxkZWZhdWx0PmBgIG9yIGBgYXdzdnBjYGAgY2FuIGJlIHVzZWQuIElmIHRoZSBuZXR3b3JrIG1vZGUgaXMgc2V0IHRvIGBgbm9uZWBgLCB5b3UgY2Fubm90IHNwZWNpZnkgcG9ydCBtYXBwaW5ncyBpbiB5b3VyIGNvbnRhaW5lciBkZWZpbml0aW9ucywgYW5kIHRoZSB0YXNrcyBjb250YWluZXJzIGRvIG5vdCBoYXZlIGV4dGVybmFsIGNvbm5lY3Rpdml0eS4gVGhlIGBgaG9zdGBgIGFuZCBgYGF3c3ZwY2BgIG5ldHdvcmsgbW9kZXMgb2ZmZXIgdGhlIGhpZ2hlc3QgbmV0d29ya2luZyBwZXJmb3JtYW5jZSBmb3IgY29udGFpbmVycyBiZWNhdXNlIHRoZXkgdXNlIHRoZSBFQzIgbmV0d29yayBzdGFjayBpbnN0ZWFkIG9mIHRoZSB2aXJ0dWFsaXplZCBuZXR3b3JrIHN0YWNrIHByb3ZpZGVkIGJ5IHRoZSBgYGJyaWRnZWBgIG1vZGUuXG4gKiAgV2l0aCB0aGUgYGBob3N0YGAgYW5kIGBgYXdzdnBjYGAgbmV0d29yayBtb2RlcywgZXhwb3NlZCBjb250YWluZXIgcG9ydHMgYXJlIG1hcHBlZCBkaXJlY3RseSB0byB0aGUgY29ycmVzcG9uZGluZyBob3N0IHBvcnQgKGZvciB0aGUgYGBob3N0YGAgbmV0d29yayBtb2RlKSBvciB0aGUgYXR0YWNoZWQgZWxhc3RpYyBuZXR3b3JrIGludGVyZmFjZSBwb3J0IChmb3IgdGhlIGBgYXdzdnBjYGAgbmV0d29yayBtb2RlKSwgc28geW91IGNhbm5vdCB0YWtlIGFkdmFudGFnZSBvZiBkeW5hbWljIGhvc3QgcG9ydCBtYXBwaW5ncy4gXG4gKiAgIFdoZW4gdXNpbmcgdGhlIGBgaG9zdGBgIG5ldHdvcmsgbW9kZSwgeW91IHNob3VsZCBub3QgcnVuIGNvbnRhaW5lcnMgdXNpbmcgdGhlIHJvb3QgdXNlciAoVUlEIDApLiBJdCBpcyBjb25zaWRlcmVkIGJlc3QgcHJhY3RpY2UgdG8gdXNlIGEgbm9uLXJvb3QgdXNlci5cbiAqICAgSWYgdGhlIG5ldHdvcmsgbW9kZSBpcyBgYGF3c3ZwY2BgLCB0aGUgdGFzayBpcyBhbGxvY2F0ZWQgYW4gZWxhc3RpYyBuZXR3b3JrIGludGVyZmFjZSwgYW5kIHlvdSBtdXN0IHNwZWNpZnkgYSBbTmV0d29ya0NvbmZpZ3VyYXRpb25dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTmV0d29ya0NvbmZpZ3VyYXRpb24uaHRtbCkgdmFsdWUgd2hlbiB5b3UgY3JlYXRlIGEgc2VydmljZSBvciBydW4gYSB0YXNrIHdpdGggdGhlIHRhc2sgZGVmaW5pdGlvbi4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbVGFzayBOZXR3b3JraW5nXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS90YXNrLW5ldHdvcmtpbmcuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICogIElmIHRoZSBuZXR3b3JrIG1vZGUgaXMgYGBob3N0YGAsIHlvdSBjYW5ub3QgcnVuIG11bHRpcGxlIGluc3RhbnRpYXRpb25zIG9mIHRoZSBzYW1lIHRhc2sgb24gYSBzaW5nbGUgY29udGFpbmVyIGluc3RhbmNlIHdoZW4gcG9ydCBtYXBwaW5ncyBhcmUgdXNlZC5cbiAqL1xuTmV0d29ya01vZGU/OiBzdHJpbmdcbi8qKlxuICogVGhlIHByb2Nlc3MgbmFtZXNwYWNlIHRvIHVzZSBmb3IgdGhlIGNvbnRhaW5lcnMgaW4gdGhlIHRhc2suIFRoZSB2YWxpZCB2YWx1ZXMgYXJlIGBgaG9zdGBgIG9yIGBgdGFza2BgLiBPbiBGYXJnYXRlIGZvciBMaW51eCBjb250YWluZXJzLCB0aGUgb25seSB2YWxpZCB2YWx1ZSBpcyBgYHRhc2tgYC4gRm9yIGV4YW1wbGUsIG1vbml0b3Jpbmcgc2lkZWNhcnMgbWlnaHQgbmVlZCBgYHBpZE1vZGVgYCB0byBhY2Nlc3MgaW5mb3JtYXRpb24gYWJvdXQgb3RoZXIgY29udGFpbmVycyBydW5uaW5nIGluIHRoZSBzYW1lIHRhc2suXG4gKiAgSWYgYGBob3N0YGAgaXMgc3BlY2lmaWVkLCBhbGwgY29udGFpbmVycyB3aXRoaW4gdGhlIHRhc2tzIHRoYXQgc3BlY2lmaWVkIHRoZSBgYGhvc3RgYCBQSUQgbW9kZSBvbiB0aGUgc2FtZSBjb250YWluZXIgaW5zdGFuY2Ugc2hhcmUgdGhlIHNhbWUgcHJvY2VzcyBuYW1lc3BhY2Ugd2l0aCB0aGUgaG9zdCBBbWF6b24gRUMyIGluc3RhbmNlLlxuICogIElmIGBgdGFza2BgIGlzIHNwZWNpZmllZCwgYWxsIGNvbnRhaW5lcnMgd2l0aGluIHRoZSBzcGVjaWZpZWQgdGFzayBzaGFyZSB0aGUgc2FtZSBwcm9jZXNzIG5hbWVzcGFjZS5cbiAqICBJZiBubyB2YWx1ZSBpcyBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IGlzIGEgcHJpdmF0ZSBuYW1lc3BhY2UgZm9yIGVhY2ggY29udGFpbmVyLlxuICogIElmIHRoZSBgYGhvc3RgYCBQSUQgbW9kZSBpcyB1c2VkLCB0aGVyZSdzIGEgaGVpZ2h0ZW5lZCByaXNrIG9mIHVuZGVzaXJlZCBwcm9jZXNzIG5hbWVzcGFjZSBleHBvc3VyZS5cbiAqICAgVGhpcyBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZCBmb3IgV2luZG93cyBjb250YWluZXJzLlxuICogICAgVGhpcyBwYXJhbWV0ZXIgaXMgb25seSBzdXBwb3J0ZWQgZm9yIHRhc2tzIHRoYXQgYXJlIGhvc3RlZCBvbiBGQVJHQVRFbG9uZyBpZiB0aGUgdGFza3MgYXJlIHVzaW5nIHBsYXRmb3JtIHZlcnNpb24gYGAxLjQuMGBgIG9yIGxhdGVyIChMaW51eCkuIFRoaXMgaXNuJ3Qgc3VwcG9ydGVkIGZvciBXaW5kb3dzIGNvbnRhaW5lcnMgb24gRmFyZ2F0ZS5cbiAqL1xuUGlkTW9kZT86IHN0cmluZ1xuRW5hYmxlRmF1bHRJbmplY3Rpb24/OiBib29sZWFuXG4vKipcbiAqIFRoZSBBbWF6b24gUmVzb3VyY2UgTmFtZSAoQVJOKSBvZiB0aGUgdGFzayBleGVjdXRpb24gcm9sZSB0aGF0IGdyYW50cyB0aGUgQW1hem9uIEVDUyBjb250YWluZXIgYWdlbnQgcGVybWlzc2lvbiB0byBtYWtlIEFXUyBBUEkgY2FsbHMgb24geW91ciBiZWhhbGYuIEZvciBpbmZvcm1hdGlvbmFib3V0IHRoZSByZXF1aXJlZCBJQU0gcm9sZXMgZm9yIEFtYXpvbiBFQ1MsIHNlZSBbSUFNIHJvbGVzIGZvciBBbWF6b24gRUNTXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9zZWN1cml0eS1lY3MtaWFtLXJvbGUtb3ZlcnZpZXcuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5FeGVjdXRpb25Sb2xlQXJuPzogc3RyaW5nXG5SdW50aW1lUGxhdGZvcm0/OiBSdW50aW1lUGxhdGZvcm1cblByb3h5Q29uZmlndXJhdGlvbj86IFByb3h5Q29uZmlndXJhdGlvblxuLyoqXG4gKiBUaGUgbGlzdCBvZiBkYXRhIHZvbHVtZSBkZWZpbml0aW9ucyBmb3IgdGhlIHRhc2suIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1VzaW5nIGRhdGEgdm9sdW1lcyBpbiB0YXNrc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvdXNpbmdfZGF0YV92b2x1bWVzLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICAgVGhlIGBgaG9zdGBgIGFuZCBgYHNvdXJjZVBhdGhgYCBwYXJhbWV0ZXJzIGFyZW4ndCBzdXBwb3J0ZWQgZm9yIHRhc2tzIHJ1biBvbiBGQVJHQVRFbG9uZy5cbiAqL1xuVm9sdW1lcz86IFZvbHVtZVtdXG4vKipcbiAqIEEgbGlzdCBvZiBjb250YWluZXIgZGVmaW5pdGlvbnMgaW4gSlNPTiBmb3JtYXQgdGhhdCBkZXNjcmliZSB0aGUgZGlmZmVyZW50IGNvbnRhaW5lcnMgdGhhdCBtYWtlIHVwIHlvdXIgdGFzay4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgY29udGFpbmVyIGRlZmluaXRpb24gcGFyYW1ldGVycyBhbmQgZGVmYXVsdHMsIHNlZSBbQW1hem9uIEVDUyBUYXNrIERlZmluaXRpb25zXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS90YXNrX2RlZmludGlvbnMuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5Db250YWluZXJEZWZpbml0aW9ucz86IENvbnRhaW5lckRlZmluaXRpb25bXVxuLyoqXG4gKiBUaGUgbmFtZSBvZiBhIGZhbWlseSB0aGF0IHRoaXMgdGFzayBkZWZpbml0aW9uIGlzIHJlZ2lzdGVyZWQgdG8uIFVwIHRvIDI1NSBsZXR0ZXJzICh1cHBlcmNhc2UgYW5kIGxvd2VyY2FzZSksIG51bWJlcnMsIGh5cGhlbnMsIGFuZCB1bmRlcnNjb3JlcyBhcmUgYWxsb3dlZC5cbiAqICBBIGZhbWlseSBncm91cHMgbXVsdGlwbGUgdmVyc2lvbnMgb2YgYSB0YXNrIGRlZmluaXRpb24uIEFtYXpvbiBFQ1MgZ2l2ZXMgdGhlIGZpcnN0IHRhc2sgZGVmaW5pdGlvbiB0aGF0IHlvdSByZWdpc3RlcmVkIHRvIGEgZmFtaWx5IGEgcmV2aXNpb24gbnVtYmVyIG9mIDEuIEFtYXpvbiBFQ1MgZ2l2ZXMgc2VxdWVudGlhbCByZXZpc2lvbiBudW1iZXJzIHRvIGVhY2ggdGFzayBkZWZpbml0aW9uIHRoYXQgeW91IGFkZC5cbiAqICAgVG8gdXNlIHJldmlzaW9uIG51bWJlcnMgd2hlbiB5b3UgdXBkYXRlIGEgdGFzayBkZWZpbml0aW9uLCBzcGVjaWZ5IHRoaXMgcHJvcGVydHkuIElmIHlvdSBkb24ndCBzcGVjaWZ5IGEgdmFsdWUsIENGTmxvbmcgZ2VuZXJhdGVzIGEgbmV3IHRhc2sgZGVmaW5pdGlvbiBlYWNoIHRpbWUgdGhhdCB5b3UgdXBkYXRlIGl0LlxuICovXG5GYW1pbHk/OiBzdHJpbmdcbkVwaGVtZXJhbFN0b3JhZ2U/OiBFcGhlbWVyYWxTdG9yYWdlXG4vKipcbiAqIFRoZSBtZXRhZGF0YSB0aGF0IHlvdSBhcHBseSB0byB0aGUgdGFzayBkZWZpbml0aW9uIHRvIGhlbHAgeW91IGNhdGVnb3JpemUgYW5kIG9yZ2FuaXplIHRoZW0uIEVhY2ggdGFnIGNvbnNpc3RzIG9mIGEga2V5IGFuZCBhbiBvcHRpb25hbCB2YWx1ZS4gWW91IGRlZmluZSBib3RoIG9mIHRoZW0uXG4gKiAgVGhlIGZvbGxvd2luZyBiYXNpYyByZXN0cmljdGlvbnMgYXBwbHkgdG8gdGFnczpcbiAqICAgKyAgTWF4aW11bSBudW1iZXIgb2YgdGFncyBwZXIgcmVzb3VyY2UgLSA1MFxuICogICArICBGb3IgZWFjaCByZXNvdXJjZSwgZWFjaCB0YWcga2V5IG11c3QgYmUgdW5pcXVlLCBhbmQgZWFjaCB0YWcga2V5IGNhbiBoYXZlIG9ubHkgb25lIHZhbHVlLlxuICogICArICBNYXhpbXVtIGtleSBsZW5ndGggLSAxMjggVW5pY29kZSBjaGFyYWN0ZXJzIGluIFVURi04XG4gKiAgICsgIE1heGltdW0gdmFsdWUgbGVuZ3RoIC0gMjU2IFVuaWNvZGUgY2hhcmFjdGVycyBpbiBVVEYtOFxuICogICArICBJZiB5b3VyIHRhZ2dpbmcgc2NoZW1hIGlzIHVzZWQgYWNyb3NzIG11bHRpcGxlIHNlcnZpY2VzIGFuZCByZXNvdXJjZXMsIHJlbWVtYmVyIHRoYXQgb3RoZXIgc2VydmljZXMgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIGFsbG93ZWQgY2hhcmFjdGVycy4gR2VuZXJhbGx5IGFsbG93ZWQgY2hhcmFjdGVycyBhcmU6IGxldHRlcnMsIG51bWJlcnMsIGFuZCBzcGFjZXMgcmVwcmVzZW50YWJsZSBpbiBVVEYtOCwgYW5kIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyczogKyAtID0gLiBfIDogLyBALlxuICogICArICBUYWcga2V5cyBhbmQgdmFsdWVzIGFyZSBjYXNlLXNlbnNpdGl2ZS5cbiAqICAgKyAgRG8gbm90IHVzZSBgYGF3czpgYCwgYGBBV1M6YGAsIG9yIGFueSB1cHBlciBvciBsb3dlcmNhc2UgY29tYmluYXRpb24gb2Ygc3VjaCBhcyBhIHByZWZpeCBmb3IgZWl0aGVyIGtleXMgb3IgdmFsdWVzIGFzIGl0IGlzIHJlc2VydmVkIGZvciBBV1MgdXNlLiBZb3UgY2Fubm90IGVkaXQgb3IgZGVsZXRlIHRhZyBrZXlzIG9yIHZhbHVlcyB3aXRoIHRoaXMgcHJlZml4LiBUYWdzIHdpdGggdGhpcyBwcmVmaXggZG8gbm90IGNvdW50IGFnYWluc3QgeW91ciB0YWdzIHBlciByZXNvdXJjZSBsaW1pdC5cbiAqL1xuVGFncz86IFRhZ1tdXG5UYXNrRGVmaW5pdGlvbkFybj86IHN0cmluZ1xufVxuLyoqXG4gKiBEZXRhaWxzIG9uIGFuIEVsYXN0aWMgSW5mZXJlbmNlIGFjY2VsZXJhdG9yLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtXb3JraW5nIHdpdGggQW1hem9uIEVsYXN0aWMgSW5mZXJlbmNlIG9uIEFtYXpvbiBFQ1NdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2Vjcy1pbmZlcmVuY2UuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluZmVyZW5jZUFjY2VsZXJhdG9yIHtcbi8qKlxuICogVGhlIEVsYXN0aWMgSW5mZXJlbmNlIGFjY2VsZXJhdG9yIHR5cGUgdG8gdXNlLlxuICovXG5EZXZpY2VUeXBlPzogc3RyaW5nXG4vKipcbiAqIFRoZSBFbGFzdGljIEluZmVyZW5jZSBhY2NlbGVyYXRvciBkZXZpY2UgbmFtZS4gVGhlIGBgZGV2aWNlTmFtZWBgIG11c3QgYWxzbyBiZSByZWZlcmVuY2VkIGluIGEgY29udGFpbmVyIGRlZmluaXRpb24gYXMgYSBbUmVzb3VyY2VSZXF1aXJlbWVudF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9SZXNvdXJjZVJlcXVpcmVtZW50Lmh0bWwpLlxuICovXG5EZXZpY2VOYW1lPzogc3RyaW5nXG59XG4vKipcbiAqIFRoZSBjb25zdHJhaW50IG9uIHRhc2sgcGxhY2VtZW50IGluIHRoZSB0YXNrIGRlZmluaXRpb24uIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1Rhc2sgcGxhY2VtZW50IGNvbnN0cmFpbnRzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS90YXNrLXBsYWNlbWVudC1jb25zdHJhaW50cy5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKiAgIFRhc2sgcGxhY2VtZW50IGNvbnN0cmFpbnRzIGFyZW4ndCBzdXBwb3J0ZWQgZm9yIHRhc2tzIHJ1biBvbiBGQVJHQVRFbG9uZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYXNrRGVmaW5pdGlvblBsYWNlbWVudENvbnN0cmFpbnQge1xuLyoqXG4gKiBUaGUgdHlwZSBvZiBjb25zdHJhaW50LiBUaGUgYGBNZW1iZXJPZmBgIGNvbnN0cmFpbnQgcmVzdHJpY3RzIHNlbGVjdGlvbiB0byBiZSBmcm9tIGEgZ3JvdXAgb2YgdmFsaWQgY2FuZGlkYXRlcy5cbiAqL1xuVHlwZTogc3RyaW5nXG4vKipcbiAqIEEgY2x1c3RlciBxdWVyeSBsYW5ndWFnZSBleHByZXNzaW9uIHRvIGFwcGx5IHRvIHRoZSBjb25zdHJhaW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtDbHVzdGVyIHF1ZXJ5IGxhbmd1YWdlXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9jbHVzdGVyLXF1ZXJ5LWxhbmd1YWdlLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuRXhwcmVzc2lvbj86IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgb3BlcmF0aW5nIHN5c3RlbSB0aGF0IHlvdXIgdGFza3MgZGVmaW5pdGlvbnMgcnVuIG9uLiBBIHBsYXRmb3JtIGZhbWlseSBpcyBzcGVjaWZpZWQgb25seSBmb3IgdGFza3MgdXNpbmcgdGhlIEZhcmdhdGUgbGF1bmNoIHR5cGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVudGltZVBsYXRmb3JtIHtcbi8qKlxuICogVGhlIG9wZXJhdGluZyBzeXN0ZW0uXG4gKi9cbk9wZXJhdGluZ1N5c3RlbUZhbWlseT86IHN0cmluZ1xuLyoqXG4gKiBUaGUgQ1BVIGFyY2hpdGVjdHVyZS5cbiAqICBZb3UgY2FuIHJ1biB5b3VyIExpbnV4IHRhc2tzIG9uIGFuIEFSTS1iYXNlZCBwbGF0Zm9ybSBieSBzZXR0aW5nIHRoZSB2YWx1ZSB0byBgYEFSTTY0YGAuIFRoaXMgb3B0aW9uIGlzIGF2YWlsYWJsZSBmb3IgdGFza3MgdGhhdCBydW4gb24gTGludXggQW1hem9uIEVDMiBpbnN0YW5jZSBvciBMaW51eCBjb250YWluZXJzIG9uIEZhcmdhdGUuXG4gKi9cbkNwdUFyY2hpdGVjdHVyZT86IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgY29uZmlndXJhdGlvbiBkZXRhaWxzIGZvciB0aGUgQXBwIE1lc2ggcHJveHkuXG4gKiAgWW91ciBBbWF6b24gRUNTIGNvbnRhaW5lciBpbnN0YW5jZXMgcmVxdWlyZSBhdCBsZWFzdCB2ZXJzaW9uIDEuMjYuMCBvZiB0aGUgY29udGFpbmVyIGFnZW50IGFuZCBhdCBsZWFzdCB2ZXJzaW9uIDEuMjYuMC0xIG9mIHRoZSBgYGVjcy1pbml0YGAgcGFja2FnZSB0byB1c2UgYSBwcm94eSBjb25maWd1cmF0aW9uLiBJZiB5b3VyIGNvbnRhaW5lciBpbnN0YW5jZXMgYXJlIGxhdW5jaGVkIGZyb20gdGhlIEFtYXpvbiBFQ1Mgb3B0aW1pemVkIEFNSSB2ZXJzaW9uIGBgMjAxOTAzMDFgYCBvciBsYXRlciwgdGhleSBjb250YWluIHRoZSByZXF1aXJlZCB2ZXJzaW9ucyBvZiB0aGUgY29udGFpbmVyIGFnZW50IGFuZCBgYGVjcy1pbml0YGAuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0FtYXpvbiBFQ1Mtb3B0aW1pemVkIExpbnV4IEFNSV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvZWNzLW9wdGltaXplZF9BTUkuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb3h5Q29uZmlndXJhdGlvbiB7XG4vKipcbiAqIFRoZSBzZXQgb2YgbmV0d29yayBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgdG8gcHJvdmlkZSB0aGUgQ29udGFpbmVyIE5ldHdvcmsgSW50ZXJmYWNlIChDTkkpIHBsdWdpbiwgc3BlY2lmaWVkIGFzIGtleS12YWx1ZSBwYWlycy5cbiAqICAgKyAgIGBgSWdub3JlZFVJRGBgIC0gKFJlcXVpcmVkKSBUaGUgdXNlciBJRCAoVUlEKSBvZiB0aGUgcHJveHkgY29udGFpbmVyIGFzIGRlZmluZWQgYnkgdGhlIGBgdXNlcmBgIHBhcmFtZXRlciBpbiBhIGNvbnRhaW5lciBkZWZpbml0aW9uLiBUaGlzIGlzIHVzZWQgdG8gZW5zdXJlIHRoZSBwcm94eSBpZ25vcmVzIGl0cyBvd24gdHJhZmZpYy4gSWYgYGBJZ25vcmVkR0lEYGAgaXMgc3BlY2lmaWVkLCB0aGlzIGZpZWxkIGNhbiBiZSBlbXB0eS5cbiAqICAgKyAgIGBgSWdub3JlZEdJRGBgIC0gKFJlcXVpcmVkKSBUaGUgZ3JvdXAgSUQgKEdJRCkgb2YgdGhlIHByb3h5IGNvbnRhaW5lciBhcyBkZWZpbmVkIGJ5IHRoZSBgYHVzZXJgYCBwYXJhbWV0ZXIgaW4gYSBjb250YWluZXIgZGVmaW5pdGlvbi4gVGhpcyBpcyB1c2VkIHRvIGVuc3VyZSB0aGUgcHJveHkgaWdub3JlcyBpdHMgb3duIHRyYWZmaWMuIElmIGBgSWdub3JlZFVJRGBgIGlzIHNwZWNpZmllZCwgdGhpcyBmaWVsZCBjYW4gYmUgZW1wdHkuXG4gKiAgICsgICBgYEFwcFBvcnRzYGAgLSAoUmVxdWlyZWQpIFRoZSBsaXN0IG9mIHBvcnRzIHRoYXQgdGhlIGFwcGxpY2F0aW9uIHVzZXMuIE5ldHdvcmsgdHJhZmZpYyB0byB0aGVzZSBwb3J0cyBpcyBmb3J3YXJkZWQgdG8gdGhlIGBgUHJveHlJbmdyZXNzUG9ydGBgIGFuZCBgYFByb3h5RWdyZXNzUG9ydGBgLlxuICogICArICAgYGBQcm94eUluZ3Jlc3NQb3J0YGAgLSAoUmVxdWlyZWQpIFNwZWNpZmllcyB0aGUgcG9ydCB0aGF0IGluY29taW5nIHRyYWZmaWMgdG8gdGhlIGBgQXBwUG9ydHNgYCBpcyBkaXJlY3RlZCB0by5cbiAqICAgKyAgIGBgUHJveHlFZ3Jlc3NQb3J0YGAgLSAoUmVxdWlyZWQpIFNwZWNpZmllcyB0aGUgcG9ydCB0aGF0IG91dGdvaW5nIHRyYWZmaWMgZnJvbSB0aGUgYGBBcHBQb3J0c2BgIGlzIGRpcmVjdGVkIHRvLlxuICogICArICAgYGBFZ3Jlc3NJZ25vcmVkUG9ydHNgYCAtIChSZXF1aXJlZCkgVGhlIGVncmVzcyB0cmFmZmljIGdvaW5nIHRvIHRoZSBzcGVjaWZpZWQgcG9ydHMgaXMgaWdub3JlZCBhbmQgbm90IHJlZGlyZWN0ZWQgdG8gdGhlIGBgUHJveHlFZ3Jlc3NQb3J0YGAuIEl0IGNhbiBiZSBhbiBlbXB0eSBsaXN0LlxuICogICArICAgYGBFZ3Jlc3NJZ25vcmVkSVBzYGAgLSAoUmVxdWlyZWQpIFRoZSBlZ3Jlc3MgdHJhZmZpYyBnb2luZyB0byB0aGUgc3BlY2lmaWVkIElQIGFkZHJlc3NlcyBpcyBpZ25vcmVkIGFuZCBub3QgcmVkaXJlY3RlZCB0byB0aGUgYGBQcm94eUVncmVzc1BvcnRgYC4gSXQgY2FuIGJlIGFuIGVtcHR5IGxpc3QuXG4gKi9cblByb3h5Q29uZmlndXJhdGlvblByb3BlcnRpZXM/OiBLZXlWYWx1ZVBhaXJbXVxuLyoqXG4gKiBUaGUgcHJveHkgdHlwZS4gVGhlIG9ubHkgc3VwcG9ydGVkIHZhbHVlIGlzIGBgQVBQTUVTSGBgLlxuICovXG5UeXBlPzogc3RyaW5nXG4vKipcbiAqIFRoZSBuYW1lIG9mIHRoZSBjb250YWluZXIgdGhhdCB3aWxsIHNlcnZlIGFzIHRoZSBBcHAgTWVzaCBwcm94eS5cbiAqL1xuQ29udGFpbmVyTmFtZTogc3RyaW5nXG59XG4vKipcbiAqIEEga2V5LXZhbHVlIHBhaXIgb2JqZWN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEtleVZhbHVlUGFpciB7XG4vKipcbiAqIFRoZSB2YWx1ZSBvZiB0aGUga2V5LXZhbHVlIHBhaXIuIEZvciBlbnZpcm9ubWVudCB2YXJpYWJsZXMsIHRoaXMgaXMgdGhlIHZhbHVlIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAqL1xuVmFsdWU/OiBzdHJpbmdcbi8qKlxuICogVGhlIG5hbWUgb2YgdGhlIGtleS12YWx1ZSBwYWlyLiBGb3IgZW52aXJvbm1lbnQgdmFyaWFibGVzLCB0aGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAqL1xuTmFtZT86IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgZGF0YSB2b2x1bWUgY29uZmlndXJhdGlvbiBmb3IgdGFza3MgbGF1bmNoZWQgdXNpbmcgdGhpcyB0YXNrIGRlZmluaXRpb24uIFNwZWNpZnlpbmcgYSB2b2x1bWUgY29uZmlndXJhdGlvbiBpbiBhIHRhc2sgZGVmaW5pdGlvbiBpcyBvcHRpb25hbC4gVGhlIHZvbHVtZSBjb25maWd1cmF0aW9uIG1heSBjb250YWluIG11bHRpcGxlIHZvbHVtZXMgYnV0IG9ubHkgb25lIHZvbHVtZSBjb25maWd1cmVkIGF0IGxhdW5jaCBpcyBzdXBwb3J0ZWQuIEVhY2ggdm9sdW1lIGRlZmluZWQgaW4gdGhlIHZvbHVtZSBjb25maWd1cmF0aW9uIG1heSBvbmx5IHNwZWNpZnkgYSBgYG5hbWVgYCBhbmQgb25lIG9mIGVpdGhlciBgYGNvbmZpZ3VyZWRBdExhdW5jaGBgLCBgYGRvY2tlclZvbHVtZUNvbmZpZ3VyYXRpb25gYCwgYGBlZnNWb2x1bWVDb25maWd1cmF0aW9uYGAsIGBgZnN4V2luZG93c0ZpbGVTZXJ2ZXJWb2x1bWVDb25maWd1cmF0aW9uYGAsIG9yIGBgaG9zdGBgLiBJZiBhbiBlbXB0eSB2b2x1bWUgY29uZmlndXJhdGlvbiBpcyBzcGVjaWZpZWQsIGJ5IGRlZmF1bHQgQW1hem9uIEVDUyB1c2VzIGEgaG9zdCB2b2x1bWUuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1VzaW5nIGRhdGEgdm9sdW1lcyBpbiB0YXNrc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvdXNpbmdfZGF0YV92b2x1bWVzLmh0bWwpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZvbHVtZSB7XG5FRlNWb2x1bWVDb25maWd1cmF0aW9uPzogRUZTVm9sdW1lQ29uZmlndXJhdGlvblxuSG9zdD86IEhvc3RWb2x1bWVQcm9wZXJ0aWVzXG4vKipcbiAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSB2b2x1bWUgc2hvdWxkIGJlIGNvbmZpZ3VyZWQgYXQgbGF1bmNoIHRpbWUuIFRoaXMgaXMgdXNlZCB0byBjcmVhdGUgQW1hem9uIEVCUyB2b2x1bWVzIGZvciBzdGFuZGFsb25lIHRhc2tzIG9yIHRhc2tzIGNyZWF0ZWQgYXMgcGFydCBvZiBhIHNlcnZpY2UuIEVhY2ggdGFzayBkZWZpbml0aW9uIHJldmlzaW9uIG1heSBvbmx5IGhhdmUgb25lIHZvbHVtZSBjb25maWd1cmVkIGF0IGxhdW5jaCBpbiB0aGUgdm9sdW1lIGNvbmZpZ3VyYXRpb24uXG4gKiAgVG8gY29uZmlndXJlIGEgdm9sdW1lIGF0IGxhdW5jaCB0aW1lLCB1c2UgdGhpcyB0YXNrIGRlZmluaXRpb24gcmV2aXNpb24gYW5kIHNwZWNpZnkgYSBgYHZvbHVtZUNvbmZpZ3VyYXRpb25zYGAgb2JqZWN0IHdoZW4gY2FsbGluZyB0aGUgYGBDcmVhdGVTZXJ2aWNlYGAsIGBgVXBkYXRlU2VydmljZWBgLCBgYFJ1blRhc2tgYCBvciBgYFN0YXJ0VGFza2BgIEFQSXMuXG4gKi9cbkNvbmZpZ3VyZWRBdExhdW5jaD86IGJvb2xlYW5cbkRvY2tlclZvbHVtZUNvbmZpZ3VyYXRpb24/OiBEb2NrZXJWb2x1bWVDb25maWd1cmF0aW9uXG5GU3hXaW5kb3dzRmlsZVNlcnZlclZvbHVtZUNvbmZpZ3VyYXRpb24/OiBGU3hXaW5kb3dzRmlsZVNlcnZlclZvbHVtZUNvbmZpZ3VyYXRpb25cbi8qKlxuICogVGhlIG5hbWUgb2YgdGhlIHZvbHVtZS4gVXAgdG8gMjU1IGxldHRlcnMgKHVwcGVyY2FzZSBhbmQgbG93ZXJjYXNlKSwgbnVtYmVycywgdW5kZXJzY29yZXMsIGFuZCBoeXBoZW5zIGFyZSBhbGxvd2VkLlxuICogIFdoZW4gdXNpbmcgYSB2b2x1bWUgY29uZmlndXJlZCBhdCBsYXVuY2gsIHRoZSBgYG5hbWVgYCBpcyByZXF1aXJlZCBhbmQgbXVzdCBhbHNvIGJlIHNwZWNpZmllZCBhcyB0aGUgdm9sdW1lIG5hbWUgaW4gdGhlIGBgU2VydmljZVZvbHVtZUNvbmZpZ3VyYXRpb25gYCBvciBgYFRhc2tWb2x1bWVDb25maWd1cmF0aW9uYGAgcGFyYW1ldGVyIHdoZW4gY3JlYXRpbmcgeW91ciBzZXJ2aWNlIG9yIHN0YW5kYWxvbmUgdGFzay5cbiAqICBGb3IgYWxsIG90aGVyIHR5cGVzIG9mIHZvbHVtZXMsIHRoaXMgbmFtZSBpcyByZWZlcmVuY2VkIGluIHRoZSBgYHNvdXJjZVZvbHVtZWBgIHBhcmFtZXRlciBvZiB0aGUgYGBtb3VudFBvaW50c2BgIG9iamVjdCBpbiB0aGUgY29udGFpbmVyIGRlZmluaXRpb24uXG4gKiAgV2hlbiBhIHZvbHVtZSBpcyB1c2luZyB0aGUgYGBlZnNWb2x1bWVDb25maWd1cmF0aW9uYGAsIHRoZSBuYW1lIGlzIHJlcXVpcmVkLlxuICovXG5OYW1lPzogc3RyaW5nXG59XG4vKipcbiAqIFRoaXMgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCB3aGVuIHlvdSB1c2UgYW4gQW1hem9uIEVsYXN0aWMgRmlsZSBTeXN0ZW0gZmlsZSBzeXN0ZW0gZm9yIHRhc2sgc3RvcmFnZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFRlNWb2x1bWVDb25maWd1cmF0aW9uIHtcbi8qKlxuICogVGhlIEFtYXpvbiBFRlMgZmlsZSBzeXN0ZW0gSUQgdG8gdXNlLlxuICovXG5GaWxlc3lzdGVtSWQ6IHN0cmluZ1xuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gdXNlIGVuY3J5cHRpb24gZm9yIEFtYXpvbiBFRlMgZGF0YSBpbiB0cmFuc2l0IGJldHdlZW4gdGhlIEFtYXpvbiBFQ1MgaG9zdCBhbmQgdGhlIEFtYXpvbiBFRlMgc2VydmVyLiBUcmFuc2l0IGVuY3J5cHRpb24gbXVzdCBiZSB0dXJuZWQgb24gaWYgQW1hem9uIEVGUyBJQU0gYXV0aG9yaXphdGlvbiBpcyB1c2VkLiBJZiB0aGlzIHBhcmFtZXRlciBpcyBvbWl0dGVkLCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBgYERJU0FCTEVEYGAgaXMgdXNlZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbRW5jcnlwdGluZyBkYXRhIGluIHRyYW5zaXRdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9lZnMvbGF0ZXN0L3VnL2VuY3J5cHRpb24taW4tdHJhbnNpdC5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIEZpbGUgU3lzdGVtIFVzZXIgR3VpZGUqLlxuICovXG5UcmFuc2l0RW5jcnlwdGlvbj86IChcIkVOQUJMRURcIiB8IFwiRElTQUJMRURcIilcbkF1dGhvcml6YXRpb25Db25maWc/OiBBdXRob3JpemF0aW9uQ29uZmlnXG4vKipcbiAqIFRoZSBkaXJlY3Rvcnkgd2l0aGluIHRoZSBBbWF6b24gRUZTIGZpbGUgc3lzdGVtIHRvIG1vdW50IGFzIHRoZSByb290IGRpcmVjdG9yeSBpbnNpZGUgdGhlIGhvc3QuIElmIHRoaXMgcGFyYW1ldGVyIGlzIG9taXR0ZWQsIHRoZSByb290IG9mIHRoZSBBbWF6b24gRUZTIHZvbHVtZSB3aWxsIGJlIHVzZWQuIFNwZWNpZnlpbmcgYGAvYGAgd2lsbCBoYXZlIHRoZSBzYW1lIGVmZmVjdCBhcyBvbWl0dGluZyB0aGlzIHBhcmFtZXRlci5cbiAqICAgSWYgYW4gRUZTIGFjY2VzcyBwb2ludCBpcyBzcGVjaWZpZWQgaW4gdGhlIGBgYXV0aG9yaXphdGlvbkNvbmZpZ2BgLCB0aGUgcm9vdCBkaXJlY3RvcnkgcGFyYW1ldGVyIG11c3QgZWl0aGVyIGJlIG9taXR0ZWQgb3Igc2V0IHRvIGBgL2BgIHdoaWNoIHdpbGwgZW5mb3JjZSB0aGUgcGF0aCBzZXQgb24gdGhlIEVGUyBhY2Nlc3MgcG9pbnQuXG4gKi9cblJvb3REaXJlY3Rvcnk/OiBzdHJpbmdcbi8qKlxuICogVGhlIHBvcnQgdG8gdXNlIHdoZW4gc2VuZGluZyBlbmNyeXB0ZWQgZGF0YSBiZXR3ZWVuIHRoZSBBbWF6b24gRUNTIGhvc3QgYW5kIHRoZSBBbWF6b24gRUZTIHNlcnZlci4gSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGEgdHJhbnNpdCBlbmNyeXB0aW9uIHBvcnQsIGl0IHdpbGwgdXNlIHRoZSBwb3J0IHNlbGVjdGlvbiBzdHJhdGVneSB0aGF0IHRoZSBBbWF6b24gRUZTIG1vdW50IGhlbHBlciB1c2VzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtFRlMgbW91bnQgaGVscGVyXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZWZzL2xhdGVzdC91Zy9lZnMtbW91bnQtaGVscGVyLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgRmlsZSBTeXN0ZW0gVXNlciBHdWlkZSouXG4gKi9cblRyYW5zaXRFbmNyeXB0aW9uUG9ydD86IG51bWJlclxufVxuLyoqXG4gKiBUaGUgYXV0aG9yaXphdGlvbiBjb25maWd1cmF0aW9uIGRldGFpbHMgZm9yIHRoZSBBbWF6b24gRUZTIGZpbGUgc3lzdGVtLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhvcml6YXRpb25Db25maWcge1xuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gdXNlIHRoZSBBbWF6b24gRUNTIHRhc2sgcm9sZSBkZWZpbmVkIGluIGEgdGFzayBkZWZpbml0aW9uIHdoZW4gbW91bnRpbmcgdGhlIEFtYXpvbiBFRlMgZmlsZSBzeXN0ZW0uIElmIGl0IGlzIHR1cm5lZCBvbiwgdHJhbnNpdCBlbmNyeXB0aW9uIG11c3QgYmUgdHVybmVkIG9uIGluIHRoZSBgYEVGU1ZvbHVtZUNvbmZpZ3VyYXRpb25gYC4gSWYgdGhpcyBwYXJhbWV0ZXIgaXMgb21pdHRlZCwgdGhlIGRlZmF1bHQgdmFsdWUgb2YgYGBESVNBQkxFRGBgIGlzIHVzZWQuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1VzaW5nIEFtYXpvbiBFRlMgYWNjZXNzIHBvaW50c10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvZWZzLXZvbHVtZXMuaHRtbCNlZnMtdm9sdW1lLWFjY2Vzc3BvaW50cykgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5JQU0/OiAoXCJFTkFCTEVEXCIgfCBcIkRJU0FCTEVEXCIpXG4vKipcbiAqIFRoZSBBbWF6b24gRUZTIGFjY2VzcyBwb2ludCBJRCB0byB1c2UuIElmIGFuIGFjY2VzcyBwb2ludCBpcyBzcGVjaWZpZWQsIHRoZSByb290IGRpcmVjdG9yeSB2YWx1ZSBzcGVjaWZpZWQgaW4gdGhlIGBgRUZTVm9sdW1lQ29uZmlndXJhdGlvbmBgIG11c3QgZWl0aGVyIGJlIG9taXR0ZWQgb3Igc2V0IHRvIGBgL2BgIHdoaWNoIHdpbGwgZW5mb3JjZSB0aGUgcGF0aCBzZXQgb24gdGhlIEVGUyBhY2Nlc3MgcG9pbnQuIElmIGFuIGFjY2VzcyBwb2ludCBpcyB1c2VkLCB0cmFuc2l0IGVuY3J5cHRpb24gbXVzdCBiZSBvbiBpbiB0aGUgYGBFRlNWb2x1bWVDb25maWd1cmF0aW9uYGAuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1dvcmtpbmcgd2l0aCBBbWF6b24gRUZTIGFjY2VzcyBwb2ludHNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9lZnMvbGF0ZXN0L3VnL2Vmcy1hY2Nlc3MtcG9pbnRzLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgRmlsZSBTeXN0ZW0gVXNlciBHdWlkZSouXG4gKi9cbkFjY2Vzc1BvaW50SWQ/OiBzdHJpbmdcbn1cbi8qKlxuICogVGhpcyBwYXJhbWV0ZXIgaXMgc3BlY2lmaWVkIHdoZW4geW91IHVzZSBiaW5kIG1vdW50IGhvc3Qgdm9sdW1lcy4gVGhlIGNvbnRlbnRzIG9mIHRoZSBgYGhvc3RgYCBwYXJhbWV0ZXIgZGV0ZXJtaW5lIHdoZXRoZXIgeW91ciBiaW5kIG1vdW50IGhvc3Qgdm9sdW1lIHBlcnNpc3RzIG9uIHRoZSBob3N0IGNvbnRhaW5lciBpbnN0YW5jZSBhbmQgd2hlcmUgaXQncyBzdG9yZWQuIElmIHRoZSBgYGhvc3RgYCBwYXJhbWV0ZXIgaXMgZW1wdHksIHRoZW4gdGhlIERvY2tlciBkYWVtb24gYXNzaWducyBhIGhvc3QgcGF0aCBmb3IgeW91ciBkYXRhIHZvbHVtZS4gSG93ZXZlciwgdGhlIGRhdGEgaXNuJ3QgZ3VhcmFudGVlZCB0byBwZXJzaXN0IGFmdGVyIHRoZSBjb250YWluZXJzIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCBpdCBzdG9wIHJ1bm5pbmcuXG4gKiAgV2luZG93cyBjb250YWluZXJzIGNhbiBtb3VudCB3aG9sZSBkaXJlY3RvcmllcyBvbiB0aGUgc2FtZSBkcml2ZSBhcyBgYCRlbnY6UHJvZ3JhbURhdGFgYC4gV2luZG93cyBjb250YWluZXJzIGNhbid0IG1vdW50IGRpcmVjdG9yaWVzIG9uIGEgZGlmZmVyZW50IGRyaXZlLCBhbmQgbW91bnQgcG9pbnQgY2FuJ3QgYmUgYWNyb3NzIGRyaXZlcy4gRm9yIGV4YW1wbGUsIHlvdSBjYW4gbW91bnQgYGBDOlxcbXlcXHBhdGg6QzpcXG15XFxwYXRoYGAgYW5kIGBgRDpcXDpEOlxcYGAsIGJ1dCBub3QgYGBEOlxcbXlcXHBhdGg6QzpcXG15XFxwYXRoYGAgb3IgYGBEOlxcOkM6XFxteVxccGF0aGBgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhvc3RWb2x1bWVQcm9wZXJ0aWVzIHtcbi8qKlxuICogV2hlbiB0aGUgYGBob3N0YGAgcGFyYW1ldGVyIGlzIHVzZWQsIHNwZWNpZnkgYSBgYHNvdXJjZVBhdGhgYCB0byBkZWNsYXJlIHRoZSBwYXRoIG9uIHRoZSBob3N0IGNvbnRhaW5lciBpbnN0YW5jZSB0aGF0J3MgcHJlc2VudGVkIHRvIHRoZSBjb250YWluZXIuIElmIHRoaXMgcGFyYW1ldGVyIGlzIGVtcHR5LCB0aGVuIHRoZSBEb2NrZXIgZGFlbW9uIGhhcyBhc3NpZ25lZCBhIGhvc3QgcGF0aCBmb3IgeW91LiBJZiB0aGUgYGBob3N0YGAgcGFyYW1ldGVyIGNvbnRhaW5zIGEgYGBzb3VyY2VQYXRoYGAgZmlsZSBsb2NhdGlvbiwgdGhlbiB0aGUgZGF0YSB2b2x1bWUgcGVyc2lzdHMgYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbiBvbiB0aGUgaG9zdCBjb250YWluZXIgaW5zdGFuY2UgdW50aWwgeW91IGRlbGV0ZSBpdCBtYW51YWxseS4gSWYgdGhlIGBgc291cmNlUGF0aGBgIHZhbHVlIGRvZXNuJ3QgZXhpc3Qgb24gdGhlIGhvc3QgY29udGFpbmVyIGluc3RhbmNlLCB0aGUgRG9ja2VyIGRhZW1vbiBjcmVhdGVzIGl0LiBJZiB0aGUgbG9jYXRpb24gZG9lcyBleGlzdCwgdGhlIGNvbnRlbnRzIG9mIHRoZSBzb3VyY2UgcGF0aCBmb2xkZXIgYXJlIGV4cG9ydGVkLlxuICogIElmIHlvdSdyZSB1c2luZyB0aGUgRmFyZ2F0ZSBsYXVuY2ggdHlwZSwgdGhlIGBgc291cmNlUGF0aGBgIHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkLlxuICovXG5Tb3VyY2VQYXRoPzogc3RyaW5nXG59XG4vKipcbiAqIFRoaXMgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCB3aGVuIHlvdSB1c2UgRG9ja2VyIHZvbHVtZXMuXG4gKiAgV2luZG93cyBjb250YWluZXJzIG9ubHkgc3VwcG9ydCB0aGUgdXNlIG9mIHRoZSBgYGxvY2FsYGAgZHJpdmVyLiBUbyB1c2UgYmluZCBtb3VudHMsIHNwZWNpZnkgdGhlIGBgaG9zdGBgIHBhcmFtZXRlciBpbnN0ZWFkLlxuICogICBEb2NrZXIgdm9sdW1lcyBhcmVuJ3Qgc3VwcG9ydGVkIGJ5IHRhc2tzIHJ1biBvbiBGQVJHQVRFbG9uZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb2NrZXJWb2x1bWVDb25maWd1cmF0aW9uIHtcbi8qKlxuICogQSBtYXAgb2YgRG9ja2VyIGRyaXZlci1zcGVjaWZpYyBvcHRpb25zIHBhc3NlZCB0aHJvdWdoLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgRHJpdmVyT3B0c2BgIGluIHRoZSBkb2NrZXIgY3JlYXRlLXZvbHVtZSBjb21tYW5kIGFuZCB0aGUgYGB4eG9wdGBgIG9wdGlvbiB0byBkb2NrZXIgdm9sdW1lIGNyZWF0ZS5cbiAqL1xuRHJpdmVyT3B0cz86IHtcbi8qKlxuICogVGhpcyBpbnRlcmZhY2Ugd2FzIHJlZmVyZW5jZWQgYnkgYHVuZGVmaW5lZGAncyBKU09OLVNjaGVtYSBkZWZpbml0aW9uXG4gKiB2aWEgdGhlIGBwYXR0ZXJuUHJvcGVydHlgIFwiLnsxLH1cIi5cbiAqL1xuW2s6IHN0cmluZ106IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgc2NvcGUgZm9yIHRoZSBEb2NrZXIgdm9sdW1lIHRoYXQgZGV0ZXJtaW5lcyBpdHMgbGlmZWN5Y2xlLiBEb2NrZXIgdm9sdW1lcyB0aGF0IGFyZSBzY29wZWQgdG8gYSBgYHRhc2tgYCBhcmUgYXV0b21hdGljYWxseSBwcm92aXNpb25lZCB3aGVuIHRoZSB0YXNrIHN0YXJ0cyBhbmQgZGVzdHJveWVkIHdoZW4gdGhlIHRhc2sgc3RvcHMuIERvY2tlciB2b2x1bWVzIHRoYXQgYXJlIHNjb3BlZCBhcyBgYHNoYXJlZGBgIHBlcnNpc3QgYWZ0ZXIgdGhlIHRhc2sgc3RvcHMuXG4gKi9cblNjb3BlPzogc3RyaW5nXG4vKipcbiAqIElmIHRoaXMgdmFsdWUgaXMgYGB0cnVlYGAsIHRoZSBEb2NrZXIgdm9sdW1lIGlzIGNyZWF0ZWQgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LlxuICogICBUaGlzIGZpZWxkIGlzIG9ubHkgdXNlZCBpZiB0aGUgYGBzY29wZWBgIGlzIGBgc2hhcmVkYGAuXG4gKi9cbkF1dG9wcm92aXNpb24/OiBib29sZWFuXG4vKipcbiAqIFRoZSBEb2NrZXIgdm9sdW1lIGRyaXZlciB0byB1c2UuIFRoZSBkcml2ZXIgdmFsdWUgbXVzdCBtYXRjaCB0aGUgZHJpdmVyIG5hbWUgcHJvdmlkZWQgYnkgRG9ja2VyIGJlY2F1c2UgaXQgaXMgdXNlZCBmb3IgdGFzayBwbGFjZW1lbnQuIElmIHRoZSBkcml2ZXIgd2FzIGluc3RhbGxlZCB1c2luZyB0aGUgRG9ja2VyIHBsdWdpbiBDTEksIHVzZSBgYGRvY2tlciBwbHVnaW4gbHNgYCB0byByZXRyaWV2ZSB0aGUgZHJpdmVyIG5hbWUgZnJvbSB5b3VyIGNvbnRhaW5lciBpbnN0YW5jZS4gSWYgdGhlIGRyaXZlciB3YXMgaW5zdGFsbGVkIHVzaW5nIGFub3RoZXIgbWV0aG9kLCB1c2UgRG9ja2VyIHBsdWdpbiBkaXNjb3ZlcnkgdG8gcmV0cmlldmUgdGhlIGRyaXZlciBuYW1lLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgRHJpdmVyYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYHh4ZHJpdmVyYGAgb3B0aW9uIHRvIGRvY2tlciB2b2x1bWUgY3JlYXRlLlxuICovXG5Ecml2ZXI/OiBzdHJpbmdcbi8qKlxuICogQ3VzdG9tIG1ldGFkYXRhIHRvIGFkZCB0byB5b3VyIERvY2tlciB2b2x1bWUuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBMYWJlbHNgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgeHhsYWJlbGBgIG9wdGlvbiB0byBkb2NrZXIgdm9sdW1lIGNyZWF0ZS5cbiAqL1xuTGFiZWxzPzoge1xuLyoqXG4gKiBUaGlzIGludGVyZmFjZSB3YXMgcmVmZXJlbmNlZCBieSBgdW5kZWZpbmVkYCdzIEpTT04tU2NoZW1hIGRlZmluaXRpb25cbiAqIHZpYSB0aGUgYHBhdHRlcm5Qcm9wZXJ0eWAgXCIuezEsfVwiLlxuICovXG5bazogc3RyaW5nXTogc3RyaW5nXG59XG59XG4vKipcbiAqIFRoaXMgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCB3aGVuIHlvdSB1c2UgQW1hem9uIEZTeCBmb3IgV2luZG93cyBGaWxlIFNlcnZlciBmaWxlIHN5c3RlbSBmb3IgdGFzayBzdG9yYWdlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZTeFdpbmRvd3NGaWxlU2VydmVyVm9sdW1lQ29uZmlndXJhdGlvbiB7XG5BdXRob3JpemF0aW9uQ29uZmlnPzogRlN4QXV0aG9yaXphdGlvbkNvbmZpZ1xuLyoqXG4gKiBUaGUgQW1hem9uIEZTeCBmb3IgV2luZG93cyBGaWxlIFNlcnZlciBmaWxlIHN5c3RlbSBJRCB0byB1c2UuXG4gKi9cbkZpbGVTeXN0ZW1JZDogc3RyaW5nXG4vKipcbiAqIFRoZSBkaXJlY3Rvcnkgd2l0aGluIHRoZSBBbWF6b24gRlN4IGZvciBXaW5kb3dzIEZpbGUgU2VydmVyIGZpbGUgc3lzdGVtIHRvIG1vdW50IGFzIHRoZSByb290IGRpcmVjdG9yeSBpbnNpZGUgdGhlIGhvc3QuXG4gKi9cblJvb3REaXJlY3Rvcnk6IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgYXV0aG9yaXphdGlvbiBjb25maWd1cmF0aW9uIGRldGFpbHMgZm9yIHRoZSBBbWF6b24gRlN4IGZvciBXaW5kb3dzIEZpbGUgU2VydmVyIGZpbGUgc3lzdGVtLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZTeEF1dGhvcml6YXRpb25Db25maWcge1xuLyoqXG4gKiBUaGUgYXV0aG9yaXphdGlvbiBjcmVkZW50aWFsIG9wdGlvbiB0byB1c2UuIFRoZSBhdXRob3JpemF0aW9uIGNyZWRlbnRpYWwgb3B0aW9ucyBjYW4gYmUgcHJvdmlkZWQgdXNpbmcgZWl0aGVyIHRoZSBBbWF6b24gUmVzb3VyY2UgTmFtZSAoQVJOKSBvZiBhbiBBU01sb25nIHNlY3JldCBvciBTU00gUGFyYW1ldGVyIFN0b3JlIHBhcmFtZXRlci4gVGhlIEFSTiByZWZlcnMgdG8gdGhlIHN0b3JlZCBjcmVkZW50aWFscy5cbiAqL1xuQ3JlZGVudGlhbHNQYXJhbWV0ZXI6IHN0cmluZ1xuLyoqXG4gKiBBIGZ1bGx5IHF1YWxpZmllZCBkb21haW4gbmFtZSBob3N0ZWQgYnkgYW4gW10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RpcmVjdG9yeXNlcnZpY2UvbGF0ZXN0L2FkbWluLWd1aWRlL2RpcmVjdG9yeV9taWNyb3NvZnRfYWQuaHRtbCkgTWFuYWdlZCBNaWNyb3NvZnQgQUQgKEFjdGl2ZSBEaXJlY3RvcnkpIG9yIHNlbGYtaG9zdGVkIEFEIG9uIEFtYXpvbiBFQzIuXG4gKi9cbkRvbWFpbjogc3RyaW5nXG59XG4vKipcbiAqIFRoZSBgYENvbnRhaW5lckRlZmluaXRpb25gYCBwcm9wZXJ0eSBzcGVjaWZpZXMgYSBjb250YWluZXIgZGVmaW5pdGlvbi4gQ29udGFpbmVyIGRlZmluaXRpb25zIGFyZSB1c2VkIGluIHRhc2sgZGVmaW5pdGlvbnMgdG8gZGVzY3JpYmUgdGhlIGRpZmZlcmVudCBjb250YWluZXJzIHRoYXQgYXJlIGxhdW5jaGVkIGFzIHBhcnQgb2YgYSB0YXNrLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRhaW5lckRlZmluaXRpb24ge1xuLyoqXG4gKiBUaGUgdXNlciB0byB1c2UgaW5zaWRlIHRoZSBjb250YWluZXIuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBVc2VyYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYC0tdXNlcmBgIG9wdGlvbiB0byBkb2NrZXIgcnVuLlxuICogICBXaGVuIHJ1bm5pbmcgdGFza3MgdXNpbmcgdGhlIGBgaG9zdGBgIG5ldHdvcmsgbW9kZSwgZG9uJ3QgcnVuIGNvbnRhaW5lcnMgdXNpbmcgdGhlIHJvb3QgdXNlciAoVUlEIDApLiBXZSByZWNvbW1lbmQgdXNpbmcgYSBub24tcm9vdCB1c2VyIGZvciBiZXR0ZXIgc2VjdXJpdHkuXG4gKiAgIFlvdSBjYW4gc3BlY2lmeSB0aGUgYGB1c2VyYGAgdXNpbmcgdGhlIGZvbGxvd2luZyBmb3JtYXRzLiBJZiBzcGVjaWZ5aW5nIGEgVUlEIG9yIEdJRCwgeW91IG11c3Qgc3BlY2lmeSBpdCBhcyBhIHBvc2l0aXZlIGludGVnZXIuXG4gKiAgICsgICBgYHVzZXJgYCBcbiAqICAgKyAgIGBgdXNlcjpncm91cGBgIFxuICogICArICAgYGB1aWRgYCBcbiAqICAgKyAgIGBgdWlkOmdpZGBgIFxuICogICArICAgYGB1c2VyOmdpZGBgIFxuICogICArICAgYGB1aWQ6Z3JvdXBgYCBcbiAqICAgXG4gKiAgIFRoaXMgcGFyYW1ldGVyIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIFdpbmRvd3MgY29udGFpbmVycy5cbiAqL1xuVXNlcj86IHN0cmluZ1xuLyoqXG4gKiBUaGUgc2VjcmV0cyB0byBwYXNzIHRvIHRoZSBjb250YWluZXIuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1NwZWNpZnlpbmcgU2Vuc2l0aXZlIERhdGFdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3NwZWNpZnlpbmctc2Vuc2l0aXZlLWRhdGEuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5TZWNyZXRzPzogU2VjcmV0W11cbi8qKlxuICogVGhlIGFtb3VudCAoaW4gTWlCKSBvZiBtZW1vcnkgdG8gcHJlc2VudCB0byB0aGUgY29udGFpbmVyLiBJZiB5b3VyIGNvbnRhaW5lciBhdHRlbXB0cyB0byBleGNlZWQgdGhlIG1lbW9yeSBzcGVjaWZpZWQgaGVyZSwgdGhlIGNvbnRhaW5lciBpcyBraWxsZWQuIFRoZSB0b3RhbCBhbW91bnQgb2YgbWVtb3J5IHJlc2VydmVkIGZvciBhbGwgY29udGFpbmVycyB3aXRoaW4gYSB0YXNrIG11c3QgYmUgbG93ZXIgdGhhbiB0aGUgdGFzayBgYG1lbW9yeWBgIHZhbHVlLCBpZiBvbmUgaXMgc3BlY2lmaWVkLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgTWVtb3J5YGAgaW4gdGhlIFtDcmVhdGUgYSBjb250YWluZXJdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9odHRwczovL2RvY3MuZG9ja2VyLmNvbS9lbmdpbmUvYXBpL3YxLjM1LyNvcGVyYXRpb24vQ29udGFpbmVyQ3JlYXRlKSBzZWN0aW9uIG9mIHRoZSBbRG9ja2VyIFJlbW90ZSBBUEldKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9odHRwczovL2RvY3MuZG9ja2VyLmNvbS9lbmdpbmUvYXBpL3YxLjM1LykgYW5kIHRoZSBgYC0tbWVtb3J5YGAgb3B0aW9uIHRvIFtkb2NrZXIgcnVuXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaHR0cHM6Ly9kb2NzLmRvY2tlci5jb20vZW5naW5lL3JlZmVyZW5jZS9ydW4vI3NlY3VyaXR5LWNvbmZpZ3VyYXRpb24pLlxuICogIElmIHVzaW5nIHRoZSBGYXJnYXRlIGxhdW5jaCB0eXBlLCB0aGlzIHBhcmFtZXRlciBpcyBvcHRpb25hbC5cbiAqICBJZiB1c2luZyB0aGUgRUMyIGxhdW5jaCB0eXBlLCB5b3UgbXVzdCBzcGVjaWZ5IGVpdGhlciBhIHRhc2stbGV2ZWwgbWVtb3J5IHZhbHVlIG9yIGEgY29udGFpbmVyLWxldmVsIG1lbW9yeSB2YWx1ZS4gSWYgeW91IHNwZWNpZnkgYm90aCBhIGNvbnRhaW5lci1sZXZlbCBgYG1lbW9yeWBgIGFuZCBgYG1lbW9yeVJlc2VydmF0aW9uYGAgdmFsdWUsIGBgbWVtb3J5YGAgbXVzdCBiZSBncmVhdGVyIHRoYW4gYGBtZW1vcnlSZXNlcnZhdGlvbmBgLiBJZiB5b3Ugc3BlY2lmeSBgYG1lbW9yeVJlc2VydmF0aW9uYGAsIHRoZW4gdGhhdCB2YWx1ZSBpcyBzdWJ0cmFjdGVkIGZyb20gdGhlIGF2YWlsYWJsZSBtZW1vcnkgcmVzb3VyY2VzIGZvciB0aGUgY29udGFpbmVyIGluc3RhbmNlIHdoZXJlIHRoZSBjb250YWluZXIgaXMgcGxhY2VkLiBPdGhlcndpc2UsIHRoZSB2YWx1ZSBvZiBgYG1lbW9yeWBgIGlzIHVzZWQuXG4gKiAgVGhlIERvY2tlciAyMC4xMC4wIG9yIGxhdGVyIGRhZW1vbiByZXNlcnZlcyBhIG1pbmltdW0gb2YgNiBNaUIgb2YgbWVtb3J5IGZvciBhIGNvbnRhaW5lciwgc28geW91IHNob3VsZCBub3Qgc3BlY2lmeSBmZXdlciB0aGFuIDYgTWlCIG9mIG1lbW9yeSBmb3IgeW91ciBjb250YWluZXJzLlxuICogIFRoZSBEb2NrZXIgMTkuMDMuMTMtY2Ugb3IgZWFybGllciBkYWVtb24gcmVzZXJ2ZXMgYSBtaW5pbXVtIG9mIDQgTWlCIG9mIG1lbW9yeSBmb3IgYSBjb250YWluZXIsIHNvIHlvdSBzaG91bGQgbm90IHNwZWNpZnkgZmV3ZXIgdGhhbiA0IE1pQiBvZiBtZW1vcnkgZm9yIHlvdXIgY29udGFpbmVycy5cbiAqL1xuTWVtb3J5PzogbnVtYmVyXG4vKipcbiAqIFdoZW4gdGhpcyBwYXJhbWV0ZXIgaXMgdHJ1ZSwgdGhlIGNvbnRhaW5lciBpcyBnaXZlbiBlbGV2YXRlZCBwcml2aWxlZ2VzIG9uIHRoZSBob3N0IGNvbnRhaW5lciBpbnN0YW5jZSAoc2ltaWxhciB0byB0aGUgYGByb290YGAgdXNlcikuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBQcml2aWxlZ2VkYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYC0tcHJpdmlsZWdlZGBgIG9wdGlvbiB0byBkb2NrZXIgcnVuXG4gKiAgIFRoaXMgcGFyYW1ldGVyIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIFdpbmRvd3MgY29udGFpbmVycyBvciB0YXNrcyBydW4gb24gRkFSR0FURWxvbmcuXG4gKi9cblByaXZpbGVnZWQ/OiBib29sZWFuXG5IZWFsdGhDaGVjaz86IEhlYWx0aENoZWNrXG4vKipcbiAqIFRpbWUgZHVyYXRpb24gKGluIHNlY29uZHMpIHRvIHdhaXQgYmVmb3JlIGdpdmluZyB1cCBvbiByZXNvbHZpbmcgZGVwZW5kZW5jaWVzIGZvciBhIGNvbnRhaW5lci4gRm9yIGV4YW1wbGUsIHlvdSBzcGVjaWZ5IHR3byBjb250YWluZXJzIGluIGEgdGFzayBkZWZpbml0aW9uIHdpdGggY29udGFpbmVyQSBoYXZpbmcgYSBkZXBlbmRlbmN5IG9uIGNvbnRhaW5lckIgcmVhY2hpbmcgYSBgYENPTVBMRVRFYGAsIGBgU1VDQ0VTU2BgLCBvciBgYEhFQUxUSFlgYCBzdGF0dXMuIElmIGEgYGBzdGFydFRpbWVvdXRgYCB2YWx1ZSBpcyBzcGVjaWZpZWQgZm9yIGNvbnRhaW5lckIgYW5kIGl0IGRvZXNuJ3QgcmVhY2ggdGhlIGRlc2lyZWQgc3RhdHVzIHdpdGhpbiB0aGF0IHRpbWUgdGhlbiBjb250YWluZXJBIGdpdmVzIHVwIGFuZCBub3Qgc3RhcnQuIFRoaXMgcmVzdWx0cyBpbiB0aGUgdGFzayB0cmFuc2l0aW9uaW5nIHRvIGEgYGBTVE9QUEVEYGAgc3RhdGUuXG4gKiAgIFdoZW4gdGhlIGBgRUNTX0NPTlRBSU5FUl9TVEFSVF9USU1FT1VUYGAgY29udGFpbmVyIGFnZW50IGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgaXMgdXNlZCwgaXQncyBlbmZvcmNlZCBpbmRlcGVuZGVudGx5IGZyb20gdGhpcyBzdGFydCB0aW1lb3V0IHZhbHVlLlxuICogICBGb3IgdGFza3MgdXNpbmcgdGhlIEZhcmdhdGUgbGF1bmNoIHR5cGUsIHRoZSB0YXNrIG9yIHNlcnZpY2UgcmVxdWlyZXMgdGhlIGZvbGxvd2luZyBwbGF0Zm9ybXM6XG4gKiAgICsgIExpbnV4IHBsYXRmb3JtIHZlcnNpb24gYGAxLjMuMGBgIG9yIGxhdGVyLlxuICogICArICBXaW5kb3dzIHBsYXRmb3JtIHZlcnNpb24gYGAxLjAuMGBgIG9yIGxhdGVyLlxuICogICBcbiAqICBGb3IgdGFza3MgdXNpbmcgdGhlIEVDMiBsYXVuY2ggdHlwZSwgeW91ciBjb250YWluZXIgaW5zdGFuY2VzIHJlcXVpcmUgYXQgbGVhc3QgdmVyc2lvbiBgYDEuMjYuMGBgIG9mIHRoZSBjb250YWluZXIgYWdlbnQgdG8gdXNlIGEgY29udGFpbmVyIHN0YXJ0IHRpbWVvdXQgdmFsdWUuIEhvd2V2ZXIsIHdlIHJlY29tbWVuZCB1c2luZyB0aGUgbGF0ZXN0IGNvbnRhaW5lciBhZ2VudCB2ZXJzaW9uLiBGb3IgaW5mb3JtYXRpb24gYWJvdXQgY2hlY2tpbmcgeW91ciBhZ2VudCB2ZXJzaW9uIGFuZCB1cGRhdGluZyB0byB0aGUgbGF0ZXN0IHZlcnNpb24sIHNlZSBbVXBkYXRpbmcgdGhlIEFtYXpvbiBFQ1MgQ29udGFpbmVyIEFnZW50XShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9lY3MtYWdlbnQtdXBkYXRlLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi4gSWYgeW91J3JlIHVzaW5nIGFuIEFtYXpvbiBFQ1Mtb3B0aW1pemVkIExpbnV4IEFNSSwgeW91ciBpbnN0YW5jZSBuZWVkcyBhdCBsZWFzdCB2ZXJzaW9uIGBgMS4yNi4wLTFgYCBvZiB0aGUgYGBlY3MtaW5pdGBgIHBhY2thZ2UuIElmIHlvdXIgY29udGFpbmVyIGluc3RhbmNlcyBhcmUgbGF1bmNoZWQgZnJvbSB2ZXJzaW9uIGBgMjAxOTAzMDFgYCBvciBsYXRlciwgdGhlbiB0aGV5IGNvbnRhaW4gdGhlIHJlcXVpcmVkIHZlcnNpb25zIG9mIHRoZSBjb250YWluZXIgYWdlbnQgYW5kIGBgZWNzLWluaXRgYC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQW1hem9uIEVDUy1vcHRpbWl6ZWQgTGludXggQU1JXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9lY3Mtb3B0aW1pemVkX0FNSS5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKiAgVGhlIHZhbGlkIHZhbHVlcyBmb3IgRmFyZ2F0ZSBhcmUgMi0xMjAgc2Vjb25kcy5cbiAqL1xuU3RhcnRUaW1lb3V0PzogbnVtYmVyXG4vKipcbiAqIERhdGEgdm9sdW1lcyB0byBtb3VudCBmcm9tIGFub3RoZXIgY29udGFpbmVyLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgVm9sdW1lc0Zyb21gYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS12b2x1bWVzLWZyb21gYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi5cbiAqL1xuVm9sdW1lc0Zyb20/OiBWb2x1bWVGcm9tW11cbi8qKlxuICogVGhlIG51bWJlciBvZiBgYGNwdWBgIHVuaXRzIHJlc2VydmVkIGZvciB0aGUgY29udGFpbmVyLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgQ3B1U2hhcmVzYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmRhbmQgdGhlIGBgLS1jcHUtc2hhcmVzYGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKiAgVGhpcyBmaWVsZCBpcyBvcHRpb25hbCBmb3IgdGFza3MgdXNpbmcgdGhlIEZhcmdhdGUgbGF1bmNoIHR5cGUsIGFuZCB0aGUgb25seSByZXF1aXJlbWVudCBpcyB0aGF0IHRoZSB0b3RhbCBhbW91bnQgb2YgQ1BVIHJlc2VydmVkIGZvciBhbGwgY29udGFpbmVycyB3aXRoaW4gYSB0YXNrIGJlIGxvd2VyIHRoYW4gdGhlIHRhc2stbGV2ZWwgYGBjcHVgYCB2YWx1ZS5cbiAqICAgWW91IGNhbiBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBDUFUgdW5pdHMgdGhhdCBhcmUgYXZhaWxhYmxlIHBlciBFQzIgaW5zdGFuY2UgdHlwZSBieSBtdWx0aXBseWluZyB0aGUgdkNQVXMgbGlzdGVkIGZvciB0aGF0IGluc3RhbmNlIHR5cGUgb24gdGhlIFtBbWF6b24gRUMyIEluc3RhbmNlc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2VjMi9pbnN0YW5jZS10eXBlcy8pIGRldGFpbCBwYWdlIGJ5IDEsMDI0LlxuICogICBMaW51eCBjb250YWluZXJzIHNoYXJlIHVuYWxsb2NhdGVkIENQVSB1bml0cyB3aXRoIG90aGVyIGNvbnRhaW5lcnMgb24gdGhlIGNvbnRhaW5lciBpbnN0YW5jZSB3aXRoIHRoZSBzYW1lIHJhdGlvIGFzIHRoZWlyIGFsbG9jYXRlZCBhbW91bnQuIEZvciBleGFtcGxlLCBpZiB5b3UgcnVuIGEgc2luZ2xlLWNvbnRhaW5lciB0YXNrIG9uIGEgc2luZ2xlLWNvcmUgaW5zdGFuY2UgdHlwZSB3aXRoIDUxMiBDUFUgdW5pdHMgc3BlY2lmaWVkIGZvciB0aGF0IGNvbnRhaW5lciwgYW5kIHRoYXQncyB0aGUgb25seSB0YXNrIHJ1bm5pbmcgb24gdGhlIGNvbnRhaW5lciBpbnN0YW5jZSwgdGhhdCBjb250YWluZXIgY291bGQgdXNlIHRoZSBmdWxsIDEsMDI0IENQVSB1bml0IHNoYXJlIGF0IGFueSBnaXZlbiB0aW1lLiBIb3dldmVyLCBpZiB5b3UgbGF1bmNoZWQgYW5vdGhlciBjb3B5IG9mIHRoZSBzYW1lIHRhc2sgb24gdGhhdCBjb250YWluZXIgaW5zdGFuY2UsIGVhY2ggdGFzayBpcyBndWFyYW50ZWVkIGEgbWluaW11bSBvZiA1MTIgQ1BVIHVuaXRzIHdoZW4gbmVlZGVkLiBNb3Jlb3ZlciwgZWFjaCBjb250YWluZXIgY291bGQgZmxvYXQgdG8gaGlnaGVyIENQVSB1c2FnZSBpZiB0aGUgb3RoZXIgY29udGFpbmVyIHdhcyBub3QgdXNpbmcgaXQuIElmIGJvdGggdGFza3Mgd2VyZSAxMDAlIGFjdGl2ZSBhbGwgb2YgdGhlIHRpbWUsIHRoZXkgd291bGQgYmUgbGltaXRlZCB0byA1MTIgQ1BVIHVuaXRzLlxuICogIE9uIExpbnV4IGNvbnRhaW5lciBpbnN0YW5jZXMsIHRoZSBEb2NrZXIgZGFlbW9uIG9uIHRoZSBjb250YWluZXIgaW5zdGFuY2UgdXNlcyB0aGUgQ1BVIHZhbHVlIHRvIGNhbGN1bGF0ZSB0aGUgcmVsYXRpdmUgQ1BVIHNoYXJlIHJhdGlvcyBmb3IgcnVubmluZyBjb250YWluZXJzLiBUaGUgbWluaW11bSB2YWxpZCBDUFUgc2hhcmUgdmFsdWUgdGhhdCB0aGUgTGludXgga2VybmVsIGFsbG93cyBpcyAyLCBhbmQgdGhlIG1heGltdW0gdmFsaWQgQ1BVIHNoYXJlIHZhbHVlIHRoYXQgdGhlIExpbnV4IGtlcm5lbCBhbGxvd3MgaXMgMjYyMTQ0LiBIb3dldmVyLCB0aGUgQ1BVIHBhcmFtZXRlciBpc24ndCByZXF1aXJlZCwgYW5kIHlvdSBjYW4gdXNlIENQVSB2YWx1ZXMgYmVsb3cgMiBvciBhYm92ZSAyNjIxNDQgaW4geW91ciBjb250YWluZXIgZGVmaW5pdGlvbnMuIEZvciBDUFUgdmFsdWVzIGJlbG93IDIgKGluY2x1ZGluZyBudWxsKSBvciBhYm92ZSAyNjIxNDQsIHRoZSBiZWhhdmlvciB2YXJpZXMgYmFzZWQgb24geW91ciBBbWF6b24gRUNTIGNvbnRhaW5lciBhZ2VudCB2ZXJzaW9uOlxuICogICArICAgKkFnZW50IHZlcnNpb25zIGxlc3MgdGhhbiBvciBlcXVhbCB0byAxLjEuMDoqIE51bGwgYW5kIHplcm8gQ1BVIHZhbHVlcyBhcmUgcGFzc2VkIHRvIERvY2tlciBhcyAwLCB3aGljaCBEb2NrZXIgdGhlbiBjb252ZXJ0cyB0byAxLDAyNCBDUFUgc2hhcmVzLiBDUFUgdmFsdWVzIG9mIDEgYXJlIHBhc3NlZCB0byBEb2NrZXIgYXMgMSwgd2hpY2ggdGhlIExpbnV4IGtlcm5lbCBjb252ZXJ0cyB0byB0d28gQ1BVIHNoYXJlcy5cbiAqICAgKyAgICpBZ2VudCB2ZXJzaW9ucyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMS4yLjA6KiBOdWxsLCB6ZXJvLCBhbmQgQ1BVIHZhbHVlcyBvZiAxIGFyZSBwYXNzZWQgdG8gRG9ja2VyIGFzIDIuXG4gKiAgICsgICAqQWdlbnQgdmVyc2lvbnMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEuODQuMDoqIENQVSB2YWx1ZXMgZ3JlYXRlciB0aGFuIDI1NiB2Q1BVIGFyZSBwYXNzZWQgdG8gRG9ja2VyIGFzIDI1Niwgd2hpY2ggaXMgZXF1aXZhbGVudCB0byAyNjIxNDQgQ1BVIHNoYXJlcy5cbiAqICAgXG4gKiAgT24gV2luZG93cyBjb250YWluZXIgaW5zdGFuY2VzLCB0aGUgQ1BVIGxpbWl0IGlzIGVuZm9yY2VkIGFzIGFuIGFic29sdXRlIGxpbWl0LCBvciBhIHF1b3RhLiBXaW5kb3dzIGNvbnRhaW5lcnMgb25seSBoYXZlIGFjY2VzcyB0byB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBDUFUgdGhhdCdzIGRlc2NyaWJlZCBpbiB0aGUgdGFzayBkZWZpbml0aW9uLiBBIG51bGwgb3IgemVybyBDUFUgdmFsdWUgaXMgcGFzc2VkIHRvIERvY2tlciBhcyBgYDBgYCwgd2hpY2ggV2luZG93cyBpbnRlcnByZXRzIGFzIDElIG9mIG9uZSBDUFUuXG4gKi9cbkNwdT86IG51bWJlclxuLyoqXG4gKiBFYXJseSB2ZXJzaW9ucyBvZiB0aGUgQW1hem9uIEVDUyBjb250YWluZXIgYWdlbnQgZG9uJ3QgcHJvcGVybHkgaGFuZGxlIGBgZW50cnlQb2ludGBgIHBhcmFtZXRlcnMuIElmIHlvdSBoYXZlIHByb2JsZW1zIHVzaW5nIGBgZW50cnlQb2ludGBgLCB1cGRhdGUgeW91ciBjb250YWluZXIgYWdlbnQgb3IgZW50ZXIgeW91ciBjb21tYW5kcyBhbmQgYXJndW1lbnRzIGFzIGBgY29tbWFuZGBgIGFycmF5IGl0ZW1zIGluc3RlYWQuXG4gKiAgIFRoZSBlbnRyeSBwb2ludCB0aGF0J3MgcGFzc2VkIHRvIHRoZSBjb250YWluZXIuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBFbnRyeXBvaW50YGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYC0tZW50cnlwb2ludGBgIG9wdGlvbiB0byBkb2NrZXIgcnVuLlxuICovXG5FbnRyeVBvaW50Pzogc3RyaW5nW11cbi8qKlxuICogQSBsaXN0IG9mIEROUyBzZXJ2ZXJzIHRoYXQgYXJlIHByZXNlbnRlZCB0byB0aGUgY29udGFpbmVyLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgRG5zYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYC0tZG5zYGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKiAgIFRoaXMgcGFyYW1ldGVyIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIFdpbmRvd3MgY29udGFpbmVycy5cbiAqL1xuRG5zU2VydmVycz86IHN0cmluZ1tdXG4vKipcbiAqIFdoZW4gdGhpcyBwYXJhbWV0ZXIgaXMgdHJ1ZSwgdGhlIGNvbnRhaW5lciBpcyBnaXZlbiByZWFkLW9ubHkgYWNjZXNzIHRvIGl0cyByb290IGZpbGUgc3lzdGVtLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgUmVhZG9ubHlSb290ZnNgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS1yZWFkLW9ubHlgYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi5cbiAqICAgVGhpcyBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZCBmb3IgV2luZG93cyBjb250YWluZXJzLlxuICovXG5SZWFkb25seVJvb3RGaWxlc3lzdGVtPzogYm9vbGVhblxuLyoqXG4gKiBUaGUgaW1hZ2UgdXNlZCB0byBzdGFydCBhIGNvbnRhaW5lci4gVGhpcyBzdHJpbmcgaXMgcGFzc2VkIGRpcmVjdGx5IHRvIHRoZSBEb2NrZXIgZGFlbW9uLiBCeSBkZWZhdWx0LCBpbWFnZXMgaW4gdGhlIERvY2tlciBIdWIgcmVnaXN0cnkgYXJlIGF2YWlsYWJsZS4gT3RoZXIgcmVwb3NpdG9yaWVzIGFyZSBzcGVjaWZpZWQgd2l0aCBlaXRoZXIgYGByZXBvc2l0b3J5LXVybC9pbWFnZTp0YWdgYCBvciBgYHJlcG9zaXRvcnktdXJsL2ltYWdlQGRpZ2VzdGBgLiBVcCB0byAyNTUgbGV0dGVycyAodXBwZXJjYXNlIGFuZCBsb3dlcmNhc2UpLCBudW1iZXJzLCBoeXBoZW5zLCB1bmRlcnNjb3JlcywgY29sb25zLCBwZXJpb2RzLCBmb3J3YXJkIHNsYXNoZXMsIGFuZCBudW1iZXIgc2lnbnMgYXJlIGFsbG93ZWQuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBJbWFnZWBgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kIGFuZCB0aGUgYGBJTUFHRWBgIHBhcmFtZXRlciBvZiBkb2NrZXIgcnVuLlxuICogICArICBXaGVuIGEgbmV3IHRhc2sgc3RhcnRzLCB0aGUgQW1hem9uIEVDUyBjb250YWluZXIgYWdlbnQgcHVsbHMgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpZWQgaW1hZ2UgYW5kIHRhZyBmb3IgdGhlIGNvbnRhaW5lciB0byB1c2UuIEhvd2V2ZXIsIHN1YnNlcXVlbnQgdXBkYXRlcyB0byBhIHJlcG9zaXRvcnkgaW1hZ2UgYXJlbid0IHByb3BhZ2F0ZWQgdG8gYWxyZWFkeSBydW5uaW5nIHRhc2tzLlxuICogICArICBJbWFnZXMgaW4gQW1hem9uIEVDUiByZXBvc2l0b3JpZXMgY2FuIGJlIHNwZWNpZmllZCBieSBlaXRoZXIgdXNpbmcgdGhlIGZ1bGwgYGByZWdpc3RyeS9yZXBvc2l0b3J5OnRhZ2BgIG9yIGBgcmVnaXN0cnkvcmVwb3NpdG9yeUBkaWdlc3RgYC4gRm9yIGV4YW1wbGUsIGBgMDEyMzQ1Njc4OTEwLmRrci5lY3IuPHJlZ2lvbi1uYW1lPi5hbWF6b25hd3MuY29tLzxyZXBvc2l0b3J5LW5hbWU+OmxhdGVzdGBgIG9yIGBgMDEyMzQ1Njc4OTEwLmRrci5lY3IuPHJlZ2lvbi1uYW1lPi5hbWF6b25hd3MuY29tLzxyZXBvc2l0b3J5LW5hbWU+QHNoYTI1Njo5NGFmZDFmMmU2NGQ5MDhiYzkwZGJjYTAwMzVhNWI1NjdFWEFNUExFYGAuIFxuICogICArICBJbWFnZXMgaW4gb2ZmaWNpYWwgcmVwb3NpdG9yaWVzIG9uIERvY2tlciBIdWIgdXNlIGEgc2luZ2xlIG5hbWUgKGZvciBleGFtcGxlLCBgYHVidW50dWBgIG9yIGBgbW9uZ29gYCkuXG4gKiAgICsgIEltYWdlcyBpbiBvdGhlciByZXBvc2l0b3JpZXMgb24gRG9ja2VyIEh1YiBhcmUgcXVhbGlmaWVkIHdpdGggYW4gb3JnYW5pemF0aW9uIG5hbWUgKGZvciBleGFtcGxlLCBgYGFtYXpvbi9hbWF6b24tZWNzLWFnZW50YGApLlxuICogICArICBJbWFnZXMgaW4gb3RoZXIgb25saW5lIHJlcG9zaXRvcmllcyBhcmUgcXVhbGlmaWVkIGZ1cnRoZXIgYnkgYSBkb21haW4gbmFtZSAoZm9yIGV4YW1wbGUsIGBgcXVheS5pby9hc3NlbWJseWxpbmUvdWJ1bnR1YGApLlxuICovXG5JbWFnZTogc3RyaW5nXG4vKipcbiAqIElmIHRoZSBgYGVzc2VudGlhbGBgIHBhcmFtZXRlciBvZiBhIGNvbnRhaW5lciBpcyBtYXJrZWQgYXMgYGB0cnVlYGAsIGFuZCB0aGF0IGNvbnRhaW5lciBmYWlscyBvciBzdG9wcyBmb3IgYW55IHJlYXNvbiwgYWxsIG90aGVyIGNvbnRhaW5lcnMgdGhhdCBhcmUgcGFydCBvZiB0aGUgdGFzayBhcmUgc3RvcHBlZC4gSWYgdGhlIGBgZXNzZW50aWFsYGAgcGFyYW1ldGVyIG9mIGEgY29udGFpbmVyIGlzIG1hcmtlZCBhcyBgYGZhbHNlYGAsIGl0cyBmYWlsdXJlIGRvZXNuJ3QgYWZmZWN0IHRoZSByZXN0IG9mIHRoZSBjb250YWluZXJzIGluIGEgdGFzay4gSWYgdGhpcyBwYXJhbWV0ZXIgaXMgb21pdHRlZCwgYSBjb250YWluZXIgaXMgYXNzdW1lZCB0byBiZSBlc3NlbnRpYWwuXG4gKiAgQWxsIHRhc2tzIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgZXNzZW50aWFsIGNvbnRhaW5lci4gSWYgeW91IGhhdmUgYW4gYXBwbGljYXRpb24gdGhhdCdzIGNvbXBvc2VkIG9mIG11bHRpcGxlIGNvbnRhaW5lcnMsIGdyb3VwIGNvbnRhaW5lcnMgdGhhdCBhcmUgdXNlZCBmb3IgYSBjb21tb24gcHVycG9zZSBpbnRvIGNvbXBvbmVudHMsIGFuZCBzZXBhcmF0ZSB0aGUgZGlmZmVyZW50IGNvbXBvbmVudHMgaW50byBtdWx0aXBsZSB0YXNrIGRlZmluaXRpb25zLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtBcHBsaWNhdGlvbiBBcmNoaXRlY3R1cmVdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2FwcGxpY2F0aW9uX2FyY2hpdGVjdHVyZS5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKi9cbkVzc2VudGlhbD86IGJvb2xlYW5cbkxvZ0NvbmZpZ3VyYXRpb24/OiBMb2dDb25maWd1cmF0aW9uXG4vKipcbiAqIFRoZSB0eXBlIGFuZCBhbW91bnQgb2YgYSByZXNvdXJjZSB0byBhc3NpZ24gdG8gYSBjb250YWluZXIuIFRoZSBvbmx5IHN1cHBvcnRlZCByZXNvdXJjZSBpcyBhIEdQVS5cbiAqL1xuUmVzb3VyY2VSZXF1aXJlbWVudHM/OiBSZXNvdXJjZVJlcXVpcmVtZW50W11cbi8qKlxuICogQSBsaXN0IG9mIGZpbGVzIGNvbnRhaW5pbmcgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBwYXNzIHRvIGEgY29udGFpbmVyLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIHRoZSBgYC0tZW52LWZpbGVgYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi5cbiAqICBZb3UgY2FuIHNwZWNpZnkgdXAgdG8gdGVuIGVudmlyb25tZW50IGZpbGVzLiBUaGUgZmlsZSBtdXN0IGhhdmUgYSBgYC5lbnZgYCBmaWxlIGV4dGVuc2lvbi4gRWFjaCBsaW5lIGluIGFuIGVudmlyb25tZW50IGZpbGUgY29udGFpbnMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgaW4gYGBWQVJJQUJMRT1WQUxVRWBgIGZvcm1hdC4gTGluZXMgYmVnaW5uaW5nIHdpdGggYGAjYGAgYXJlIHRyZWF0ZWQgYXMgY29tbWVudHMgYW5kIGFyZSBpZ25vcmVkLlxuICogIElmIHRoZXJlIGFyZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgc3BlY2lmaWVkIHVzaW5nIHRoZSBgYGVudmlyb25tZW50YGAgcGFyYW1ldGVyIGluIGEgY29udGFpbmVyIGRlZmluaXRpb24sIHRoZXkgdGFrZSBwcmVjZWRlbmNlIG92ZXIgdGhlIHZhcmlhYmxlcyBjb250YWluZWQgd2l0aGluIGFuIGVudmlyb25tZW50IGZpbGUuIElmIG11bHRpcGxlIGVudmlyb25tZW50IGZpbGVzIGFyZSBzcGVjaWZpZWQgdGhhdCBjb250YWluIHRoZSBzYW1lIHZhcmlhYmxlLCB0aGV5J3JlIHByb2Nlc3NlZCBmcm9tIHRoZSB0b3AgZG93bi4gV2UgcmVjb21tZW5kIHRoYXQgeW91IHVzZSB1bmlxdWUgdmFyaWFibGUgbmFtZXMuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1NwZWNpZnlpbmcgRW52aXJvbm1lbnQgVmFyaWFibGVzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS90YXNrZGVmLWVudmZpbGVzLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuRW52aXJvbm1lbnRGaWxlcz86IEVudmlyb25tZW50RmlsZVtdXG4vKipcbiAqIFRoZSBuYW1lIG9mIGEgY29udGFpbmVyLiBJZiB5b3UncmUgbGlua2luZyBtdWx0aXBsZSBjb250YWluZXJzIHRvZ2V0aGVyIGluIGEgdGFzayBkZWZpbml0aW9uLCB0aGUgYGBuYW1lYGAgb2Ygb25lIGNvbnRhaW5lciBjYW4gYmUgZW50ZXJlZCBpbiB0aGUgYGBsaW5rc2BgIG9mIGFub3RoZXIgY29udGFpbmVyIHRvIGNvbm5lY3QgdGhlIGNvbnRhaW5lcnMuIFVwIHRvIDI1NSBsZXR0ZXJzICh1cHBlcmNhc2UgYW5kIGxvd2VyY2FzZSksIG51bWJlcnMsIHVuZGVyc2NvcmVzLCBhbmQgaHlwaGVucyBhcmUgYWxsb3dlZC4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYG5hbWVgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS1uYW1lYGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKi9cbk5hbWU6IHN0cmluZ1xuRmlyZWxlbnNDb25maWd1cmF0aW9uPzogRmlyZWxlbnNDb25maWd1cmF0aW9uXG4vKipcbiAqIEEgbGlzdCBvZiBzdHJpbmdzIHRvIHByb3ZpZGUgY3VzdG9tIGNvbmZpZ3VyYXRpb24gZm9yIG11bHRpcGxlIHNlY3VyaXR5IHN5c3RlbXMuIFRoaXMgZmllbGQgaXNuJ3QgdmFsaWQgZm9yIGNvbnRhaW5lcnMgaW4gdGFza3MgdXNpbmcgdGhlIEZhcmdhdGUgbGF1bmNoIHR5cGUuXG4gKiAgRm9yIExpbnV4IHRhc2tzIG9uIEVDMiwgdGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHVzZWQgdG8gcmVmZXJlbmNlIGN1c3RvbSBsYWJlbHMgZm9yIFNFTGludXggYW5kIEFwcEFybW9yIG11bHRpLWxldmVsIHNlY3VyaXR5IHN5c3RlbXMuXG4gKiAgRm9yIGFueSB0YXNrcyBvbiBFQzIsIHRoaXMgcGFyYW1ldGVyIGNhbiBiZSB1c2VkIHRvIHJlZmVyZW5jZSBhIGNyZWRlbnRpYWwgc3BlYyBmaWxlIHRoYXQgY29uZmlndXJlcyBhIGNvbnRhaW5lciBmb3IgQWN0aXZlIERpcmVjdG9yeSBhdXRoZW50aWNhdGlvbi4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbVXNpbmcgZ01TQXMgZm9yIFdpbmRvd3MgQ29udGFpbmVyc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvd2luZG93cy1nbXNhLmh0bWwpIGFuZCBbVXNpbmcgZ01TQXMgZm9yIExpbnV4IENvbnRhaW5lcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2xpbnV4LWdtc2EuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICogIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBTZWN1cml0eU9wdGBgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kIGFuZCB0aGUgYGAtLXNlY3VyaXR5LW9wdGBgIG9wdGlvbiB0byBkb2NrZXIgcnVuLlxuICogICBUaGUgQW1hem9uIEVDUyBjb250YWluZXIgYWdlbnQgcnVubmluZyBvbiBhIGNvbnRhaW5lciBpbnN0YW5jZSBtdXN0IHJlZ2lzdGVyIHdpdGggdGhlIGBgRUNTX1NFTElOVVhfQ0FQQUJMRT10cnVlYGAgb3IgYGBFQ1NfQVBQQVJNT1JfQ0FQQUJMRT10cnVlYGAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGJlZm9yZSBjb250YWluZXJzIHBsYWNlZCBvbiB0aGF0IGluc3RhbmNlIGNhbiB1c2UgdGhlc2Ugc2VjdXJpdHkgb3B0aW9ucy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQW1hem9uIEVDUyBDb250YWluZXIgQWdlbnQgQ29uZmlndXJhdGlvbl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvZWNzLWFnZW50LWNvbmZpZy5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKiAgIFZhbGlkIHZhbHVlczogXCJuby1uZXctcHJpdmlsZWdlc1wiIHwgXCJhcHBhcm1vcjpQUk9GSUxFXCIgfCBcImxhYmVsOnZhbHVlXCIgfCBcImNyZWRlbnRpYWxzcGVjOkNyZWRlbnRpYWxTcGVjRmlsZVBhdGhcIlxuICovXG5Eb2NrZXJTZWN1cml0eU9wdGlvbnM/OiBzdHJpbmdbXVxuLyoqXG4gKiBBIGxpc3Qgb2YgbmFtZXNwYWNlZCBrZXJuZWwgcGFyYW1ldGVycyB0byBzZXQgaW4gdGhlIGNvbnRhaW5lci4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYFN5c2N0bHNgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS1zeXNjdGxgYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi4gRm9yIGV4YW1wbGUsIHlvdSBjYW4gY29uZmlndXJlIGBgbmV0LmlwdjQudGNwX2tlZXBhbGl2ZV90aW1lYGAgc2V0dGluZyB0byBtYWludGFpbiBsb25nZXIgbGl2ZWQgY29ubmVjdGlvbnMuXG4gKi9cblN5c3RlbUNvbnRyb2xzPzogU3lzdGVtQ29udHJvbFtdXG4vKipcbiAqIFdoZW4gdGhpcyBwYXJhbWV0ZXIgaXMgYGB0cnVlYGAsIHlvdSBjYW4gZGVwbG95IGNvbnRhaW5lcml6ZWQgYXBwbGljYXRpb25zIHRoYXQgcmVxdWlyZSBgYHN0ZGluYGAgb3IgYSBgYHR0eWBgIHRvIGJlIGFsbG9jYXRlZC4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYE9wZW5TdGRpbmBgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kIGFuZCB0aGUgYGAtLWludGVyYWN0aXZlYGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKi9cbkludGVyYWN0aXZlPzogYm9vbGVhblxuLyoqXG4gKiBBIGxpc3Qgb2YgRE5TIHNlYXJjaCBkb21haW5zIHRoYXQgYXJlIHByZXNlbnRlZCB0byB0aGUgY29udGFpbmVyLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgRG5zU2VhcmNoYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYC0tZG5zLXNlYXJjaGBgIG9wdGlvbiB0byBkb2NrZXIgcnVuLlxuICogICBUaGlzIHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkIGZvciBXaW5kb3dzIGNvbnRhaW5lcnMuXG4gKi9cbkRuc1NlYXJjaERvbWFpbnM/OiBzdHJpbmdbXVxuLyoqXG4gKiBBIGxpc3Qgb2YgQVJOcyBpbiBTU00gb3IgQW1hem9uIFMzIHRvIGEgY3JlZGVudGlhbCBzcGVjIChgYENyZWRTcGVjYGApIGZpbGUgdGhhdCBjb25maWd1cmVzIHRoZSBjb250YWluZXIgZm9yIEFjdGl2ZSBEaXJlY3RvcnkgYXV0aGVudGljYXRpb24uIFdlIHJlY29tbWVuZCB0aGF0IHlvdSB1c2UgdGhpcyBwYXJhbWV0ZXIgaW5zdGVhZCBvZiB0aGUgYGBkb2NrZXJTZWN1cml0eU9wdGlvbnNgYC4gVGhlIG1heGltdW0gbnVtYmVyIG9mIEFSTnMgaXMgMS5cbiAqICBUaGVyZSBhcmUgdHdvIGZvcm1hdHMgZm9yIGVhY2ggQVJOLlxuICogICArIGNyZWRlbnRpYWxzcGVjZG9tYWlubGVzczpNeUFSTiBZb3UgdXNlIGNyZWRlbnRpYWxzcGVjZG9tYWlubGVzczpNeUFSTiB0byBwcm92aWRlIGEgQ3JlZFNwZWMgd2l0aCBhbiBhZGRpdGlvbmFsIHNlY3Rpb24gZm9yIGEgc2VjcmV0IGluIC4gWW91IHByb3ZpZGUgdGhlIGxvZ2luIGNyZWRlbnRpYWxzIHRvIHRoZSBkb21haW4gaW4gdGhlIHNlY3JldC4gRWFjaCB0YXNrIHRoYXQgcnVucyBvbiBhbnkgY29udGFpbmVyIGluc3RhbmNlIGNhbiBqb2luIGRpZmZlcmVudCBkb21haW5zLiBZb3UgY2FuIHVzZSB0aGlzIGZvcm1hdCB3aXRob3V0IGpvaW5pbmcgdGhlIGNvbnRhaW5lciBpbnN0YW5jZSB0byBhIGRvbWFpbi4gKyBjcmVkZW50aWFsc3BlYzpNeUFSTiBZb3UgdXNlIGNyZWRlbnRpYWxzcGVjOk15QVJOIHRvIHByb3ZpZGUgYSBDcmVkU3BlYyBmb3IgYSBzaW5nbGUgZG9tYWluLiBZb3UgbXVzdCBqb2luIHRoZSBjb250YWluZXIgaW5zdGFuY2UgdG8gdGhlIGRvbWFpbiBiZWZvcmUgeW91IHN0YXJ0IGFueSB0YXNrcyB0aGF0IHVzZSB0aGlzIHRhc2sgZGVmaW5pdGlvbi4gXG4gKiAgSW4gYm90aCBmb3JtYXRzLCByZXBsYWNlIGBgTXlBUk5gYCB3aXRoIHRoZSBBUk4gaW4gU1NNIG9yIEFtYXpvbiBTMy5cbiAqICBJZiB5b3UgcHJvdmlkZSBhIGBgY3JlZGVudGlhbHNwZWNkb21haW5sZXNzOk15QVJOYGAsIHRoZSBgYGNyZWRzcGVjYGAgbXVzdCBwcm92aWRlIGEgQVJOIGluIEFTTWxvbmcgZm9yIGEgc2VjcmV0IGNvbnRhaW5pbmcgdGhlIHVzZXJuYW1lLCBwYXNzd29yZCwgYW5kIHRoZSBkb21haW4gdG8gY29ubmVjdCB0by4gRm9yIGJldHRlciBzZWN1cml0eSwgdGhlIGluc3RhbmNlIGlzbid0IGpvaW5lZCB0byB0aGUgZG9tYWluIGZvciBkb21haW5sZXNzIGF1dGhlbnRpY2F0aW9uLiBPdGhlciBhcHBsaWNhdGlvbnMgb24gdGhlIGluc3RhbmNlIGNhbid0IHVzZSB0aGUgZG9tYWlubGVzcyBjcmVkZW50aWFscy4gWW91IGNhbiB1c2UgdGhpcyBwYXJhbWV0ZXIgdG8gcnVuIHRhc2tzIG9uIHRoZSBzYW1lIGluc3RhbmNlLCBldmVuIGl0IHRoZSB0YXNrcyBuZWVkIHRvIGpvaW4gZGlmZmVyZW50IGRvbWFpbnMuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1VzaW5nIGdNU0FzIGZvciBXaW5kb3dzIENvbnRhaW5lcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3dpbmRvd3MtZ21zYS5odG1sKSBhbmQgW1VzaW5nIGdNU0FzIGZvciBMaW51eCBDb250YWluZXJzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9saW51eC1nbXNhLmh0bWwpLlxuICovXG5DcmVkZW50aWFsU3BlY3M/OiBzdHJpbmdbXVxuLyoqXG4gKiBBIGxpc3Qgb2YgYGB1bGltaXRzYGAgdG8gc2V0IGluIHRoZSBjb250YWluZXIuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBVbGltaXRzYGAgaW4gdGhlIFtDcmVhdGUgYSBjb250YWluZXJdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9odHRwczovL2RvY3MuZG9ja2VyLmNvbS9lbmdpbmUvYXBpL3YxLjM1LyNvcGVyYXRpb24vQ29udGFpbmVyQ3JlYXRlKSBzZWN0aW9uIG9mIHRoZSBbRG9ja2VyIFJlbW90ZSBBUEldKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9odHRwczovL2RvY3MuZG9ja2VyLmNvbS9lbmdpbmUvYXBpL3YxLjM1LykgYW5kIHRoZSBgYC0tdWxpbWl0YGAgb3B0aW9uIHRvIFtkb2NrZXIgcnVuXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaHR0cHM6Ly9kb2NzLmRvY2tlci5jb20vZW5naW5lL3JlZmVyZW5jZS9ydW4vKS4gVmFsaWQgbmFtaW5nIHZhbHVlcyBhcmUgZGlzcGxheWVkIGluIHRoZSBbVWxpbWl0XShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1VsaW1pdC5odG1sKSBkYXRhIHR5cGUuIFRoaXMgcGFyYW1ldGVyIHJlcXVpcmVzIHZlcnNpb24gMS4xOCBvZiB0aGUgRG9ja2VyIFJlbW90ZSBBUEkgb3IgZ3JlYXRlciBvbiB5b3VyIGNvbnRhaW5lciBpbnN0YW5jZS4gVG8gY2hlY2sgdGhlIERvY2tlciBSZW1vdGUgQVBJIHZlcnNpb24gb24geW91ciBjb250YWluZXIgaW5zdGFuY2UsIGxvZyBpbiB0byB5b3VyIGNvbnRhaW5lciBpbnN0YW5jZSBhbmQgcnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZDogYGBzdWRvIGRvY2tlciB2ZXJzaW9uIC0tZm9ybWF0ICd7ey5TZXJ2ZXIuQVBJVmVyc2lvbn19J2BgIFxuICogICBUaGlzIHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkIGZvciBXaW5kb3dzIGNvbnRhaW5lcnMuXG4gKi9cblVsaW1pdHM/OiBVbGltaXRbXVxuLyoqXG4gKiBUaW1lIGR1cmF0aW9uIChpbiBzZWNvbmRzKSB0byB3YWl0IGJlZm9yZSB0aGUgY29udGFpbmVyIGlzIGZvcmNlZnVsbHkga2lsbGVkIGlmIGl0IGRvZXNuJ3QgZXhpdCBub3JtYWxseSBvbiBpdHMgb3duLlxuICogIEZvciB0YXNrcyB1c2luZyB0aGUgRmFyZ2F0ZSBsYXVuY2ggdHlwZSwgdGhlIHRhc2sgb3Igc2VydmljZSByZXF1aXJlcyB0aGUgZm9sbG93aW5nIHBsYXRmb3JtczpcbiAqICAgKyAgTGludXggcGxhdGZvcm0gdmVyc2lvbiBgYDEuMy4wYGAgb3IgbGF0ZXIuXG4gKiAgICsgIFdpbmRvd3MgcGxhdGZvcm0gdmVyc2lvbiBgYDEuMC4wYGAgb3IgbGF0ZXIuXG4gKiAgIFxuICogIEZvciB0YXNrcyB0aGF0IHVzZSB0aGUgRmFyZ2F0ZSBsYXVuY2ggdHlwZSwgdGhlIG1heCBzdG9wIHRpbWVvdXQgdmFsdWUgaXMgMTIwIHNlY29uZHMgYW5kIGlmIHRoZSBwYXJhbWV0ZXIgaXMgbm90IHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgdmFsdWUgb2YgMzAgc2Vjb25kcyBpcyB1c2VkLlxuICogIEZvciB0YXNrcyB0aGF0IHVzZSB0aGUgRUMyIGxhdW5jaCB0eXBlLCBpZiB0aGUgYGBzdG9wVGltZW91dGBgIHBhcmFtZXRlciBpc24ndCBzcGVjaWZpZWQsIHRoZSB2YWx1ZSBzZXQgZm9yIHRoZSBBbWF6b24gRUNTIGNvbnRhaW5lciBhZ2VudCBjb25maWd1cmF0aW9uIHZhcmlhYmxlIGBgRUNTX0NPTlRBSU5FUl9TVE9QX1RJTUVPVVRgYCBpcyB1c2VkLiBJZiBuZWl0aGVyIHRoZSBgYHN0b3BUaW1lb3V0YGAgcGFyYW1ldGVyIG9yIHRoZSBgYEVDU19DT05UQUlORVJfU1RPUF9USU1FT1VUYGAgYWdlbnQgY29uZmlndXJhdGlvbiB2YXJpYWJsZSBhcmUgc2V0LCB0aGVuIHRoZSBkZWZhdWx0IHZhbHVlcyBvZiAzMCBzZWNvbmRzIGZvciBMaW51eCBjb250YWluZXJzIGFuZCAzMCBzZWNvbmRzIG9uIFdpbmRvd3MgY29udGFpbmVycyBhcmUgdXNlZC4gWW91ciBjb250YWluZXIgaW5zdGFuY2VzIHJlcXVpcmUgYXQgbGVhc3QgdmVyc2lvbiAxLjI2LjAgb2YgdGhlIGNvbnRhaW5lciBhZ2VudCB0byB1c2UgYSBjb250YWluZXIgc3RvcCB0aW1lb3V0IHZhbHVlLiBIb3dldmVyLCB3ZSByZWNvbW1lbmQgdXNpbmcgdGhlIGxhdGVzdCBjb250YWluZXIgYWdlbnQgdmVyc2lvbi4gRm9yIGluZm9ybWF0aW9uIGFib3V0IGNoZWNraW5nIHlvdXIgYWdlbnQgdmVyc2lvbiBhbmQgdXBkYXRpbmcgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uLCBzZWUgW1VwZGF0aW5nIHRoZSBBbWF6b24gRUNTIENvbnRhaW5lciBBZ2VudF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvZWNzLWFnZW50LXVwZGF0ZS5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouIElmIHlvdSdyZSB1c2luZyBhbiBBbWF6b24gRUNTLW9wdGltaXplZCBMaW51eCBBTUksIHlvdXIgaW5zdGFuY2UgbmVlZHMgYXQgbGVhc3QgdmVyc2lvbiAxLjI2LjAtMSBvZiB0aGUgYGBlY3MtaW5pdGBgIHBhY2thZ2UuIElmIHlvdXIgY29udGFpbmVyIGluc3RhbmNlcyBhcmUgbGF1bmNoZWQgZnJvbSB2ZXJzaW9uIGBgMjAxOTAzMDFgYCBvciBsYXRlciwgdGhlbiB0aGV5IGNvbnRhaW4gdGhlIHJlcXVpcmVkIHZlcnNpb25zIG9mIHRoZSBjb250YWluZXIgYWdlbnQgYW5kIGBgZWNzLWluaXRgYC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQW1hem9uIEVDUy1vcHRpbWl6ZWQgTGludXggQU1JXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9lY3Mtb3B0aW1pemVkX0FNSS5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKiAgVGhlIHZhbGlkIHZhbHVlcyBmb3IgRmFyZ2F0ZSBhcmUgMi0xMjAgc2Vjb25kcy5cbiAqL1xuU3RvcFRpbWVvdXQ/OiBudW1iZXJcbi8qKlxuICogVGhlIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHJ1biBjb21tYW5kcyBpbnNpZGUgdGhlIGNvbnRhaW5lciBpbi4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYFdvcmtpbmdEaXJgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS13b3JrZGlyYGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKi9cbldvcmtpbmdEaXJlY3Rvcnk/OiBzdHJpbmdcbi8qKlxuICogVGhlIHNvZnQgbGltaXQgKGluIE1pQikgb2YgbWVtb3J5IHRvIHJlc2VydmUgZm9yIHRoZSBjb250YWluZXIuIFdoZW4gc3lzdGVtIG1lbW9yeSBpcyB1bmRlciBoZWF2eSBjb250ZW50aW9uLCBEb2NrZXIgYXR0ZW1wdHMgdG8ga2VlcCB0aGUgY29udGFpbmVyIG1lbW9yeSB0byB0aGlzIHNvZnQgbGltaXQuIEhvd2V2ZXIsIHlvdXIgY29udGFpbmVyIGNhbiBjb25zdW1lIG1vcmUgbWVtb3J5IHdoZW4gaXQgbmVlZHMgdG8sIHVwIHRvIGVpdGhlciB0aGUgaGFyZCBsaW1pdCBzcGVjaWZpZWQgd2l0aCB0aGUgYGBtZW1vcnlgYCBwYXJhbWV0ZXIgKGlmIGFwcGxpY2FibGUpLCBvciBhbGwgb2YgdGhlIGF2YWlsYWJsZSBtZW1vcnkgb24gdGhlIGNvbnRhaW5lciBpbnN0YW5jZSwgd2hpY2hldmVyIGNvbWVzIGZpcnN0LiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgTWVtb3J5UmVzZXJ2YXRpb25gYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS1tZW1vcnktcmVzZXJ2YXRpb25gYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi5cbiAqICBJZiBhIHRhc2stbGV2ZWwgbWVtb3J5IHZhbHVlIGlzIG5vdCBzcGVjaWZpZWQsIHlvdSBtdXN0IHNwZWNpZnkgYSBub24temVybyBpbnRlZ2VyIGZvciBvbmUgb3IgYm90aCBvZiBgYG1lbW9yeWBgIG9yIGBgbWVtb3J5UmVzZXJ2YXRpb25gYCBpbiBhIGNvbnRhaW5lciBkZWZpbml0aW9uLiBJZiB5b3Ugc3BlY2lmeSBib3RoLCBgYG1lbW9yeWBgIG11c3QgYmUgZ3JlYXRlciB0aGFuIGBgbWVtb3J5UmVzZXJ2YXRpb25gYC4gSWYgeW91IHNwZWNpZnkgYGBtZW1vcnlSZXNlcnZhdGlvbmBgLCB0aGVuIHRoYXQgdmFsdWUgaXMgc3VidHJhY3RlZCBmcm9tIHRoZSBhdmFpbGFibGUgbWVtb3J5IHJlc291cmNlcyBmb3IgdGhlIGNvbnRhaW5lciBpbnN0YW5jZSB3aGVyZSB0aGUgY29udGFpbmVyIGlzIHBsYWNlZC4gT3RoZXJ3aXNlLCB0aGUgdmFsdWUgb2YgYGBtZW1vcnlgYCBpcyB1c2VkLlxuICogIEZvciBleGFtcGxlLCBpZiB5b3VyIGNvbnRhaW5lciBub3JtYWxseSB1c2VzIDEyOCBNaUIgb2YgbWVtb3J5LCBidXQgb2NjYXNpb25hbGx5IGJ1cnN0cyB0byAyNTYgTWlCIG9mIG1lbW9yeSBmb3Igc2hvcnQgcGVyaW9kcyBvZiB0aW1lLCB5b3UgY2FuIHNldCBhIGBgbWVtb3J5UmVzZXJ2YXRpb25gYCBvZiAxMjggTWlCLCBhbmQgYSBgYG1lbW9yeWBgIGhhcmQgbGltaXQgb2YgMzAwIE1pQi4gVGhpcyBjb25maWd1cmF0aW9uIHdvdWxkIGFsbG93IHRoZSBjb250YWluZXIgdG8gb25seSByZXNlcnZlIDEyOCBNaUIgb2YgbWVtb3J5IGZyb20gdGhlIHJlbWFpbmluZyByZXNvdXJjZXMgb24gdGhlIGNvbnRhaW5lciBpbnN0YW5jZSwgYnV0IGFsc28gYWxsb3cgdGhlIGNvbnRhaW5lciB0byBjb25zdW1lIG1vcmUgbWVtb3J5IHJlc291cmNlcyB3aGVuIG5lZWRlZC5cbiAqICBUaGUgRG9ja2VyIDIwLjEwLjAgb3IgbGF0ZXIgZGFlbW9uIHJlc2VydmVzIGEgbWluaW11bSBvZiA2IE1pQiBvZiBtZW1vcnkgZm9yIGEgY29udGFpbmVyLiBTbywgZG9uJ3Qgc3BlY2lmeSBsZXNzIHRoYW4gNiBNaUIgb2YgbWVtb3J5IGZvciB5b3VyIGNvbnRhaW5lcnMuIFxuICogIFRoZSBEb2NrZXIgMTkuMDMuMTMtY2Ugb3IgZWFybGllciBkYWVtb24gcmVzZXJ2ZXMgYSBtaW5pbXVtIG9mIDQgTWlCIG9mIG1lbW9yeSBmb3IgYSBjb250YWluZXIuIFNvLCBkb24ndCBzcGVjaWZ5IGxlc3MgdGhhbiA0IE1pQiBvZiBtZW1vcnkgZm9yIHlvdXIgY29udGFpbmVycy5cbiAqL1xuTWVtb3J5UmVzZXJ2YXRpb24/OiBudW1iZXJcblJlcG9zaXRvcnlDcmVkZW50aWFscz86IFJlcG9zaXRvcnlDcmVkZW50aWFsc1xuLyoqXG4gKiBBIGxpc3Qgb2YgaG9zdG5hbWVzIGFuZCBJUCBhZGRyZXNzIG1hcHBpbmdzIHRvIGFwcGVuZCB0byB0aGUgYGAvZXRjL2hvc3RzYGAgZmlsZSBvbiB0aGUgY29udGFpbmVyLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgRXh0cmFIb3N0c2BgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kIGFuZCB0aGUgYGAtLWFkZC1ob3N0YGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKiAgIFRoaXMgcGFyYW1ldGVyIGlzbid0IHN1cHBvcnRlZCBmb3IgV2luZG93cyBjb250YWluZXJzIG9yIHRhc2tzIHRoYXQgdXNlIHRoZSBgYGF3c3ZwY2BgIG5ldHdvcmsgbW9kZS5cbiAqL1xuRXh0cmFIb3N0cz86IEhvc3RFbnRyeVtdXG4vKipcbiAqIFRoZSBob3N0bmFtZSB0byB1c2UgZm9yIHlvdXIgY29udGFpbmVyLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgSG9zdG5hbWVgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS1ob3N0bmFtZWBgIG9wdGlvbiB0byBkb2NrZXIgcnVuLlxuICogICBUaGUgYGBob3N0bmFtZWBgIHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkIGlmIHlvdSdyZSB1c2luZyB0aGUgYGBhd3N2cGNgYCBuZXR3b3JrIG1vZGUuXG4gKi9cbkhvc3RuYW1lPzogc3RyaW5nXG5MaW51eFBhcmFtZXRlcnM/OiBMaW51eFBhcmFtZXRlcnNcbi8qKlxuICogU3BlY2lmaWVzIHdoZXRoZXIgQW1hem9uIEVDUyB3aWxsIHJlc29sdmUgdGhlIGNvbnRhaW5lciBpbWFnZSB0YWcgcHJvdmlkZWQgaW4gdGhlIGNvbnRhaW5lciBkZWZpbml0aW9uIHRvIGFuIGltYWdlIGRpZ2VzdC4gQnkgZGVmYXVsdCwgdGhlIHZhbHVlIGlzIGBgZW5hYmxlZGBgLiBJZiB5b3Ugc2V0IHRoZSB2YWx1ZSBmb3IgYSBjb250YWluZXIgYXMgYGBkaXNhYmxlZGBgLCBBbWF6b24gRUNTIHdpbGwgbm90IHJlc29sdmUgdGhlIHByb3ZpZGVkIGNvbnRhaW5lciBpbWFnZSB0YWcgdG8gYSBkaWdlc3QgYW5kIHdpbGwgdXNlIHRoZSBvcmlnaW5hbCBpbWFnZSBVUkkgc3BlY2lmaWVkIGluIHRoZSBjb250YWluZXIgZGVmaW5pdGlvbiBmb3IgZGVwbG95bWVudC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgY29udGFpbmVyIGltYWdlIHJlc29sdXRpb24sIHNlZSBbQ29udGFpbmVyIGltYWdlIHJlc29sdXRpb25dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2RlcGxveW1lbnQtdHlwZS1lY3MuaHRtbCNkZXBsb3ltZW50LWNvbnRhaW5lci1pbWFnZS1zdGFiaWxpdHkpIGluIHRoZSAqQW1hem9uIEVDUyBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5WZXJzaW9uQ29uc2lzdGVuY3k/OiAoXCJlbmFibGVkXCIgfCBcImRpc2FibGVkXCIpXG5SZXN0YXJ0UG9saWN5PzogUmVzdGFydFBvbGljeVxuLyoqXG4gKiBXaGVuIHRoaXMgcGFyYW1ldGVyIGlzIHRydWUsIG5ldHdvcmtpbmcgaXMgb2ZmIHdpdGhpbiB0aGUgY29udGFpbmVyLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgTmV0d29ya0Rpc2FibGVkYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQuXG4gKiAgIFRoaXMgcGFyYW1ldGVyIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIFdpbmRvd3MgY29udGFpbmVycy5cbiAqL1xuRGlzYWJsZU5ldHdvcmtpbmc/OiBib29sZWFuXG4vKipcbiAqIFdoZW4gdGhpcyBwYXJhbWV0ZXIgaXMgYGB0cnVlYGAsIGEgVFRZIGlzIGFsbG9jYXRlZC4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYFR0eWBgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kIGFuZCB0aGUgYGAtLXR0eWBgIG9wdGlvbiB0byBkb2NrZXIgcnVuLlxuICovXG5Qc2V1ZG9UZXJtaW5hbD86IGJvb2xlYW5cbi8qKlxuICogVGhlIG1vdW50IHBvaW50cyBmb3IgZGF0YSB2b2x1bWVzIGluIHlvdXIgY29udGFpbmVyLlxuICogIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBWb2x1bWVzYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYC0tdm9sdW1lYGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKiAgV2luZG93cyBjb250YWluZXJzIGNhbiBtb3VudCB3aG9sZSBkaXJlY3RvcmllcyBvbiB0aGUgc2FtZSBkcml2ZSBhcyBgYCRlbnY6UHJvZ3JhbURhdGFgYC4gV2luZG93cyBjb250YWluZXJzIGNhbid0IG1vdW50IGRpcmVjdG9yaWVzIG9uIGEgZGlmZmVyZW50IGRyaXZlLCBhbmQgbW91bnQgcG9pbnQgY2FuJ3QgYmUgYWNyb3NzIGRyaXZlcy5cbiAqL1xuTW91bnRQb2ludHM/OiBNb3VudFBvaW50W11cbi8qKlxuICogVGhlIGRlcGVuZGVuY2llcyBkZWZpbmVkIGZvciBjb250YWluZXIgc3RhcnR1cCBhbmQgc2h1dGRvd24uIEEgY29udGFpbmVyIGNhbiBjb250YWluIG11bHRpcGxlIGRlcGVuZGVuY2llcy4gV2hlbiBhIGRlcGVuZGVuY3kgaXMgZGVmaW5lZCBmb3IgY29udGFpbmVyIHN0YXJ0dXAsIGZvciBjb250YWluZXIgc2h1dGRvd24gaXQgaXMgcmV2ZXJzZWQuXG4gKiAgRm9yIHRhc2tzIHVzaW5nIHRoZSBFQzIgbGF1bmNoIHR5cGUsIHRoZSBjb250YWluZXIgaW5zdGFuY2VzIHJlcXVpcmUgYXQgbGVhc3QgdmVyc2lvbiAxLjI2LjAgb2YgdGhlIGNvbnRhaW5lciBhZ2VudCB0byB0dXJuIG9uIGNvbnRhaW5lciBkZXBlbmRlbmNpZXMuIEhvd2V2ZXIsIHdlIHJlY29tbWVuZCB1c2luZyB0aGUgbGF0ZXN0IGNvbnRhaW5lciBhZ2VudCB2ZXJzaW9uLiBGb3IgaW5mb3JtYXRpb24gYWJvdXQgY2hlY2tpbmcgeW91ciBhZ2VudCB2ZXJzaW9uIGFuZCB1cGRhdGluZyB0byB0aGUgbGF0ZXN0IHZlcnNpb24sIHNlZSBbVXBkYXRpbmcgdGhlIEFtYXpvbiBFQ1MgQ29udGFpbmVyIEFnZW50XShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9lY3MtYWdlbnQtdXBkYXRlLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi4gSWYgeW91J3JlIHVzaW5nIGFuIEFtYXpvbiBFQ1Mtb3B0aW1pemVkIExpbnV4IEFNSSwgeW91ciBpbnN0YW5jZSBuZWVkcyBhdCBsZWFzdCB2ZXJzaW9uIDEuMjYuMC0xIG9mIHRoZSBgYGVjcy1pbml0YGAgcGFja2FnZS4gSWYgeW91ciBjb250YWluZXIgaW5zdGFuY2VzIGFyZSBsYXVuY2hlZCBmcm9tIHZlcnNpb24gYGAyMDE5MDMwMWBgIG9yIGxhdGVyLCB0aGVuIHRoZXkgY29udGFpbiB0aGUgcmVxdWlyZWQgdmVyc2lvbnMgb2YgdGhlIGNvbnRhaW5lciBhZ2VudCBhbmQgYGBlY3MtaW5pdGBgLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtBbWF6b24gRUNTLW9wdGltaXplZCBMaW51eCBBTUldKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2Vjcy1vcHRpbWl6ZWRfQU1JLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICBGb3IgdGFza3MgdXNpbmcgdGhlIEZhcmdhdGUgbGF1bmNoIHR5cGUsIHRoZSB0YXNrIG9yIHNlcnZpY2UgcmVxdWlyZXMgdGhlIGZvbGxvd2luZyBwbGF0Zm9ybXM6XG4gKiAgICsgIExpbnV4IHBsYXRmb3JtIHZlcnNpb24gYGAxLjMuMGBgIG9yIGxhdGVyLlxuICogICArICBXaW5kb3dzIHBsYXRmb3JtIHZlcnNpb24gYGAxLjAuMGBgIG9yIGxhdGVyLlxuICogICBcbiAqICBJZiB0aGUgdGFzayBkZWZpbml0aW9uIGlzIHVzZWQgaW4gYSBibHVlL2dyZWVuIGRlcGxveW1lbnQgdGhhdCB1c2VzIFtBV1M6OkNvZGVEZXBsb3k6OkRlcGxveW1lbnRHcm91cCBCbHVlR3JlZW5EZXBsb3ltZW50Q29uZmlndXJhdGlvbl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvYXdzLXByb3BlcnRpZXMtY29kZWRlcGxveS1kZXBsb3ltZW50Z3JvdXAtYmx1ZWdyZWVuZGVwbG95bWVudGNvbmZpZ3VyYXRpb24uaHRtbCksIHRoZSBgYGRlcGVuZHNPbmBgIHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgW0lzc3VlICM2ODBdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9odHRwczovL2dpdGh1Yi5jb20vYXdzLWNsb3VkZm9ybWF0aW9uL2Nsb3VkZm9ybWF0aW9uLWNvdmVyYWdlLXJvYWRtYXAvaXNzdWVzLzY4MCkgb24gdGhlIG9uIHRoZSBHaXRIdWIgd2Vic2l0ZS5cbiAqL1xuRGVwZW5kc09uPzogQ29udGFpbmVyRGVwZW5kZW5jeVtdXG4vKipcbiAqIEEga2V5L3ZhbHVlIG1hcCBvZiBsYWJlbHMgdG8gYWRkIHRvIHRoZSBjb250YWluZXIuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBMYWJlbHNgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS1sYWJlbGBgIG9wdGlvbiB0byBkb2NrZXIgcnVuLiBUaGlzIHBhcmFtZXRlciByZXF1aXJlcyB2ZXJzaW9uIDEuMTggb2YgdGhlIERvY2tlciBSZW1vdGUgQVBJIG9yIGdyZWF0ZXIgb24geW91ciBjb250YWluZXIgaW5zdGFuY2UuIFRvIGNoZWNrIHRoZSBEb2NrZXIgUmVtb3RlIEFQSSB2ZXJzaW9uIG9uIHlvdXIgY29udGFpbmVyIGluc3RhbmNlLCBsb2cgaW4gdG8geW91ciBjb250YWluZXIgaW5zdGFuY2UgYW5kIHJ1biB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6IGBgc3VkbyBkb2NrZXIgdmVyc2lvbiAtLWZvcm1hdCAne3suU2VydmVyLkFQSVZlcnNpb259fSdgYFxuICovXG5Eb2NrZXJMYWJlbHM/OiB7XG4vKipcbiAqIFRoaXMgaW50ZXJmYWNlIHdhcyByZWZlcmVuY2VkIGJ5IGB1bmRlZmluZWRgJ3MgSlNPTi1TY2hlbWEgZGVmaW5pdGlvblxuICogdmlhIHRoZSBgcGF0dGVyblByb3BlcnR5YCBcIi57MSx9XCIuXG4gKi9cbltrOiBzdHJpbmddOiBzdHJpbmdcbn1cbi8qKlxuICogVGhlIGxpc3Qgb2YgcG9ydCBtYXBwaW5ncyBmb3IgdGhlIGNvbnRhaW5lci4gUG9ydCBtYXBwaW5ncyBhbGxvdyBjb250YWluZXJzIHRvIGFjY2VzcyBwb3J0cyBvbiB0aGUgaG9zdCBjb250YWluZXIgaW5zdGFuY2UgdG8gc2VuZCBvciByZWNlaXZlIHRyYWZmaWMuXG4gKiAgRm9yIHRhc2sgZGVmaW5pdGlvbnMgdGhhdCB1c2UgdGhlIGBgYXdzdnBjYGAgbmV0d29yayBtb2RlLCB5b3Ugc2hvdWxkIG9ubHkgc3BlY2lmeSB0aGUgYGBjb250YWluZXJQb3J0YGAuIFRoZSBgYGhvc3RQb3J0YGAgY2FuIGJlIGxlZnQgYmxhbmsgb3IgaXQgbXVzdCBiZSB0aGUgc2FtZSB2YWx1ZSBhcyB0aGUgYGBjb250YWluZXJQb3J0YGAuXG4gKiAgUG9ydCBtYXBwaW5ncyBvbiBXaW5kb3dzIHVzZSB0aGUgYGBOZXROQVRgYCBnYXRld2F5IGFkZHJlc3MgcmF0aGVyIHRoYW4gYGBsb2NhbGhvc3RgYC4gVGhlcmUgaXMgbm8gbG9vcGJhY2sgZm9yIHBvcnQgbWFwcGluZ3Mgb24gV2luZG93cywgc28geW91IGNhbm5vdCBhY2Nlc3MgYSBjb250YWluZXIncyBtYXBwZWQgcG9ydCBmcm9tIHRoZSBob3N0IGl0c2VsZi4gXG4gKiAgVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYFBvcnRCaW5kaW5nc2BgIGluIHRoZSBbQ3JlYXRlIGEgY29udGFpbmVyXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaHR0cHM6Ly9kb2NzLmRvY2tlci5jb20vZW5naW5lL2FwaS92MS4zNS8jb3BlcmF0aW9uL0NvbnRhaW5lckNyZWF0ZSkgc2VjdGlvbiBvZiB0aGUgW0RvY2tlciBSZW1vdGUgQVBJXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaHR0cHM6Ly9kb2NzLmRvY2tlci5jb20vZW5naW5lL2FwaS92MS4zNS8pIGFuZCB0aGUgYGAtLXB1Ymxpc2hgYCBvcHRpb24gdG8gW2RvY2tlciBydW5dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9odHRwczovL2RvY3MuZG9ja2VyLmNvbS9lbmdpbmUvcmVmZXJlbmNlL3J1bi8pLiBJZiB0aGUgbmV0d29yayBtb2RlIG9mIGEgdGFzayBkZWZpbml0aW9uIGlzIHNldCB0byBgYG5vbmVgYCwgdGhlbiB5b3UgY2FuJ3Qgc3BlY2lmeSBwb3J0IG1hcHBpbmdzLiBJZiB0aGUgbmV0d29yayBtb2RlIG9mIGEgdGFzayBkZWZpbml0aW9uIGlzIHNldCB0byBgYGhvc3RgYCwgdGhlbiBob3N0IHBvcnRzIG11c3QgZWl0aGVyIGJlIHVuZGVmaW5lZCBvciB0aGV5IG11c3QgbWF0Y2ggdGhlIGNvbnRhaW5lciBwb3J0IGluIHRoZSBwb3J0IG1hcHBpbmcuXG4gKiAgIEFmdGVyIGEgdGFzayByZWFjaGVzIHRoZSBgYFJVTk5JTkdgYCBzdGF0dXMsIG1hbnVhbCBhbmQgYXV0b21hdGljIGhvc3QgYW5kIGNvbnRhaW5lciBwb3J0IGFzc2lnbm1lbnRzIGFyZSB2aXNpYmxlIGluIHRoZSAqTmV0d29yayBCaW5kaW5ncyogc2VjdGlvbiBvZiBhIGNvbnRhaW5lciBkZXNjcmlwdGlvbiBmb3IgYSBzZWxlY3RlZCB0YXNrIGluIHRoZSBBbWF6b24gRUNTIGNvbnNvbGUuIFRoZSBhc3NpZ25tZW50cyBhcmUgYWxzbyB2aXNpYmxlIGluIHRoZSBgYG5ldHdvcmtCaW5kaW5nc2BgIHNlY3Rpb24gW0Rlc2NyaWJlVGFza3NdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVUYXNrcy5odG1sKSByZXNwb25zZXMuXG4gKi9cblBvcnRNYXBwaW5ncz86IFBvcnRNYXBwaW5nW11cbi8qKlxuICogVGhlIGNvbW1hbmQgdGhhdCdzIHBhc3NlZCB0byB0aGUgY29udGFpbmVyLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgQ21kYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYENPTU1BTkRgYCBwYXJhbWV0ZXIgdG8gZG9ja2VyIHJ1bi4gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGFyZ3VtZW50cywgZWFjaCBhcmd1bWVudCBpcyBhIHNlcGFyYXRlZCBzdHJpbmcgaW4gdGhlIGFycmF5LlxuICovXG5Db21tYW5kPzogc3RyaW5nW11cbi8qKlxuICogVGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBwYXNzIHRvIGEgY29udGFpbmVyLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgRW52YGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYC0tZW52YGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKiAgIFdlIGRvbid0IHJlY29tbWVuZCB0aGF0IHlvdSB1c2UgcGxhaW50ZXh0IGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3Igc2Vuc2l0aXZlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGNyZWRlbnRpYWwgZGF0YS5cbiAqL1xuRW52aXJvbm1lbnQ/OiBLZXlWYWx1ZVBhaXJbXVxuLyoqXG4gKiBUaGUgYGBsaW5rc2BgIHBhcmFtZXRlciBhbGxvd3MgY29udGFpbmVycyB0byBjb21tdW5pY2F0ZSB3aXRoIGVhY2ggb3RoZXIgd2l0aG91dCB0aGUgbmVlZCBmb3IgcG9ydCBtYXBwaW5ncy4gVGhpcyBwYXJhbWV0ZXIgaXMgb25seSBzdXBwb3J0ZWQgaWYgdGhlIG5ldHdvcmsgbW9kZSBvZiBhIHRhc2sgZGVmaW5pdGlvbiBpcyBgYGJyaWRnZWBgLiBUaGUgYGBuYW1lOmludGVybmFsTmFtZWBgIGNvbnN0cnVjdCBpcyBhbmFsb2dvdXMgdG8gYGBuYW1lOmFsaWFzYGAgaW4gRG9ja2VyIGxpbmtzLiBVcCB0byAyNTUgbGV0dGVycyAodXBwZXJjYXNlIGFuZCBsb3dlcmNhc2UpLCBudW1iZXJzLCB1bmRlcnNjb3JlcywgYW5kIGh5cGhlbnMgYXJlIGFsbG93ZWQuLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgTGlua3NgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS1saW5rYGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKiAgIFRoaXMgcGFyYW1ldGVyIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIFdpbmRvd3MgY29udGFpbmVycy5cbiAqICAgIENvbnRhaW5lcnMgdGhhdCBhcmUgY29sbG9jYXRlZCBvbiBhIHNpbmdsZSBjb250YWluZXIgaW5zdGFuY2UgbWF5IGJlIGFibGUgdG8gY29tbXVuaWNhdGUgd2l0aCBlYWNoIG90aGVyIHdpdGhvdXQgcmVxdWlyaW5nIGxpbmtzIG9yIGhvc3QgcG9ydCBtYXBwaW5ncy4gTmV0d29yayBpc29sYXRpb24gaXMgYWNoaWV2ZWQgb24gdGhlIGNvbnRhaW5lciBpbnN0YW5jZSB1c2luZyBzZWN1cml0eSBncm91cHMgYW5kIFZQQyBzZXR0aW5ncy5cbiAqL1xuTGlua3M/OiBzdHJpbmdbXVxufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzZWNyZXQgdG8gZXhwb3NlIHRvIHlvdXIgY29udGFpbmVyLiBTZWNyZXRzIGNhbiBiZSBleHBvc2VkIHRvIGEgY29udGFpbmVyIGluIHRoZSBmb2xsb3dpbmcgd2F5czpcbiAqICAgKyAgVG8gaW5qZWN0IHNlbnNpdGl2ZSBkYXRhIGludG8geW91ciBjb250YWluZXJzIGFzIGVudmlyb25tZW50IHZhcmlhYmxlcywgdXNlIHRoZSBgYHNlY3JldHNgYCBjb250YWluZXIgZGVmaW5pdGlvbiBwYXJhbWV0ZXIuXG4gKiAgICsgIFRvIHJlZmVyZW5jZSBzZW5zaXRpdmUgaW5mb3JtYXRpb24gaW4gdGhlIGxvZyBjb25maWd1cmF0aW9uIG9mIGEgY29udGFpbmVyLCB1c2UgdGhlIGBgc2VjcmV0T3B0aW9uc2BgIGNvbnRhaW5lciBkZWZpbml0aW9uIHBhcmFtZXRlci5cbiAqICAgXG4gKiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbU3BlY2lmeWluZyBzZW5zaXRpdmUgZGF0YV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvc3BlY2lmeWluZy1zZW5zaXRpdmUtZGF0YS5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VjcmV0IHtcbi8qKlxuICogVGhlIHNlY3JldCB0byBleHBvc2UgdG8gdGhlIGNvbnRhaW5lci4gVGhlIHN1cHBvcnRlZCB2YWx1ZXMgYXJlIGVpdGhlciB0aGUgZnVsbCBBUk4gb2YgdGhlIEFTTWxvbmcgc2VjcmV0IG9yIHRoZSBmdWxsIEFSTiBvZiB0aGUgcGFyYW1ldGVyIGluIHRoZSBTU00gUGFyYW1ldGVyIFN0b3JlLlxuICogIEZvciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVxdWlyZSBJQU1sb25nIHBlcm1pc3Npb25zLCBzZWUgW1JlcXVpcmVkIElBTSBwZXJtaXNzaW9ucyBmb3IgQW1hem9uIEVDUyBzZWNyZXRzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9zcGVjaWZ5aW5nLXNlbnNpdGl2ZS1kYXRhLXNlY3JldHMuaHRtbCNzZWNyZXRzLWlhbSkgKGZvciBTZWNyZXRzIE1hbmFnZXIpIG9yIFtSZXF1aXJlZCBJQU0gcGVybWlzc2lvbnMgZm9yIEFtYXpvbiBFQ1Mgc2VjcmV0c10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvc3BlY2lmeWluZy1zZW5zaXRpdmUtZGF0YS1wYXJhbWV0ZXJzLmh0bWwpIChmb3IgU3lzdGVtcyBNYW5hZ2VyIFBhcmFtZXRlciBzdG9yZSkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICogICBJZiB0aGUgU1NNIFBhcmFtZXRlciBTdG9yZSBwYXJhbWV0ZXIgZXhpc3RzIGluIHRoZSBzYW1lIFJlZ2lvbiBhcyB0aGUgdGFzayB5b3UncmUgbGF1bmNoaW5nLCB0aGVuIHlvdSBjYW4gdXNlIGVpdGhlciB0aGUgZnVsbCBBUk4gb3IgbmFtZSBvZiB0aGUgcGFyYW1ldGVyLiBJZiB0aGUgcGFyYW1ldGVyIGV4aXN0cyBpbiBhIGRpZmZlcmVudCBSZWdpb24sIHRoZW4gdGhlIGZ1bGwgQVJOIG11c3QgYmUgc3BlY2lmaWVkLlxuICovXG5WYWx1ZUZyb206IHN0cmluZ1xuLyoqXG4gKiBUaGUgbmFtZSBvZiB0aGUgc2VjcmV0LlxuICovXG5OYW1lOiBzdHJpbmdcbn1cbi8qKlxuICogVGhlIGNvbnRhaW5lciBoZWFsdGggY2hlY2sgY29tbWFuZCBhbmQgYXNzb2NpYXRlZCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgZm9yIHRoZSBjb250YWluZXIuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBIZWFsdGhDaGVja2BgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kIGFuZCB0aGUgYGBIRUFMVEhDSEVDS2BgIHBhcmFtZXRlciBvZiBkb2NrZXIgcnVuLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhlYWx0aENoZWNrIHtcbi8qKlxuICogQSBzdHJpbmcgYXJyYXkgcmVwcmVzZW50aW5nIHRoZSBjb21tYW5kIHRoYXQgdGhlIGNvbnRhaW5lciBydW5zIHRvIGRldGVybWluZSBpZiBpdCBpcyBoZWFsdGh5LiBUaGUgc3RyaW5nIGFycmF5IG11c3Qgc3RhcnQgd2l0aCBgYENNRGBgIHRvIHJ1biB0aGUgY29tbWFuZCBhcmd1bWVudHMgZGlyZWN0bHksIG9yIGBgQ01ELVNIRUxMYGAgdG8gcnVuIHRoZSBjb21tYW5kIHdpdGggdGhlIGNvbnRhaW5lcidzIGRlZmF1bHQgc2hlbGwuIFxuICogICBXaGVuIHlvdSB1c2UgdGhlIEFXUyBNYW5hZ2VtZW50IENvbnNvbGUgSlNPTiBwYW5lbCwgdGhlIENMSWxvbmcsIG9yIHRoZSBBUElzLCBlbmNsb3NlIHRoZSBsaXN0IG9mIGNvbW1hbmRzIGluIGRvdWJsZSBxdW90ZXMgYW5kIGJyYWNrZXRzLlxuICogICBgYFsgXCJDTUQtU0hFTExcIiwgXCJjdXJsIC1mIGh0dHA6Ly9sb2NhbGhvc3QvIHx8IGV4aXQgMVwiIF1gYCBcbiAqICBZb3UgZG9uJ3QgaW5jbHVkZSB0aGUgZG91YmxlIHF1b3RlcyBhbmQgYnJhY2tldHMgd2hlbiB5b3UgdXNlIHRoZSBBV1MgTWFuYWdlbWVudCBDb25zb2xlLlxuICogICBgYENNRC1TSEVMTCwgY3VybCAtZiBodHRwOi8vbG9jYWxob3N0LyB8fCBleGl0IDFgYCBcbiAqICBBbiBleGl0IGNvZGUgb2YgMCBpbmRpY2F0ZXMgc3VjY2VzcywgYW5kIG5vbi16ZXJvIGV4aXQgY29kZSBpbmRpY2F0ZXMgZmFpbHVyZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBgYEhlYWx0aENoZWNrYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQuXG4gKi9cbkNvbW1hbmQ/OiBzdHJpbmdbXVxuLyoqXG4gKiBUaGUgdGltZSBwZXJpb2QgaW4gc2Vjb25kcyB0byB3YWl0IGZvciBhIGhlYWx0aCBjaGVjayB0byBzdWNjZWVkIGJlZm9yZSBpdCBpcyBjb25zaWRlcmVkIGEgZmFpbHVyZS4gWW91IG1heSBzcGVjaWZ5IGJldHdlZW4gMiBhbmQgNjAgc2Vjb25kcy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgNS5cbiAqL1xuVGltZW91dD86IG51bWJlclxuLyoqXG4gKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIHJldHJ5IGEgZmFpbGVkIGhlYWx0aCBjaGVjayBiZWZvcmUgdGhlIGNvbnRhaW5lciBpcyBjb25zaWRlcmVkIHVuaGVhbHRoeS4gWW91IG1heSBzcGVjaWZ5IGJldHdlZW4gMSBhbmQgMTAgcmV0cmllcy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMy5cbiAqL1xuUmV0cmllcz86IG51bWJlclxuLyoqXG4gKiBUaGUgdGltZSBwZXJpb2QgaW4gc2Vjb25kcyBiZXR3ZWVuIGVhY2ggaGVhbHRoIGNoZWNrIGV4ZWN1dGlvbi4gWW91IG1heSBzcGVjaWZ5IGJldHdlZW4gNSBhbmQgMzAwIHNlY29uZHMuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDMwIHNlY29uZHMuXG4gKi9cbkludGVydmFsPzogbnVtYmVyXG4vKipcbiAqIFRoZSBvcHRpb25hbCBncmFjZSBwZXJpb2QgdG8gcHJvdmlkZSBjb250YWluZXJzIHRpbWUgdG8gYm9vdHN0cmFwIGJlZm9yZSBmYWlsZWQgaGVhbHRoIGNoZWNrcyBjb3VudCB0b3dhcmRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiByZXRyaWVzLiBZb3UgY2FuIHNwZWNpZnkgYmV0d2VlbiAwIGFuZCAzMDAgc2Vjb25kcy4gQnkgZGVmYXVsdCwgdGhlIGBgc3RhcnRQZXJpb2RgYCBpcyBvZmYuXG4gKiAgIElmIGEgaGVhbHRoIGNoZWNrIHN1Y2NlZWRzIHdpdGhpbiB0aGUgYGBzdGFydFBlcmlvZGBgLCB0aGVuIHRoZSBjb250YWluZXIgaXMgY29uc2lkZXJlZCBoZWFsdGh5IGFuZCBhbnkgc3Vic2VxdWVudCBmYWlsdXJlcyBjb3VudCB0b3dhcmQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJldHJpZXMuXG4gKi9cblN0YXJ0UGVyaW9kPzogbnVtYmVyXG59XG4vKipcbiAqIERldGFpbHMgb24gYSBkYXRhIHZvbHVtZSBmcm9tIGFub3RoZXIgY29udGFpbmVyIGluIHRoZSBzYW1lIHRhc2sgZGVmaW5pdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWb2x1bWVGcm9tIHtcbi8qKlxuICogSWYgdGhpcyB2YWx1ZSBpcyBgYHRydWVgYCwgdGhlIGNvbnRhaW5lciBoYXMgcmVhZC1vbmx5IGFjY2VzcyB0byB0aGUgdm9sdW1lLiBJZiB0aGlzIHZhbHVlIGlzIGBgZmFsc2VgYCwgdGhlbiB0aGUgY29udGFpbmVyIGNhbiB3cml0ZSB0byB0aGUgdm9sdW1lLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgYGZhbHNlYGAuXG4gKi9cblJlYWRPbmx5PzogYm9vbGVhblxuLyoqXG4gKiBUaGUgbmFtZSBvZiBhbm90aGVyIGNvbnRhaW5lciB3aXRoaW4gdGhlIHNhbWUgdGFzayBkZWZpbml0aW9uIHRvIG1vdW50IHZvbHVtZXMgZnJvbS5cbiAqL1xuU291cmNlQ29udGFpbmVyPzogc3RyaW5nXG59XG4vKipcbiAqIFRoZSBsb2cgY29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9uIGZvciB0aGUgY29udGFpbmVyLlxuICogIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBMb2dDb25maWdgYCBpbiB0aGUgZG9ja2VyIENyZWF0ZSBhIGNvbnRhaW5lciBjb21tYW5kIGFuZCB0aGUgYGAtLWxvZy1kcml2ZXJgYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi4gQnkgZGVmYXVsdCwgY29udGFpbmVycyB1c2UgdGhlIHNhbWUgbG9nZ2luZyBkcml2ZXIgdGhhdCB0aGUgRG9ja2VyIGRhZW1vbiB1c2VzLiBIb3dldmVyLCB0aGUgY29udGFpbmVyIG1heSB1c2UgYSBkaWZmZXJlbnQgbG9nZ2luZyBkcml2ZXIgdGhhbiB0aGUgRG9ja2VyIGRhZW1vbiBieSBzcGVjaWZ5aW5nIGEgbG9nIGRyaXZlciB3aXRoIHRoaXMgcGFyYW1ldGVyIGluIHRoZSBjb250YWluZXIgZGVmaW5pdGlvbi4gVG8gdXNlIGEgZGlmZmVyZW50IGxvZ2dpbmcgZHJpdmVyIGZvciBhIGNvbnRhaW5lciwgdGhlIGxvZyBzeXN0ZW0gbXVzdCBiZSBjb25maWd1cmVkIHByb3Blcmx5IG9uIHRoZSBjb250YWluZXIgaW5zdGFuY2UgKG9yIG9uIGEgZGlmZmVyZW50IGxvZyBzZXJ2ZXIgZm9yIHJlbW90ZSBsb2dnaW5nIG9wdGlvbnMpLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgb3B0aW9ucyBmb3IgZGlmZmVyZW50IHN1cHBvcnRlZCBsb2cgZHJpdmVycywgc2VlIFtDb25maWd1cmUgbG9nZ2luZyBkcml2ZXJzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaHR0cHM6Ly9kb2NzLmRvY2tlci5jb20vZW5naW5lL2FkbWluL2xvZ2dpbmcvb3ZlcnZpZXcvKSBpbiB0aGUgRG9ja2VyIGRvY3VtZW50YXRpb24uXG4gKiAgIEFtYXpvbiBFQ1MgY3VycmVudGx5IHN1cHBvcnRzIGEgc3Vic2V0IG9mIHRoZSBsb2dnaW5nIGRyaXZlcnMgYXZhaWxhYmxlIHRvIHRoZSBEb2NrZXIgZGFlbW9uIChzaG93biBpbiB0aGUgW0xvZ0NvbmZpZ3VyYXRpb25dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTG9nQ29uZmlndXJhdGlvbi5odG1sKSBkYXRhIHR5cGUpLiBBZGRpdGlvbmFsIGxvZyBkcml2ZXJzIG1heSBiZSBhdmFpbGFibGUgaW4gZnV0dXJlIHJlbGVhc2VzIG9mIHRoZSBBbWF6b24gRUNTIGNvbnRhaW5lciBhZ2VudC5cbiAqICAgVGhpcyBwYXJhbWV0ZXIgcmVxdWlyZXMgdmVyc2lvbiAxLjE4IG9mIHRoZSBEb2NrZXIgUmVtb3RlIEFQSSBvciBncmVhdGVyIG9uIHlvdXIgY29udGFpbmVyIGluc3RhbmNlLiBUbyBjaGVjayB0aGUgRG9ja2VyIFJlbW90ZSBBUEkgdmVyc2lvbiBvbiB5b3VyIGNvbnRhaW5lciBpbnN0YW5jZSwgbG9nIGluIHRvIHlvdXIgY29udGFpbmVyIGluc3RhbmNlIGFuZCBydW4gdGhlIGZvbGxvd2luZyBjb21tYW5kOiBgYHN1ZG8gZG9ja2VyIHZlcnNpb24gLS1mb3JtYXQgJ3t7LlNlcnZlci5BUElWZXJzaW9ufX0nYGAgXG4gKiAgIFRoZSBBbWF6b24gRUNTIGNvbnRhaW5lciBhZ2VudCBydW5uaW5nIG9uIGEgY29udGFpbmVyIGluc3RhbmNlIG11c3QgcmVnaXN0ZXIgdGhlIGxvZ2dpbmcgZHJpdmVycyBhdmFpbGFibGUgb24gdGhhdCBpbnN0YW5jZSB3aXRoIHRoZSBgYEVDU19BVkFJTEFCTEVfTE9HR0lOR19EUklWRVJTYGAgZW52aXJvbm1lbnQgdmFyaWFibGUgYmVmb3JlIGNvbnRhaW5lcnMgcGxhY2VkIG9uIHRoYXQgaW5zdGFuY2UgY2FuIHVzZSB0aGVzZSBsb2cgY29uZmlndXJhdGlvbiBvcHRpb25zLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtDb250YWluZXIgQWdlbnQgQ29uZmlndXJhdGlvbl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvZWNzLWFnZW50LWNvbmZpZy5odG1sKSBpbiB0aGUgKkRldmVsb3BlciBHdWlkZSouXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9nQ29uZmlndXJhdGlvbiB7XG4vKipcbiAqIFRoZSBzZWNyZXRzIHRvIHBhc3MgdG8gdGhlIGxvZyBjb25maWd1cmF0aW9uLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtTcGVjaWZ5aW5nIHNlbnNpdGl2ZSBkYXRhXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9zcGVjaWZ5aW5nLXNlbnNpdGl2ZS1kYXRhLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuU2VjcmV0T3B0aW9ucz86IFNlY3JldFtdXG4vKipcbiAqIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gc2VuZCB0byB0aGUgbG9nIGRyaXZlci5cbiAqICBUaGUgb3B0aW9ucyB5b3UgY2FuIHNwZWNpZnkgZGVwZW5kIG9uIHRoZSBsb2cgZHJpdmVyLiBTb21lIG9mIHRoZSBvcHRpb25zIHlvdSBjYW4gc3BlY2lmeSB3aGVuIHlvdSB1c2UgdGhlIGBgYXdzbG9nc2BgIGxvZyBkcml2ZXIgdG8gcm91dGUgbG9ncyB0byBBbWF6b24gQ2xvdWRXYXRjaCBpbmNsdWRlIHRoZSBmb2xsb3dpbmc6XG4gKiAgICsgYXdzbG9ncy1jcmVhdGUtZ3JvdXAgUmVxdWlyZWQ6IE5vIFNwZWNpZnkgd2hldGhlciB5b3Ugd2FudCB0aGUgbG9nIGdyb3VwIHRvIGJlIGNyZWF0ZWQgYXV0b21hdGljYWxseS4gSWYgdGhpcyBvcHRpb24gaXNuJ3Qgc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byBmYWxzZS4gWW91ciBJQU0gcG9saWN5IG11c3QgaW5jbHVkZSB0aGUgbG9nczpDcmVhdGVMb2dHcm91cCBwZXJtaXNzaW9uIGJlZm9yZSB5b3UgYXR0ZW1wdCB0byB1c2UgYXdzbG9ncy1jcmVhdGUtZ3JvdXAuICsgYXdzbG9ncy1yZWdpb24gUmVxdWlyZWQ6IFllcyBTcGVjaWZ5IHRoZSBSZWdpb24gdGhhdCB0aGUgYXdzbG9ncyBsb2cgZHJpdmVyIGlzIHRvIHNlbmQgeW91ciBEb2NrZXIgbG9ncyB0by4gWW91IGNhbiBjaG9vc2UgdG8gc2VuZCBhbGwgb2YgeW91ciBsb2dzIGZyb20gY2x1c3RlcnMgaW4gZGlmZmVyZW50IFJlZ2lvbnMgdG8gYSBzaW5nbGUgcmVnaW9uIGluIENsb3VkV2F0Y2ggTG9ncy4gVGhpcyBpcyBzbyB0aGF0IHRoZXkncmUgYWxsIHZpc2libGUgaW4gb25lIGxvY2F0aW9uLiBPdGhlcndpc2UsIHlvdSBjYW4gc2VwYXJhdGUgdGhlbSBieSBSZWdpb24gZm9yIG1vcmUgZ3JhbnVsYXJpdHkuIE1ha2Ugc3VyZSB0aGF0IHRoZSBzcGVjaWZpZWQgbG9nIGdyb3VwIGV4aXN0cyBpbiB0aGUgUmVnaW9uIHRoYXQgeW91IHNwZWNpZnkgd2l0aCB0aGlzIG9wdGlvbi4gKyBhd3Nsb2dzLWdyb3VwIFJlcXVpcmVkOiBZZXMgTWFrZSBzdXJlIHRvIHNwZWNpZnkgYSBsb2cgZ3JvdXAgdGhhdCB0aGUgYXdzbG9ncyBsb2cgZHJpdmVyIHNlbmRzIGl0cyBsb2cgc3RyZWFtcyB0by4gKyBhd3Nsb2dzLXN0cmVhbS1wcmVmaXggUmVxdWlyZWQ6IFllcywgd2hlbiB1c2luZyB0aGUgRmFyZ2F0ZSBsYXVuY2ggdHlwZS5PcHRpb25hbCBmb3IgdGhlIEVDMiBsYXVuY2ggdHlwZSwgcmVxdWlyZWQgZm9yIHRoZSBGYXJnYXRlIGxhdW5jaCB0eXBlLiBVc2UgdGhlIGF3c2xvZ3Mtc3RyZWFtLXByZWZpeCBvcHRpb24gdG8gYXNzb2NpYXRlIGEgbG9nIHN0cmVhbSB3aXRoIHRoZSBzcGVjaWZpZWQgcHJlZml4LCB0aGUgY29udGFpbmVyIG5hbWUsIGFuZCB0aGUgSUQgb2YgdGhlIEFtYXpvbiBFQ1MgdGFzayB0aGF0IHRoZSBjb250YWluZXIgYmVsb25ncyB0by4gSWYgeW91IHNwZWNpZnkgYSBwcmVmaXggd2l0aCB0aGlzIG9wdGlvbiwgdGhlbiB0aGUgbG9nIHN0cmVhbSB0YWtlcyB0aGUgZm9ybWF0IHByZWZpeC1uYW1lL2NvbnRhaW5lci1uYW1lL2Vjcy10YXNrLWlkLiBJZiB5b3UgZG9uJ3Qgc3BlY2lmeSBhIHByZWZpeCB3aXRoIHRoaXMgb3B0aW9uLCB0aGVuIHRoZSBsb2cgc3RyZWFtIGlzIG5hbWVkIGFmdGVyIHRoZSBjb250YWluZXIgSUQgdGhhdCdzIGFzc2lnbmVkIGJ5IHRoZSBEb2NrZXIgZGFlbW9uIG9uIHRoZSBjb250YWluZXIgaW5zdGFuY2UuIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gdHJhY2UgbG9ncyBiYWNrIHRvIHRoZSBjb250YWluZXIgdGhhdCBzZW50IHRoZW0gd2l0aCBqdXN0IHRoZSBEb2NrZXIgY29udGFpbmVyIElEICh3aGljaCBpcyBvbmx5IGF2YWlsYWJsZSBvbiB0aGUgY29udGFpbmVyIGluc3RhbmNlKSwgd2UgcmVjb21tZW5kIHRoYXQgeW91IHNwZWNpZnkgYSBwcmVmaXggd2l0aCB0aGlzIG9wdGlvbi4gRm9yIEFtYXpvbiBFQ1Mgc2VydmljZXMsIHlvdSBjYW4gdXNlIHRoZSBzZXJ2aWNlIG5hbWUgYXMgdGhlIHByZWZpeC4gRG9pbmcgc28sIHlvdSBjYW4gdHJhY2UgbG9nIHN0cmVhbXMgdG8gdGhlIHNlcnZpY2UgdGhhdCB0aGUgY29udGFpbmVyIGJlbG9uZ3MgdG8sIHRoZSBuYW1lIG9mIHRoZSBjb250YWluZXIgdGhhdCBzZW50IHRoZW0sIGFuZCB0aGUgSUQgb2YgdGhlIHRhc2sgdGhhdCB0aGUgY29udGFpbmVyIGJlbG9uZ3MgdG8uIFlvdSBtdXN0IHNwZWNpZnkgYSBzdHJlYW0tcHJlZml4IGZvciB5b3VyIGxvZ3MgdG8gaGF2ZSB5b3VyIGxvZ3MgYXBwZWFyIGluIHRoZSBMb2cgcGFuZSB3aGVuIHVzaW5nIHRoZSBBbWF6b24gRUNTIGNvbnNvbGUuICsgYXdzbG9ncy1kYXRldGltZS1mb3JtYXQgUmVxdWlyZWQ6IE5vIFRoaXMgb3B0aW9uIGRlZmluZXMgYSBtdWx0aWxpbmUgc3RhcnQgcGF0dGVybiBpbiBQeXRob24gc3RyZnRpbWUgZm9ybWF0LiBBIGxvZyBtZXNzYWdlIGNvbnNpc3RzIG9mIGEgbGluZSB0aGF0IG1hdGNoZXMgdGhlIHBhdHRlcm4gYW5kIGFueSBmb2xsb3dpbmcgbGluZXMgdGhhdCBkb27igJl0IG1hdGNoIHRoZSBwYXR0ZXJuLiBUaGUgbWF0Y2hlZCBsaW5lIGlzIHRoZSBkZWxpbWl0ZXIgYmV0d2VlbiBsb2cgbWVzc2FnZXMuIE9uZSBleGFtcGxlIG9mIGEgdXNlIGNhc2UgZm9yIHVzaW5nIHRoaXMgZm9ybWF0IGlzIGZvciBwYXJzaW5nIG91dHB1dCBzdWNoIGFzIGEgc3RhY2sgZHVtcCwgd2hpY2ggbWlnaHQgb3RoZXJ3aXNlIGJlIGxvZ2dlZCBpbiBtdWx0aXBsZSBlbnRyaWVzLiBUaGUgY29ycmVjdCBwYXR0ZXJuIGFsbG93cyBpdCB0byBiZSBjYXB0dXJlZCBpbiBhIHNpbmdsZSBlbnRyeS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBhd3Nsb2dzLWRhdGV0aW1lLWZvcm1hdC4gWW91IGNhbm5vdCBjb25maWd1cmUgYm90aCB0aGUgYXdzbG9ncy1kYXRldGltZS1mb3JtYXQgYW5kIGF3c2xvZ3MtbXVsdGlsaW5lLXBhdHRlcm4gb3B0aW9ucy4gTXVsdGlsaW5lIGxvZ2dpbmcgcGVyZm9ybXMgcmVndWxhciBleHByZXNzaW9uIHBhcnNpbmcgYW5kIG1hdGNoaW5nIG9mIGFsbCBsb2cgbWVzc2FnZXMuIFRoaXMgbWlnaHQgaGF2ZSBhIG5lZ2F0aXZlIGltcGFjdCBvbiBsb2dnaW5nIHBlcmZvcm1hbmNlLiArIGF3c2xvZ3MtbXVsdGlsaW5lLXBhdHRlcm4gUmVxdWlyZWQ6IE5vIFRoaXMgb3B0aW9uIGRlZmluZXMgYSBtdWx0aWxpbmUgc3RhcnQgcGF0dGVybiB0aGF0IHVzZXMgYSByZWd1bGFyIGV4cHJlc3Npb24uIEEgbG9nIG1lc3NhZ2UgY29uc2lzdHMgb2YgYSBsaW5lIHRoYXQgbWF0Y2hlcyB0aGUgcGF0dGVybiBhbmQgYW55IGZvbGxvd2luZyBsaW5lcyB0aGF0IGRvbuKAmXQgbWF0Y2ggdGhlIHBhdHRlcm4uIFRoZSBtYXRjaGVkIGxpbmUgaXMgdGhlIGRlbGltaXRlciBiZXR3ZWVuIGxvZyBtZXNzYWdlcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBhd3Nsb2dzLW11bHRpbGluZS1wYXR0ZXJuLiBUaGlzIG9wdGlvbiBpcyBpZ25vcmVkIGlmIGF3c2xvZ3MtZGF0ZXRpbWUtZm9ybWF0IGlzIGFsc28gY29uZmlndXJlZC4gWW91IGNhbm5vdCBjb25maWd1cmUgYm90aCB0aGUgYXdzbG9ncy1kYXRldGltZS1mb3JtYXQgYW5kIGF3c2xvZ3MtbXVsdGlsaW5lLXBhdHRlcm4gb3B0aW9ucy4gTXVsdGlsaW5lIGxvZ2dpbmcgcGVyZm9ybXMgcmVndWxhciBleHByZXNzaW9uIHBhcnNpbmcgYW5kIG1hdGNoaW5nIG9mIGFsbCBsb2cgbWVzc2FnZXMuIFRoaXMgbWlnaHQgaGF2ZSBhIG5lZ2F0aXZlIGltcGFjdCBvbiBsb2dnaW5nIHBlcmZvcm1hbmNlLiArIG1vZGUgUmVxdWlyZWQ6IE5vIFZhbGlkIHZhbHVlczogbm9uLWJsb2NraW5nIHwgYmxvY2tpbmcgVGhpcyBvcHRpb24gZGVmaW5lcyB0aGUgZGVsaXZlcnkgbW9kZSBvZiBsb2cgbWVzc2FnZXMgZnJvbSB0aGUgY29udGFpbmVyIHRvIENsb3VkV2F0Y2ggTG9ncy4gVGhlIGRlbGl2ZXJ5IG1vZGUgeW91IGNob29zZSBhZmZlY3RzIGFwcGxpY2F0aW9uIGF2YWlsYWJpbGl0eSB3aGVuIHRoZSBmbG93IG9mIGxvZ3MgZnJvbSBjb250YWluZXIgdG8gQ2xvdWRXYXRjaCBpcyBpbnRlcnJ1cHRlZC4gSWYgeW91IHVzZSB0aGUgYmxvY2tpbmcgbW9kZSBhbmQgdGhlIGZsb3cgb2YgbG9ncyB0byBDbG91ZFdhdGNoIGlzIGludGVycnVwdGVkLCBjYWxscyBmcm9tIGNvbnRhaW5lciBjb2RlIHRvIHdyaXRlIHRvIHRoZSBzdGRvdXQgYW5kIHN0ZGVyciBzdHJlYW1zIHdpbGwgYmxvY2suIFRoZSBsb2dnaW5nIHRocmVhZCBvZiB0aGUgYXBwbGljYXRpb24gd2lsbCBibG9jayBhcyBhIHJlc3VsdC4gVGhpcyBtYXkgY2F1c2UgdGhlIGFwcGxpY2F0aW9uIHRvIGJlY29tZSB1bnJlc3BvbnNpdmUgYW5kIGxlYWQgdG8gY29udGFpbmVyIGhlYWx0aGNoZWNrIGZhaWx1cmUuIElmIHlvdSB1c2UgdGhlIG5vbi1ibG9ja2luZyBtb2RlLCB0aGUgY29udGFpbmVyJ3MgbG9ncyBhcmUgaW5zdGVhZCBzdG9yZWQgaW4gYW4gaW4tbWVtb3J5IGludGVybWVkaWF0ZSBidWZmZXIgY29uZmlndXJlZCB3aXRoIHRoZSBtYXgtYnVmZmVyLXNpemUgb3B0aW9uLiBUaGlzIHByZXZlbnRzIHRoZSBhcHBsaWNhdGlvbiBmcm9tIGJlY29taW5nIHVucmVzcG9uc2l2ZSB3aGVuIGxvZ3MgY2Fubm90IGJlIHNlbnQgdG8gQ2xvdWRXYXRjaC4gV2UgcmVjb21tZW5kIHVzaW5nIHRoaXMgbW9kZSBpZiB5b3Ugd2FudCB0byBlbnN1cmUgc2VydmljZSBhdmFpbGFiaWxpdHkgYW5kIGFyZSBva2F5IHdpdGggc29tZSBsb2cgbG9zcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBQcmV2ZW50aW5nIGxvZyBsb3NzIHdpdGggbm9uLWJsb2NraW5nIG1vZGUgaW4gdGhlIGF3c2xvZ3MgY29udGFpbmVyIGxvZyBkcml2ZXIuICsgbWF4LWJ1ZmZlci1zaXplIFJlcXVpcmVkOiBObyBEZWZhdWx0IHZhbHVlOiAxbSBXaGVuIG5vbi1ibG9ja2luZyBtb2RlIGlzIHVzZWQsIHRoZSBtYXgtYnVmZmVyLXNpemUgbG9nIG9wdGlvbiBjb250cm9scyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIHRoYXQncyB1c2VkIGZvciBpbnRlcm1lZGlhdGUgbWVzc2FnZSBzdG9yYWdlLiBNYWtlIHN1cmUgdG8gc3BlY2lmeSBhbiBhZGVxdWF0ZSBidWZmZXIgc2l6ZSBiYXNlZCBvbiB5b3VyIGFwcGxpY2F0aW9uLiBXaGVuIHRoZSBidWZmZXIgZmlsbHMgdXAsIGZ1cnRoZXIgbG9ncyBjYW5ub3QgYmUgc3RvcmVkLiBMb2dzIHRoYXQgY2Fubm90IGJlIHN0b3JlZCBhcmUgbG9zdC4gXG4gKiAgVG8gcm91dGUgbG9ncyB1c2luZyB0aGUgYGBzcGx1bmtgYCBsb2cgcm91dGVyLCB5b3UgbmVlZCB0byBzcGVjaWZ5IGEgYGBzcGx1bmstdG9rZW5gYCBhbmQgYSBgYHNwbHVuay11cmxgYC5cbiAqICBXaGVuIHlvdSB1c2UgdGhlIGBgYXdzZmlyZWxlbnNgYCBsb2cgcm91dGVyIHRvIHJvdXRlIGxvZ3MgdG8gYW4gQVdTIFNlcnZpY2Ugb3IgQVdTIFBhcnRuZXIgTmV0d29yayBkZXN0aW5hdGlvbiBmb3IgbG9nIHN0b3JhZ2UgYW5kIGFuYWx5dGljcywgeW91IGNhbiBzZXQgdGhlIGBgbG9nLWRyaXZlci1idWZmZXItbGltaXRgYCBvcHRpb24gdG8gbGltaXQgdGhlIG51bWJlciBvZiBldmVudHMgdGhhdCBhcmUgYnVmZmVyZWQgaW4gbWVtb3J5LCBiZWZvcmUgYmVpbmcgc2VudCB0byB0aGUgbG9nIHJvdXRlciBjb250YWluZXIuIEl0IGNhbiBoZWxwIHRvIHJlc29sdmUgcG90ZW50aWFsIGxvZyBsb3NzIGlzc3VlIGJlY2F1c2UgaGlnaCB0aHJvdWdocHV0IG1pZ2h0IHJlc3VsdCBpbiBtZW1vcnkgcnVubmluZyBvdXQgZm9yIHRoZSBidWZmZXIgaW5zaWRlIG9mIERvY2tlci5cbiAqICBPdGhlciBvcHRpb25zIHlvdSBjYW4gc3BlY2lmeSB3aGVuIHVzaW5nIGBgYXdzZmlyZWxlbnNgYCB0byByb3V0ZSBsb2dzIGRlcGVuZCBvbiB0aGUgZGVzdGluYXRpb24uIFdoZW4geW91IGV4cG9ydCBsb2dzIHRvIEFtYXpvbiBEYXRhIEZpcmVob3NlLCB5b3UgY2FuIHNwZWNpZnkgdGhlIEFXUyBSZWdpb24gd2l0aCBgYHJlZ2lvbmBgIGFuZCBhIG5hbWUgZm9yIHRoZSBsb2cgc3RyZWFtIHdpdGggYGBkZWxpdmVyeV9zdHJlYW1gYC5cbiAqICBXaGVuIHlvdSBleHBvcnQgbG9ncyB0byBBbWF6b24gS2luZXNpcyBEYXRhIFN0cmVhbXMsIHlvdSBjYW4gc3BlY2lmeSBhbiBBV1MgUmVnaW9uIHdpdGggYGByZWdpb25gYCBhbmQgYSBkYXRhIHN0cmVhbSBuYW1lIHdpdGggYGBzdHJlYW1gYC5cbiAqICAgV2hlbiB5b3UgZXhwb3J0IGxvZ3MgdG8gQW1hem9uIE9wZW5TZWFyY2ggU2VydmljZSwgeW91IGNhbiBzcGVjaWZ5IG9wdGlvbnMgbGlrZSBgYE5hbWVgYCwgYGBIb3N0YGAgKE9wZW5TZWFyY2ggU2VydmljZSBlbmRwb2ludCB3aXRob3V0IHByb3RvY29sKSwgYGBQb3J0YGAsIGBgSW5kZXhgYCwgYGBUeXBlYGAsIGBgQXdzX2F1dGhgYCwgYGBBd3NfcmVnaW9uYGAsIGBgU3VwcHJlc3NfVHlwZV9OYW1lYGAsIGFuZCBgYHRsc2BgLlxuICogIFdoZW4geW91IGV4cG9ydCBsb2dzIHRvIEFtYXpvbiBTMywgeW91IGNhbiBzcGVjaWZ5IHRoZSBidWNrZXQgdXNpbmcgdGhlIGBgYnVja2V0YGAgb3B0aW9uLiBZb3UgY2FuIGFsc28gc3BlY2lmeSBgYHJlZ2lvbmBgLCBgYHRvdGFsX2ZpbGVfc2l6ZWBgLCBgYHVwbG9hZF90aW1lb3V0YGAsIGFuZCBgYHVzZV9wdXRfb2JqZWN0YGAgYXMgb3B0aW9ucy5cbiAqICBUaGlzIHBhcmFtZXRlciByZXF1aXJlcyB2ZXJzaW9uIDEuMTkgb2YgdGhlIERvY2tlciBSZW1vdGUgQVBJIG9yIGdyZWF0ZXIgb24geW91ciBjb250YWluZXIgaW5zdGFuY2UuIFRvIGNoZWNrIHRoZSBEb2NrZXIgUmVtb3RlIEFQSSB2ZXJzaW9uIG9uIHlvdXIgY29udGFpbmVyIGluc3RhbmNlLCBsb2cgaW4gdG8geW91ciBjb250YWluZXIgaW5zdGFuY2UgYW5kIHJ1biB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6IGBgc3VkbyBkb2NrZXIgdmVyc2lvbiAtLWZvcm1hdCAne3suU2VydmVyLkFQSVZlcnNpb259fSdgYFxuICovXG5PcHRpb25zPzoge1xuLyoqXG4gKiBUaGlzIGludGVyZmFjZSB3YXMgcmVmZXJlbmNlZCBieSBgdW5kZWZpbmVkYCdzIEpTT04tU2NoZW1hIGRlZmluaXRpb25cbiAqIHZpYSB0aGUgYHBhdHRlcm5Qcm9wZXJ0eWAgXCIuezEsfVwiLlxuICovXG5bazogc3RyaW5nXTogc3RyaW5nXG59XG4vKipcbiAqIFRoZSBsb2cgZHJpdmVyIHRvIHVzZSBmb3IgdGhlIGNvbnRhaW5lci5cbiAqICBGb3IgdGFza3Mgb24gRkFSR0FURWxvbmcsIHRoZSBzdXBwb3J0ZWQgbG9nIGRyaXZlcnMgYXJlIGBgYXdzbG9nc2BgLCBgYHNwbHVua2BgLCBhbmQgYGBhd3NmaXJlbGVuc2BgLlxuICogIEZvciB0YXNrcyBob3N0ZWQgb24gQW1hem9uIEVDMiBpbnN0YW5jZXMsIHRoZSBzdXBwb3J0ZWQgbG9nIGRyaXZlcnMgYXJlIGBgYXdzbG9nc2BgLCBgYGZsdWVudGRgYCwgYGBnZWxmYGAsIGBganNvbi1maWxlYGAsIGBgam91cm5hbGRgYCwgYGBzeXNsb2dgYCwgYGBzcGx1bmtgYCwgYW5kIGBgYXdzZmlyZWxlbnNgYC5cbiAqICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB1c2luZyB0aGUgYGBhd3Nsb2dzYGAgbG9nIGRyaXZlciwgc2VlIFtTZW5kIEFtYXpvbiBFQ1MgbG9ncyB0byBDbG91ZFdhdGNoXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS91c2luZ19hd3Nsb2dzLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB1c2luZyB0aGUgYGBhd3NmaXJlbGVuc2BgIGxvZyBkcml2ZXIsIHNlZSBbU2VuZCBBbWF6b24gRUNTIGxvZ3MgdG8gYW4gc2VydmljZSBvciBQYXJ0bmVyXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS91c2luZ19maXJlbGVucy5odG1sKS5cbiAqICAgSWYgeW91IGhhdmUgYSBjdXN0b20gZHJpdmVyIHRoYXQgaXNuJ3QgbGlzdGVkLCB5b3UgY2FuIGZvcmsgdGhlIEFtYXpvbiBFQ1MgY29udGFpbmVyIGFnZW50IHByb2plY3QgdGhhdCdzIFthdmFpbGFibGUgb24gR2l0SHViXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hbWF6b24tZWNzLWFnZW50KSBhbmQgY3VzdG9taXplIGl0IHRvIHdvcmsgd2l0aCB0aGF0IGRyaXZlci4gV2UgZW5jb3VyYWdlIHlvdSB0byBzdWJtaXQgcHVsbCByZXF1ZXN0cyBmb3IgY2hhbmdlcyB0aGF0IHlvdSB3b3VsZCBsaWtlIHRvIGhhdmUgaW5jbHVkZWQuIEhvd2V2ZXIsIHdlIGRvbid0IGN1cnJlbnRseSBwcm92aWRlIHN1cHBvcnQgZm9yIHJ1bm5pbmcgbW9kaWZpZWQgY29waWVzIG9mIHRoaXMgc29mdHdhcmUuXG4gKi9cbkxvZ0RyaXZlcjogc3RyaW5nXG59XG4vKipcbiAqIFRoZSB0eXBlIGFuZCBhbW91bnQgb2YgYSByZXNvdXJjZSB0byBhc3NpZ24gdG8gYSBjb250YWluZXIuIFRoZSBzdXBwb3J0ZWQgcmVzb3VyY2UgdHlwZXMgYXJlIEdQVXMgYW5kIEVsYXN0aWMgSW5mZXJlbmNlIGFjY2VsZXJhdG9ycy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbV29ya2luZyB3aXRoIEdQVXMgb24gQW1hem9uIEVDU10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvZWNzLWdwdS5odG1sKSBvciBbV29ya2luZyB3aXRoIEFtYXpvbiBFbGFzdGljIEluZmVyZW5jZSBvbiBBbWF6b24gRUNTXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9lY3MtaW5mZXJlbmNlLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc291cmNlUmVxdWlyZW1lbnQge1xuLyoqXG4gKiBUaGUgdHlwZSBvZiByZXNvdXJjZSB0byBhc3NpZ24gdG8gYSBjb250YWluZXIuXG4gKi9cblR5cGU6IHN0cmluZ1xuLyoqXG4gKiBUaGUgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UgdHlwZS5cbiAqICBXaGVuIHRoZSB0eXBlIGlzIGBgR1BVYGAsIHRoZSB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIHBoeXNpY2FsIGBgR1BVc2BgIHRoZSBBbWF6b24gRUNTIGNvbnRhaW5lciBhZ2VudCByZXNlcnZlcyBmb3IgdGhlIGNvbnRhaW5lci4gVGhlIG51bWJlciBvZiBHUFVzIHRoYXQncyByZXNlcnZlZCBmb3IgYWxsIGNvbnRhaW5lcnMgaW4gYSB0YXNrIGNhbid0IGV4Y2VlZCB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBHUFVzIG9uIHRoZSBjb250YWluZXIgaW5zdGFuY2UgdGhhdCB0aGUgdGFzayBpcyBsYXVuY2hlZCBvbi5cbiAqICBXaGVuIHRoZSB0eXBlIGlzIGBgSW5mZXJlbmNlQWNjZWxlcmF0b3JgYCwgdGhlIGBgdmFsdWVgYCBtYXRjaGVzIHRoZSBgYGRldmljZU5hbWVgYCBmb3IgYW4gW0luZmVyZW5jZUFjY2VsZXJhdG9yXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0luZmVyZW5jZUFjY2VsZXJhdG9yLmh0bWwpIHNwZWNpZmllZCBpbiBhIHRhc2sgZGVmaW5pdGlvbi5cbiAqL1xuVmFsdWU6IHN0cmluZ1xufVxuLyoqXG4gKiBBIGxpc3Qgb2YgZmlsZXMgY29udGFpbmluZyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIHBhc3MgdG8gYSBjb250YWluZXIuIFlvdSBjYW4gc3BlY2lmeSB1cCB0byB0ZW4gZW52aXJvbm1lbnQgZmlsZXMuIFRoZSBmaWxlIG11c3QgaGF2ZSBhIGBgLmVudmBgIGZpbGUgZXh0ZW5zaW9uLiBFYWNoIGxpbmUgaW4gYW4gZW52aXJvbm1lbnQgZmlsZSBzaG91bGQgY29udGFpbiBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpbiBgYFZBUklBQkxFPVZBTFVFYGAgZm9ybWF0LiBMaW5lcyBiZWdpbm5pbmcgd2l0aCBgYCNgYCBhcmUgdHJlYXRlZCBhcyBjb21tZW50cyBhbmQgYXJlIGlnbm9yZWQuXG4gKiAgSWYgdGhlcmUgYXJlIGVudmlyb25tZW50IHZhcmlhYmxlcyBzcGVjaWZpZWQgdXNpbmcgdGhlIGBgZW52aXJvbm1lbnRgYCBwYXJhbWV0ZXIgaW4gYSBjb250YWluZXIgZGVmaW5pdGlvbiwgdGhleSB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aGUgdmFyaWFibGVzIGNvbnRhaW5lZCB3aXRoaW4gYW4gZW52aXJvbm1lbnQgZmlsZS4gSWYgbXVsdGlwbGUgZW52aXJvbm1lbnQgZmlsZXMgYXJlIHNwZWNpZmllZCB0aGF0IGNvbnRhaW4gdGhlIHNhbWUgdmFyaWFibGUsIHRoZXkncmUgcHJvY2Vzc2VkIGZyb20gdGhlIHRvcCBkb3duLiBXZSByZWNvbW1lbmQgdGhhdCB5b3UgdXNlIHVuaXF1ZSB2YXJpYWJsZSBuYW1lcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbVXNlIGEgZmlsZSB0byBwYXNzIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBhIGNvbnRhaW5lcl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvdXNlLWVudmlyb25tZW50LWZpbGUuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICogIEVudmlyb25tZW50IHZhcmlhYmxlIGZpbGVzIGFyZSBvYmplY3RzIGluIEFtYXpvbiBTMyBhbmQgYWxsIEFtYXpvbiBTMyBzZWN1cml0eSBjb25zaWRlcmF0aW9ucyBhcHBseS4gXG4gKiAgWW91IG11c3QgdXNlIHRoZSBmb2xsb3dpbmcgcGxhdGZvcm1zIGZvciB0aGUgRmFyZ2F0ZSBsYXVuY2ggdHlwZTpcbiAqICAgKyAgTGludXggcGxhdGZvcm0gdmVyc2lvbiBgYDEuNC4wYGAgb3IgbGF0ZXIuXG4gKiAgICsgIFdpbmRvd3MgcGxhdGZvcm0gdmVyc2lvbiBgYDEuMC4wYGAgb3IgbGF0ZXIuXG4gKiAgIFxuICogIENvbnNpZGVyIHRoZSBmb2xsb3dpbmcgd2hlbiB1c2luZyB0aGUgRmFyZ2F0ZSBsYXVuY2ggdHlwZTpcbiAqICAgKyAgVGhlIGZpbGUgaXMgaGFuZGxlZCBsaWtlIGEgbmF0aXZlIERvY2tlciBlbnYtZmlsZS5cbiAqICAgKyAgVGhlcmUgaXMgbm8gc3VwcG9ydCBmb3Igc2hlbGwgZXNjYXBlIGhhbmRsaW5nLlxuICogICArICBUaGUgY29udGFpbmVyIGVudHJ5IHBvaW50IGludGVycGVydHMgdGhlIGBgVkFSSUFCTEVgYCB2YWx1ZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW52aXJvbm1lbnRGaWxlIHtcbi8qKlxuICogVGhlIGZpbGUgdHlwZSB0byB1c2UuIEVudmlyb25tZW50IGZpbGVzIGFyZSBvYmplY3RzIGluIEFtYXpvbiBTMy4gVGhlIG9ubHkgc3VwcG9ydGVkIHZhbHVlIGlzIGBgczNgYC5cbiAqL1xuVHlwZT86IHN0cmluZ1xuLyoqXG4gKiBUaGUgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIEFtYXpvbiBTMyBvYmplY3QgY29udGFpbmluZyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgZmlsZS5cbiAqL1xuVmFsdWU/OiBzdHJpbmdcbn1cbi8qKlxuICogVGhlIEZpcmVMZW5zIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBjb250YWluZXIuIFRoaXMgaXMgdXNlZCB0byBzcGVjaWZ5IGFuZCBjb25maWd1cmUgYSBsb2cgcm91dGVyIGZvciBjb250YWluZXIgbG9ncy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQ3VzdG9tIExvZyBSb3V0aW5nXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS91c2luZ19maXJlbGVucy5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmlyZWxlbnNDb25maWd1cmF0aW9uIHtcbi8qKlxuICogVGhlIG9wdGlvbnMgdG8gdXNlIHdoZW4gY29uZmlndXJpbmcgdGhlIGxvZyByb3V0ZXIuIFRoaXMgZmllbGQgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSB1c2VkIHRvIGFkZCBhZGRpdGlvbmFsIG1ldGFkYXRhLCBzdWNoIGFzIHRoZSB0YXNrLCB0YXNrIGRlZmluaXRpb24sIGNsdXN0ZXIsIGFuZCBjb250YWluZXIgaW5zdGFuY2UgZGV0YWlscyB0byB0aGUgbG9nIGV2ZW50LlxuICogICBJZiBzcGVjaWZpZWQsIHZhbGlkIG9wdGlvbiBrZXlzIGFyZTpcbiAqICAgKyAgIGBgZW5hYmxlLWVjcy1sb2ctbWV0YWRhdGFgYCwgd2hpY2ggY2FuIGJlIGBgdHJ1ZWBgIG9yIGBgZmFsc2VgYCBcbiAqICAgKyAgIGBgY29uZmlnLWZpbGUtdHlwZWBgLCB3aGljaCBjYW4gYmUgYGBzM2BgIG9yIGBgZmlsZWBgIFxuICogICArICAgYGBjb25maWctZmlsZS12YWx1ZWBgLCB3aGljaCBpcyBlaXRoZXIgYW4gUzMgQVJOIG9yIGEgZmlsZSBwYXRoXG4gKi9cbk9wdGlvbnM/OiB7XG4vKipcbiAqIFRoaXMgaW50ZXJmYWNlIHdhcyByZWZlcmVuY2VkIGJ5IGB1bmRlZmluZWRgJ3MgSlNPTi1TY2hlbWEgZGVmaW5pdGlvblxuICogdmlhIHRoZSBgcGF0dGVyblByb3BlcnR5YCBcIi57MSx9XCIuXG4gKi9cbltrOiBzdHJpbmddOiBzdHJpbmdcbn1cbi8qKlxuICogVGhlIGxvZyByb3V0ZXIgdG8gdXNlLiBUaGUgdmFsaWQgdmFsdWVzIGFyZSBgYGZsdWVudGRgYCBvciBgYGZsdWVudGJpdGBgLlxuICovXG5UeXBlPzogc3RyaW5nXG59XG4vKipcbiAqIEEgbGlzdCBvZiBuYW1lc3BhY2VkIGtlcm5lbCBwYXJhbWV0ZXJzIHRvIHNldCBpbiB0aGUgY29udGFpbmVyLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgU3lzY3Rsc2BgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kIGFuZCB0aGUgYGAtLXN5c2N0bGBgIG9wdGlvbiB0byBkb2NrZXIgcnVuLiBGb3IgZXhhbXBsZSwgeW91IGNhbiBjb25maWd1cmUgYGBuZXQuaXB2NC50Y3Bfa2VlcGFsaXZlX3RpbWVgYCBzZXR0aW5nIHRvIG1haW50YWluIGxvbmdlciBsaXZlZCBjb25uZWN0aW9ucy5cbiAqICBXZSBkb24ndCByZWNvbW1lbmQgdGhhdCB5b3Ugc3BlY2lmeSBuZXR3b3JrLXJlbGF0ZWQgYGBzeXN0ZW1Db250cm9sc2BgIHBhcmFtZXRlcnMgZm9yIG11bHRpcGxlIGNvbnRhaW5lcnMgaW4gYSBzaW5nbGUgdGFzayB0aGF0IGFsc28gdXNlcyBlaXRoZXIgdGhlIGBgYXdzdnBjYGAgb3IgYGBob3N0YGAgbmV0d29yayBtb2RlLiBEb2luZyB0aGlzIGhhcyB0aGUgZm9sbG93aW5nIGRpc2FkdmFudGFnZXM6XG4gKiAgICsgIEZvciB0YXNrcyB0aGF0IHVzZSB0aGUgYGBhd3N2cGNgYCBuZXR3b3JrIG1vZGUgaW5jbHVkaW5nIEZhcmdhdGUsIGlmIHlvdSBzZXQgYGBzeXN0ZW1Db250cm9sc2BgIGZvciBhbnkgY29udGFpbmVyLCBpdCBhcHBsaWVzIHRvIGFsbCBjb250YWluZXJzIGluIHRoZSB0YXNrLiBJZiB5b3Ugc2V0IGRpZmZlcmVudCBgYHN5c3RlbUNvbnRyb2xzYGAgZm9yIG11bHRpcGxlIGNvbnRhaW5lcnMgaW4gYSBzaW5nbGUgdGFzaywgdGhlIGNvbnRhaW5lciB0aGF0J3Mgc3RhcnRlZCBsYXN0IGRldGVybWluZXMgd2hpY2ggYGBzeXN0ZW1Db250cm9sc2BgIHRha2UgZWZmZWN0LlxuICogICArICBGb3IgdGFza3MgdGhhdCB1c2UgdGhlIGBgaG9zdGBgIG5ldHdvcmsgbW9kZSwgdGhlIG5ldHdvcmsgbmFtZXNwYWNlIGBgc3lzdGVtQ29udHJvbHNgYCBhcmVuJ3Qgc3VwcG9ydGVkLlxuICogICBcbiAqICBJZiB5b3UncmUgc2V0dGluZyBhbiBJUEMgcmVzb3VyY2UgbmFtZXNwYWNlIHRvIHVzZSBmb3IgdGhlIGNvbnRhaW5lcnMgaW4gdGhlIHRhc2ssIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcHBseSB0byB5b3VyIHN5c3RlbSBjb250cm9scy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbSVBDIG1vZGVdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3Rhc2tfZGVmaW5pdGlvbl9wYXJhbWV0ZXJzLmh0bWwjdGFza19kZWZpbml0aW9uX2lwY21vZGUpLlxuICogICArICBGb3IgdGFza3MgdGhhdCB1c2UgdGhlIGBgaG9zdGBgIElQQyBtb2RlLCBJUEMgbmFtZXNwYWNlIGBgc3lzdGVtQ29udHJvbHNgYCBhcmVuJ3Qgc3VwcG9ydGVkLlxuICogICArICBGb3IgdGFza3MgdGhhdCB1c2UgdGhlIGBgdGFza2BgIElQQyBtb2RlLCBJUEMgbmFtZXNwYWNlIGBgc3lzdGVtQ29udHJvbHNgYCB2YWx1ZXMgYXBwbHkgdG8gYWxsIGNvbnRhaW5lcnMgd2l0aGluIGEgdGFzay5cbiAqICAgXG4gKiAgIFRoaXMgcGFyYW1ldGVyIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIFdpbmRvd3MgY29udGFpbmVycy5cbiAqICAgIFRoaXMgcGFyYW1ldGVyIGlzIG9ubHkgc3VwcG9ydGVkIGZvciB0YXNrcyB0aGF0IGFyZSBob3N0ZWQgb24gRkFSR0FURWxvbmcgaWYgdGhlIHRhc2tzIGFyZSB1c2luZyBwbGF0Zm9ybSB2ZXJzaW9uIGBgMS40LjBgYCBvciBsYXRlciAoTGludXgpLiBUaGlzIGlzbid0IHN1cHBvcnRlZCBmb3IgV2luZG93cyBjb250YWluZXJzIG9uIEZhcmdhdGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3lzdGVtQ29udHJvbCB7XG4vKipcbiAqIFRoZSBuYW1lc3BhY2VkIGtlcm5lbCBwYXJhbWV0ZXIgdG8gc2V0IGEgYGB2YWx1ZWBgIGZvci5cbiAqICBWYWxpZCBJUEMgbmFtZXNwYWNlIHZhbHVlczogYGBcImtlcm5lbC5tc2dtYXhcIiB8IFwia2VybmVsLm1zZ21uYlwiIHwgXCJrZXJuZWwubXNnbW5pXCIgfCBcImtlcm5lbC5zZW1cIiB8IFwia2VybmVsLnNobWFsbFwiIHwgXCJrZXJuZWwuc2htbWF4XCIgfCBcImtlcm5lbC5zaG1tbmlcIiB8IFwia2VybmVsLnNobV9ybWlkX2ZvcmNlZFwiYGAsIGFuZCBgYFN5c2N0bHNgYCB0aGF0IHN0YXJ0IHdpdGggYGBcImZzLm1xdWV1ZS4qXCJgYCBcbiAqICBWYWxpZCBuZXR3b3JrIG5hbWVzcGFjZSB2YWx1ZXM6IGBgU3lzY3Rsc2BgIHRoYXQgc3RhcnQgd2l0aCBgYFwibmV0LipcImBgIFxuICogIEFsbCBvZiB0aGVzZSB2YWx1ZXMgYXJlIHN1cHBvcnRlZCBieSBGYXJnYXRlLlxuICovXG5WYWx1ZT86IHN0cmluZ1xuLyoqXG4gKiBUaGUgbmFtZXNwYWNlZCBrZXJuZWwgcGFyYW1ldGVyIHRvIHNldCBhIGBgdmFsdWVgYCBmb3IuXG4gKi9cbk5hbWVzcGFjZT86IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgYGB1bGltaXRgYCBzZXR0aW5ncyB0byBwYXNzIHRvIHRoZSBjb250YWluZXIuXG4gKiAgQW1hem9uIEVDUyB0YXNrcyBob3N0ZWQgb24gRkFSR0FURWxvbmcgdXNlIHRoZSBkZWZhdWx0IHJlc291cmNlIGxpbWl0IHZhbHVlcyBzZXQgYnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0gd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSBgYG5vZmlsZWBgIHJlc291cmNlIGxpbWl0IHBhcmFtZXRlciB3aGljaCBGQVJHQVRFbG9uZyBvdmVycmlkZXMuIFRoZSBgYG5vZmlsZWBgIHJlc291cmNlIGxpbWl0IHNldHMgYSByZXN0cmljdGlvbiBvbiB0aGUgbnVtYmVyIG9mIG9wZW4gZmlsZXMgdGhhdCBhIGNvbnRhaW5lciBjYW4gdXNlLiBUaGUgZGVmYXVsdCBgYG5vZmlsZWBgIHNvZnQgbGltaXQgaXMgYGA2NTUzNWBgIGFuZCB0aGUgZGVmYXVsdCBoYXJkIGxpbWl0IGlzIGBgNjU1MzVgYC5cbiAqICBZb3UgY2FuIHNwZWNpZnkgdGhlIGBgdWxpbWl0YGAgc2V0dGluZ3MgZm9yIGEgY29udGFpbmVyIGluIGEgdGFzayBkZWZpbml0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVsaW1pdCB7XG4vKipcbiAqIFRoZSBzb2Z0IGxpbWl0IGZvciB0aGUgYGB1bGltaXRgYCB0eXBlLiBUaGUgdmFsdWUgY2FuIGJlIHNwZWNpZmllZCBpbiBieXRlcywgc2Vjb25kcywgb3IgYXMgYSBjb3VudCwgZGVwZW5kaW5nIG9uIHRoZSBgYHR5cGVgYCBvZiB0aGUgYGB1bGltaXRgYC5cbiAqL1xuU29mdExpbWl0OiBudW1iZXJcbi8qKlxuICogVGhlIGhhcmQgbGltaXQgZm9yIHRoZSBgYHVsaW1pdGBgIHR5cGUuIFRoZSB2YWx1ZSBjYW4gYmUgc3BlY2lmaWVkIGluIGJ5dGVzLCBzZWNvbmRzLCBvciBhcyBhIGNvdW50LCBkZXBlbmRpbmcgb24gdGhlIGBgdHlwZWBgIG9mIHRoZSBgYHVsaW1pdGBgLlxuICovXG5IYXJkTGltaXQ6IG51bWJlclxuLyoqXG4gKiBUaGUgYGB0eXBlYGAgb2YgdGhlIGBgdWxpbWl0YGAuXG4gKi9cbk5hbWU6IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgcHJpdmF0ZSByZXBvc2l0b3J5IGF1dGhlbnRpY2F0aW9uIGNyZWRlbnRpYWxzIHRvIHVzZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXBvc2l0b3J5Q3JlZGVudGlhbHMge1xuLyoqXG4gKiBUaGUgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIHNlY3JldCBjb250YWluaW5nIHRoZSBwcml2YXRlIHJlcG9zaXRvcnkgY3JlZGVudGlhbHMuXG4gKiAgIFdoZW4geW91IHVzZSB0aGUgQW1hem9uIEVDUyBBUEksIENMSSwgb3IgQVdTIFNESywgaWYgdGhlIHNlY3JldCBleGlzdHMgaW4gdGhlIHNhbWUgUmVnaW9uIGFzIHRoZSB0YXNrIHRoYXQgeW91J3JlIGxhdW5jaGluZyB0aGVuIHlvdSBjYW4gdXNlIGVpdGhlciB0aGUgZnVsbCBBUk4gb3IgdGhlIG5hbWUgb2YgdGhlIHNlY3JldC4gV2hlbiB5b3UgdXNlIHRoZSBBV1MgTWFuYWdlbWVudCBDb25zb2xlLCB5b3UgbXVzdCBzcGVjaWZ5IHRoZSBmdWxsIEFSTiBvZiB0aGUgc2VjcmV0LlxuICovXG5DcmVkZW50aWFsc1BhcmFtZXRlcj86IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgYGBIb3N0RW50cnlgYCBwcm9wZXJ0eSBzcGVjaWZpZXMgYSBob3N0bmFtZSBhbmQgYW4gSVAgYWRkcmVzcyB0aGF0IGFyZSBhZGRlZCB0byB0aGUgYGAvZXRjL2hvc3RzYGAgZmlsZSBvZiBhIGNvbnRhaW5lciB0aHJvdWdoIHRoZSBgYGV4dHJhSG9zdHNgYCBwYXJhbWV0ZXIgb2YgaXRzIGBgQ29udGFpbmVyRGVmaW5pdGlvbmBgIHJlc291cmNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhvc3RFbnRyeSB7XG4vKipcbiAqIFRoZSBob3N0bmFtZSB0byB1c2UgaW4gdGhlIGBgL2V0Yy9ob3N0c2BgIGVudHJ5LlxuICovXG5Ib3N0bmFtZT86IHN0cmluZ1xuLyoqXG4gKiBUaGUgSVAgYWRkcmVzcyB0byB1c2UgaW4gdGhlIGBgL2V0Yy9ob3N0c2BgIGVudHJ5LlxuICovXG5JcEFkZHJlc3M/OiBzdHJpbmdcbn1cbi8qKlxuICogTGludXgtc3BlY2lmaWMgbW9kaWZpY2F0aW9ucyB0aGF0IGFyZSBhcHBsaWVkIHRvIHRoZSBjb250YWluZXIsIHN1Y2ggYXMgTGludXgga2VybmVsIGNhcGFiaWxpdGllcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIFtLZXJuZWxDYXBhYmlsaXRpZXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfS2VybmVsQ2FwYWJpbGl0aWVzLmh0bWwpLlxuICogICBUaGlzIHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkIGZvciBXaW5kb3dzIGNvbnRhaW5lcnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGludXhQYXJhbWV0ZXJzIHtcbkNhcGFiaWxpdGllcz86IEtlcm5lbENhcGFiaWxpdGllc1xuLyoqXG4gKiBUaGlzIGFsbG93cyB5b3UgdG8gdHVuZSBhIGNvbnRhaW5lcidzIG1lbW9yeSBzd2FwcGluZXNzIGJlaGF2aW9yLiBBIGBgc3dhcHBpbmVzc2BgIHZhbHVlIG9mIGBgMGBgIHdpbGwgY2F1c2Ugc3dhcHBpbmcgdG8gbm90IGhhcHBlbiB1bmxlc3MgYWJzb2x1dGVseSBuZWNlc3NhcnkuIEEgYGBzd2FwcGluZXNzYGAgdmFsdWUgb2YgYGAxMDBgYCB3aWxsIGNhdXNlIHBhZ2VzIHRvIGJlIHN3YXBwZWQgdmVyeSBhZ2dyZXNzaXZlbHkuIEFjY2VwdGVkIHZhbHVlcyBhcmUgd2hvbGUgbnVtYmVycyBiZXR3ZWVuIGBgMGBgIGFuZCBgYDEwMGBgLiBJZiB0aGUgYGBzd2FwcGluZXNzYGAgcGFyYW1ldGVyIGlzIG5vdCBzcGVjaWZpZWQsIGEgZGVmYXVsdCB2YWx1ZSBvZiBgYDYwYGAgaXMgdXNlZC4gSWYgYSB2YWx1ZSBpcyBub3Qgc3BlY2lmaWVkIGZvciBgYG1heFN3YXBgYCB0aGVuIHRoaXMgcGFyYW1ldGVyIGlzIGlnbm9yZWQuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gdGhlIGBgLS1tZW1vcnktc3dhcHBpbmVzc2BgIG9wdGlvbiB0byBkb2NrZXIgcnVuLlxuICogICBJZiB5b3UncmUgdXNpbmcgdGFza3MgdGhhdCB1c2UgdGhlIEZhcmdhdGUgbGF1bmNoIHR5cGUsIHRoZSBgYHN3YXBwaW5lc3NgYCBwYXJhbWV0ZXIgaXNuJ3Qgc3VwcG9ydGVkLlxuICogIElmIHlvdSdyZSB1c2luZyB0YXNrcyBvbiBBbWF6b24gTGludXggMjAyMyB0aGUgYGBzd2FwcGluZXNzYGAgcGFyYW1ldGVyIGlzbid0IHN1cHBvcnRlZC5cbiAqL1xuU3dhcHBpbmVzcz86IG51bWJlclxuLyoqXG4gKiBUaGUgY29udGFpbmVyIHBhdGgsIG1vdW50IG9wdGlvbnMsIGFuZCBzaXplIChpbiBNaUIpIG9mIHRoZSB0bXBmcyBtb3VudC4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byB0aGUgYGAtLXRtcGZzYGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKiAgIElmIHlvdSdyZSB1c2luZyB0YXNrcyB0aGF0IHVzZSB0aGUgRmFyZ2F0ZSBsYXVuY2ggdHlwZSwgdGhlIGBgdG1wZnNgYCBwYXJhbWV0ZXIgaXNuJ3Qgc3VwcG9ydGVkLlxuICovXG5UbXBmcz86IFRtcGZzW11cbi8qKlxuICogVGhlIHZhbHVlIGZvciB0aGUgc2l6ZSAoaW4gTWlCKSBvZiB0aGUgYGAvZGV2L3NobWBgIHZvbHVtZS4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byB0aGUgYGAtLXNobS1zaXplYGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKiAgIElmIHlvdSBhcmUgdXNpbmcgdGFza3MgdGhhdCB1c2UgdGhlIEZhcmdhdGUgbGF1bmNoIHR5cGUsIHRoZSBgYHNoYXJlZE1lbW9yeVNpemVgYCBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZC5cbiAqL1xuU2hhcmVkTWVtb3J5U2l6ZT86IG51bWJlclxuLyoqXG4gKiBBbnkgaG9zdCBkZXZpY2VzIHRvIGV4cG9zZSB0byB0aGUgY29udGFpbmVyLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgRGV2aWNlc2BgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kIGFuZCB0aGUgYGAtLWRldmljZWBgIG9wdGlvbiB0byBkb2NrZXIgcnVuLlxuICogICBJZiB5b3UncmUgdXNpbmcgdGFza3MgdGhhdCB1c2UgdGhlIEZhcmdhdGUgbGF1bmNoIHR5cGUsIHRoZSBgYGRldmljZXNgYCBwYXJhbWV0ZXIgaXNuJ3Qgc3VwcG9ydGVkLlxuICovXG5EZXZpY2VzPzogRGV2aWNlW11cbi8qKlxuICogUnVuIGFuIGBgaW5pdGBgIHByb2Nlc3MgaW5zaWRlIHRoZSBjb250YWluZXIgdGhhdCBmb3J3YXJkcyBzaWduYWxzIGFuZCByZWFwcyBwcm9jZXNzZXMuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gdGhlIGBgLS1pbml0YGAgb3B0aW9uIHRvIGRvY2tlciBydW4uIFRoaXMgcGFyYW1ldGVyIHJlcXVpcmVzIHZlcnNpb24gMS4yNSBvZiB0aGUgRG9ja2VyIFJlbW90ZSBBUEkgb3IgZ3JlYXRlciBvbiB5b3VyIGNvbnRhaW5lciBpbnN0YW5jZS4gVG8gY2hlY2sgdGhlIERvY2tlciBSZW1vdGUgQVBJIHZlcnNpb24gb24geW91ciBjb250YWluZXIgaW5zdGFuY2UsIGxvZyBpbiB0byB5b3VyIGNvbnRhaW5lciBpbnN0YW5jZSBhbmQgcnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZDogYGBzdWRvIGRvY2tlciB2ZXJzaW9uIC0tZm9ybWF0ICd7ey5TZXJ2ZXIuQVBJVmVyc2lvbn19J2BgXG4gKi9cbkluaXRQcm9jZXNzRW5hYmxlZD86IGJvb2xlYW5cbi8qKlxuICogVGhlIHRvdGFsIGFtb3VudCBvZiBzd2FwIG1lbW9yeSAoaW4gTWlCKSBhIGNvbnRhaW5lciBjYW4gdXNlLiBUaGlzIHBhcmFtZXRlciB3aWxsIGJlIHRyYW5zbGF0ZWQgdG8gdGhlIGBgLS1tZW1vcnktc3dhcGBgIG9wdGlvbiB0byBkb2NrZXIgcnVuIHdoZXJlIHRoZSB2YWx1ZSB3b3VsZCBiZSB0aGUgc3VtIG9mIHRoZSBjb250YWluZXIgbWVtb3J5IHBsdXMgdGhlIGBgbWF4U3dhcGBgIHZhbHVlLlxuICogIElmIGEgYGBtYXhTd2FwYGAgdmFsdWUgb2YgYGAwYGAgaXMgc3BlY2lmaWVkLCB0aGUgY29udGFpbmVyIHdpbGwgbm90IHVzZSBzd2FwLiBBY2NlcHRlZCB2YWx1ZXMgYXJlIGBgMGBgIG9yIGFueSBwb3NpdGl2ZSBpbnRlZ2VyLiBJZiB0aGUgYGBtYXhTd2FwYGAgcGFyYW1ldGVyIGlzIG9taXR0ZWQsIHRoZSBjb250YWluZXIgd2lsbCB1c2UgdGhlIHN3YXAgY29uZmlndXJhdGlvbiBmb3IgdGhlIGNvbnRhaW5lciBpbnN0YW5jZSBpdCBpcyBydW5uaW5nIG9uLiBBIGBgbWF4U3dhcGBgIHZhbHVlIG11c3QgYmUgc2V0IGZvciB0aGUgYGBzd2FwcGluZXNzYGAgcGFyYW1ldGVyIHRvIGJlIHVzZWQuXG4gKiAgIElmIHlvdSdyZSB1c2luZyB0YXNrcyB0aGF0IHVzZSB0aGUgRmFyZ2F0ZSBsYXVuY2ggdHlwZSwgdGhlIGBgbWF4U3dhcGBgIHBhcmFtZXRlciBpc24ndCBzdXBwb3J0ZWQuXG4gKiAgSWYgeW91J3JlIHVzaW5nIHRhc2tzIG9uIEFtYXpvbiBMaW51eCAyMDIzIHRoZSBgYHN3YXBwaW5lc3NgYCBwYXJhbWV0ZXIgaXNuJ3Qgc3VwcG9ydGVkLlxuICovXG5NYXhTd2FwPzogbnVtYmVyXG59XG4vKipcbiAqIFRoZSBMaW51eCBjYXBhYmlsaXRpZXMgZm9yIHRoZSBjb250YWluZXIgdGhhdCBhcmUgYWRkZWQgdG8gb3IgZHJvcHBlZCBmcm9tIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gcHJvdmlkZWQgYnkgRG9ja2VyLlxuICogICBGb3IgdGFza3MgdGhhdCB1c2UgdGhlIEZhcmdhdGUgbGF1bmNoIHR5cGUsIGBgY2FwYWJpbGl0aWVzYGAgaXMgc3VwcG9ydGVkIGZvciBhbGwgcGxhdGZvcm0gdmVyc2lvbnMgYnV0IHRoZSBgYGFkZGBgIHBhcmFtZXRlciBpcyBvbmx5IHN1cHBvcnRlZCBpZiB1c2luZyBwbGF0Zm9ybSB2ZXJzaW9uIDEuNC4wIG9yIGxhdGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEtlcm5lbENhcGFiaWxpdGllcyB7XG4vKipcbiAqIFRoZSBMaW51eCBjYXBhYmlsaXRpZXMgZm9yIHRoZSBjb250YWluZXIgdGhhdCBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBwcm92aWRlZCBieSBEb2NrZXIuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBDYXBBZGRgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS1jYXAtYWRkYGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKiAgIFRhc2tzIGxhdW5jaGVkIG9uIEZBUkdBVEVsb25nIG9ubHkgc3VwcG9ydCBhZGRpbmcgdGhlIGBgU1lTX1BUUkFDRWBgIGtlcm5lbCBjYXBhYmlsaXR5LlxuICogICBWYWxpZCB2YWx1ZXM6IGBgXCJBTExcIiB8IFwiQVVESVRfQ09OVFJPTFwiIHwgXCJBVURJVF9XUklURVwiIHwgXCJCTE9DS19TVVNQRU5EXCIgfCBcIkNIT1dOXCIgfCBcIkRBQ19PVkVSUklERVwiIHwgXCJEQUNfUkVBRF9TRUFSQ0hcIiB8IFwiRk9XTkVSXCIgfCBcIkZTRVRJRFwiIHwgXCJJUENfTE9DS1wiIHwgXCJJUENfT1dORVJcIiB8IFwiS0lMTFwiIHwgXCJMRUFTRVwiIHwgXCJMSU5VWF9JTU1VVEFCTEVcIiB8IFwiTUFDX0FETUlOXCIgfCBcIk1BQ19PVkVSUklERVwiIHwgXCJNS05PRFwiIHwgXCJORVRfQURNSU5cIiB8IFwiTkVUX0JJTkRfU0VSVklDRVwiIHwgXCJORVRfQlJPQURDQVNUXCIgfCBcIk5FVF9SQVdcIiB8IFwiU0VURkNBUFwiIHwgXCJTRVRHSURcIiB8IFwiU0VUUENBUFwiIHwgXCJTRVRVSURcIiB8IFwiU1lTX0FETUlOXCIgfCBcIlNZU19CT09UXCIgfCBcIlNZU19DSFJPT1RcIiB8IFwiU1lTX01PRFVMRVwiIHwgXCJTWVNfTklDRVwiIHwgXCJTWVNfUEFDQ1RcIiB8IFwiU1lTX1BUUkFDRVwiIHwgXCJTWVNfUkFXSU9cIiB8IFwiU1lTX1JFU09VUkNFXCIgfCBcIlNZU19USU1FXCIgfCBcIlNZU19UVFlfQ09ORklHXCIgfCBcIlNZU0xPR1wiIHwgXCJXQUtFX0FMQVJNXCJgYFxuICovXG5BZGQ/OiBzdHJpbmdbXVxuLyoqXG4gKiBUaGUgTGludXggY2FwYWJpbGl0aWVzIGZvciB0aGUgY29udGFpbmVyIHRoYXQgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIHByb3ZpZGVkIGJ5IERvY2tlci4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYENhcERyb3BgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS1jYXAtZHJvcGBgIG9wdGlvbiB0byBkb2NrZXIgcnVuLlxuICogIFZhbGlkIHZhbHVlczogYGBcIkFMTFwiIHwgXCJBVURJVF9DT05UUk9MXCIgfCBcIkFVRElUX1dSSVRFXCIgfCBcIkJMT0NLX1NVU1BFTkRcIiB8IFwiQ0hPV05cIiB8IFwiREFDX09WRVJSSURFXCIgfCBcIkRBQ19SRUFEX1NFQVJDSFwiIHwgXCJGT1dORVJcIiB8IFwiRlNFVElEXCIgfCBcIklQQ19MT0NLXCIgfCBcIklQQ19PV05FUlwiIHwgXCJLSUxMXCIgfCBcIkxFQVNFXCIgfCBcIkxJTlVYX0lNTVVUQUJMRVwiIHwgXCJNQUNfQURNSU5cIiB8IFwiTUFDX09WRVJSSURFXCIgfCBcIk1LTk9EXCIgfCBcIk5FVF9BRE1JTlwiIHwgXCJORVRfQklORF9TRVJWSUNFXCIgfCBcIk5FVF9CUk9BRENBU1RcIiB8IFwiTkVUX1JBV1wiIHwgXCJTRVRGQ0FQXCIgfCBcIlNFVEdJRFwiIHwgXCJTRVRQQ0FQXCIgfCBcIlNFVFVJRFwiIHwgXCJTWVNfQURNSU5cIiB8IFwiU1lTX0JPT1RcIiB8IFwiU1lTX0NIUk9PVFwiIHwgXCJTWVNfTU9EVUxFXCIgfCBcIlNZU19OSUNFXCIgfCBcIlNZU19QQUNDVFwiIHwgXCJTWVNfUFRSQUNFXCIgfCBcIlNZU19SQVdJT1wiIHwgXCJTWVNfUkVTT1VSQ0VcIiB8IFwiU1lTX1RJTUVcIiB8IFwiU1lTX1RUWV9DT05GSUdcIiB8IFwiU1lTTE9HXCIgfCBcIldBS0VfQUxBUk1cImBgXG4gKi9cbkRyb3A/OiBzdHJpbmdbXVxufVxuLyoqXG4gKiBUaGUgY29udGFpbmVyIHBhdGgsIG1vdW50IG9wdGlvbnMsIGFuZCBzaXplIG9mIHRoZSB0bXBmcyBtb3VudC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUbXBmcyB7XG4vKipcbiAqIFRoZSBtYXhpbXVtIHNpemUgKGluIE1pQikgb2YgdGhlIHRtcGZzIHZvbHVtZS5cbiAqL1xuU2l6ZTogbnVtYmVyXG4vKipcbiAqIFRoZSBhYnNvbHV0ZSBmaWxlIHBhdGggd2hlcmUgdGhlIHRtcGZzIHZvbHVtZSBpcyB0byBiZSBtb3VudGVkLlxuICovXG5Db250YWluZXJQYXRoPzogc3RyaW5nXG4vKipcbiAqIFRoZSBsaXN0IG9mIHRtcGZzIHZvbHVtZSBtb3VudCBvcHRpb25zLlxuICogIFZhbGlkIHZhbHVlczogYGBcImRlZmF1bHRzXCIgfCBcInJvXCIgfCBcInJ3XCIgfCBcInN1aWRcIiB8IFwibm9zdWlkXCIgfCBcImRldlwiIHwgXCJub2RldlwiIHwgXCJleGVjXCIgfCBcIm5vZXhlY1wiIHwgXCJzeW5jXCIgfCBcImFzeW5jXCIgfCBcImRpcnN5bmNcIiB8IFwicmVtb3VudFwiIHwgXCJtYW5kXCIgfCBcIm5vbWFuZFwiIHwgXCJhdGltZVwiIHwgXCJub2F0aW1lXCIgfCBcImRpcmF0aW1lXCIgfCBcIm5vZGlyYXRpbWVcIiB8IFwiYmluZFwiIHwgXCJyYmluZFwiIHwgXCJ1bmJpbmRhYmxlXCIgfCBcInJ1bmJpbmRhYmxlXCIgfCBcInByaXZhdGVcIiB8IFwicnByaXZhdGVcIiB8IFwic2hhcmVkXCIgfCBcInJzaGFyZWRcIiB8IFwic2xhdmVcIiB8IFwicnNsYXZlXCIgfCBcInJlbGF0aW1lXCIgfCBcIm5vcmVsYXRpbWVcIiB8IFwic3RyaWN0YXRpbWVcIiB8IFwibm9zdHJpY3RhdGltZVwiIHwgXCJtb2RlXCIgfCBcInVpZFwiIHwgXCJnaWRcIiB8IFwibnJfaW5vZGVzXCIgfCBcIm5yX2Jsb2Nrc1wiIHwgXCJtcG9sXCJgYFxuICovXG5Nb3VudE9wdGlvbnM/OiBzdHJpbmdbXVxufVxuLyoqXG4gKiBUaGUgYGBEZXZpY2VgYCBwcm9wZXJ0eSBzcGVjaWZpZXMgYW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIGNvbnRhaW5lciBpbnN0YW5jZSBob3N0IGRldmljZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXZpY2Uge1xuLyoqXG4gKiBUaGUgcGF0aCBmb3IgdGhlIGRldmljZSBvbiB0aGUgaG9zdCBjb250YWluZXIgaW5zdGFuY2UuXG4gKi9cbkhvc3RQYXRoPzogc3RyaW5nXG4vKipcbiAqIFRoZSBleHBsaWNpdCBwZXJtaXNzaW9ucyB0byBwcm92aWRlIHRvIHRoZSBjb250YWluZXIgZm9yIHRoZSBkZXZpY2UuIEJ5IGRlZmF1bHQsIHRoZSBjb250YWluZXIgaGFzIHBlcm1pc3Npb25zIGZvciBgYHJlYWRgYCwgYGB3cml0ZWBgLCBhbmQgYGBta25vZGBgIGZvciB0aGUgZGV2aWNlLlxuICovXG5QZXJtaXNzaW9ucz86IHN0cmluZ1tdXG4vKipcbiAqIFRoZSBwYXRoIGluc2lkZSB0aGUgY29udGFpbmVyIGF0IHdoaWNoIHRvIGV4cG9zZSB0aGUgaG9zdCBkZXZpY2UuXG4gKi9cbkNvbnRhaW5lclBhdGg/OiBzdHJpbmdcbn1cbi8qKlxuICogVGhlIHJlc3RhcnQgcG9saWN5IGZvciBhIGNvbnRhaW5lci4gV2hlbiB5b3Ugc2V0IHVwIGEgcmVzdGFydCBwb2xpY3ksIEFtYXpvbiBFQ1MgY2FuIHJlc3RhcnQgdGhlIGNvbnRhaW5lciB3aXRob3V0IG5lZWRpbmcgdG8gcmVwbGFjZSB0aGUgdGFzay4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbUmVzdGFydCBpbmRpdmlkdWFsIGNvbnRhaW5lcnMgaW4gQW1hem9uIEVDUyB0YXNrcyB3aXRoIGNvbnRhaW5lciByZXN0YXJ0IHBvbGljaWVzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9jb250YWluZXItcmVzdGFydC1wb2xpY3kuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc3RhcnRQb2xpY3kge1xuLyoqXG4gKiBBIGxpc3Qgb2YgZXhpdCBjb2RlcyB0aGF0IEFtYXpvbiBFQ1Mgd2lsbCBpZ25vcmUgYW5kIG5vdCBhdHRlbXB0IGEgcmVzdGFydCBvbi4gWW91IGNhbiBzcGVjaWZ5IGEgbWF4aW11bSBvZiA1MCBjb250YWluZXIgZXhpdCBjb2Rlcy4gQnkgZGVmYXVsdCwgQW1hem9uIEVDUyBkb2VzIG5vdCBpZ25vcmUgYW55IGV4aXQgY29kZXMuXG4gKi9cbklnbm9yZWRFeGl0Q29kZXM/OiBudW1iZXJbXVxuLyoqXG4gKiBBIHBlcmlvZCBvZiB0aW1lIChpbiBzZWNvbmRzKSB0aGF0IHRoZSBjb250YWluZXIgbXVzdCBydW4gZm9yIGJlZm9yZSBhIHJlc3RhcnQgY2FuIGJlIGF0dGVtcHRlZC4gQSBjb250YWluZXIgY2FuIGJlIHJlc3RhcnRlZCBvbmx5IG9uY2UgZXZlcnkgYGByZXN0YXJ0QXR0ZW1wdFBlcmlvZGBgIHNlY29uZHMuIElmIGEgY29udGFpbmVyIGlzbid0IGFibGUgdG8gcnVuIGZvciB0aGlzIHRpbWUgcGVyaW9kIGFuZCBleGl0cyBlYXJseSwgaXQgd2lsbCBub3QgYmUgcmVzdGFydGVkLiBZb3UgY2FuIHNldCBhIG1pbmltdW0gYGByZXN0YXJ0QXR0ZW1wdFBlcmlvZGBgIG9mIDYwIHNlY29uZHMgYW5kIGEgbWF4aW11bSBgYHJlc3RhcnRBdHRlbXB0UGVyaW9kYGAgb2YgMTgwMCBzZWNvbmRzLiBCeSBkZWZhdWx0LCBhIGNvbnRhaW5lciBtdXN0IHJ1biBmb3IgMzAwIHNlY29uZHMgYmVmb3JlIGl0IGNhbiBiZSByZXN0YXJ0ZWQuXG4gKi9cblJlc3RhcnRBdHRlbXB0UGVyaW9kPzogbnVtYmVyXG4vKipcbiAqIFNwZWNpZmllcyB3aGV0aGVyIGEgcmVzdGFydCBwb2xpY3kgaXMgZW5hYmxlZCBmb3IgdGhlIGNvbnRhaW5lci5cbiAqL1xuRW5hYmxlZD86IGJvb2xlYW5cbn1cbi8qKlxuICogVGhlIGRldGFpbHMgZm9yIGEgdm9sdW1lIG1vdW50IHBvaW50IHRoYXQncyB1c2VkIGluIGEgY29udGFpbmVyIGRlZmluaXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW91bnRQb2ludCB7XG4vKipcbiAqIElmIHRoaXMgdmFsdWUgaXMgYGB0cnVlYGAsIHRoZSBjb250YWluZXIgaGFzIHJlYWQtb25seSBhY2Nlc3MgdG8gdGhlIHZvbHVtZS4gSWYgdGhpcyB2YWx1ZSBpcyBgYGZhbHNlYGAsIHRoZW4gdGhlIGNvbnRhaW5lciBjYW4gd3JpdGUgdG8gdGhlIHZvbHVtZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYGBmYWxzZWBgLlxuICovXG5SZWFkT25seT86IGJvb2xlYW5cbi8qKlxuICogVGhlIG5hbWUgb2YgdGhlIHZvbHVtZSB0byBtb3VudC4gTXVzdCBiZSBhIHZvbHVtZSBuYW1lIHJlZmVyZW5jZWQgaW4gdGhlIGBgbmFtZWBgIHBhcmFtZXRlciBvZiB0YXNrIGRlZmluaXRpb24gYGB2b2x1bWVgYC5cbiAqL1xuU291cmNlVm9sdW1lPzogc3RyaW5nXG4vKipcbiAqIFRoZSBwYXRoIG9uIHRoZSBjb250YWluZXIgdG8gbW91bnQgdGhlIGhvc3Qgdm9sdW1lIGF0LlxuICovXG5Db250YWluZXJQYXRoPzogc3RyaW5nXG59XG4vKipcbiAqIFRoZSBgYENvbnRhaW5lckRlcGVuZGVuY3lgYCBwcm9wZXJ0eSBzcGVjaWZpZXMgdGhlIGRlcGVuZGVuY2llcyBkZWZpbmVkIGZvciBjb250YWluZXIgc3RhcnR1cCBhbmQgc2h1dGRvd24uIEEgY29udGFpbmVyIGNhbiBjb250YWluIG11bHRpcGxlIGRlcGVuZGVuY2llcy4gV2hlbiBhIGRlcGVuZGVuY3kgaXMgZGVmaW5lZCBmb3IgY29udGFpbmVyIHN0YXJ0dXAsIGZvciBjb250YWluZXIgc2h1dGRvd24gaXQgaXMgcmV2ZXJzZWQuXG4gKiAgWW91ciBBbWF6b24gRUNTIGNvbnRhaW5lciBpbnN0YW5jZXMgcmVxdWlyZSBhdCBsZWFzdCB2ZXJzaW9uIDEuMjYuMCBvZiB0aGUgY29udGFpbmVyIGFnZW50IHRvIGVuYWJsZSBjb250YWluZXIgZGVwZW5kZW5jaWVzLiBIb3dldmVyLCB3ZSByZWNvbW1lbmQgdXNpbmcgdGhlIGxhdGVzdCBjb250YWluZXIgYWdlbnQgdmVyc2lvbi4gRm9yIGluZm9ybWF0aW9uIGFib3V0IGNoZWNraW5nIHlvdXIgYWdlbnQgdmVyc2lvbiBhbmQgdXBkYXRpbmcgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uLCBzZWUgW1VwZGF0aW5nIHRoZSBBbWF6b24gRUNTIENvbnRhaW5lciBBZ2VudF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvZWNzLWFnZW50LXVwZGF0ZS5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouIElmIHlvdSBhcmUgdXNpbmcgYW4gQW1hem9uIEVDUy1vcHRpbWl6ZWQgTGludXggQU1JLCB5b3VyIGluc3RhbmNlIG5lZWRzIGF0IGxlYXN0IHZlcnNpb24gMS4yNi4wLTEgb2YgdGhlIGBgZWNzLWluaXRgYCBwYWNrYWdlLiBJZiB5b3VyIGNvbnRhaW5lciBpbnN0YW5jZXMgYXJlIGxhdW5jaGVkIGZyb20gdmVyc2lvbiBgYDIwMTkwMzAxYGAgb3IgbGF0ZXIsIHRoZW4gdGhleSBjb250YWluIHRoZSByZXF1aXJlZCB2ZXJzaW9ucyBvZiB0aGUgY29udGFpbmVyIGFnZW50IGFuZCBgYGVjcy1pbml0YGAuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0FtYXpvbiBFQ1Mtb3B0aW1pemVkIExpbnV4IEFNSV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvZWNzLW9wdGltaXplZF9BTUkuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICogICBGb3IgdGFza3MgdXNpbmcgdGhlIEZhcmdhdGUgbGF1bmNoIHR5cGUsIHRoaXMgcGFyYW1ldGVyIHJlcXVpcmVzIHRoYXQgdGhlIHRhc2sgb3Igc2VydmljZSB1c2VzIHBsYXRmb3JtIHZlcnNpb24gMS4zLjAgb3IgbGF0ZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGFpbmVyRGVwZW5kZW5jeSB7XG4vKipcbiAqIFRoZSBkZXBlbmRlbmN5IGNvbmRpdGlvbiBvZiB0aGUgY29udGFpbmVyLiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgYXZhaWxhYmxlIGNvbmRpdGlvbnMgYW5kIHRoZWlyIGJlaGF2aW9yOlxuICogICArICAgYGBTVEFSVGBgIC0gVGhpcyBjb25kaXRpb24gZW11bGF0ZXMgdGhlIGJlaGF2aW9yIG9mIGxpbmtzIGFuZCB2b2x1bWVzIHRvZGF5LiBJdCB2YWxpZGF0ZXMgdGhhdCBhIGRlcGVuZGVudCBjb250YWluZXIgaXMgc3RhcnRlZCBiZWZvcmUgcGVybWl0dGluZyBvdGhlciBjb250YWluZXJzIHRvIHN0YXJ0LlxuICogICArICAgYGBDT01QTEVURWBgIC0gVGhpcyBjb25kaXRpb24gdmFsaWRhdGVzIHRoYXQgYSBkZXBlbmRlbnQgY29udGFpbmVyIHJ1bnMgdG8gY29tcGxldGlvbiAoZXhpdHMpIGJlZm9yZSBwZXJtaXR0aW5nIG90aGVyIGNvbnRhaW5lcnMgdG8gc3RhcnQuIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3Igbm9uZXNzZW50aWFsIGNvbnRhaW5lcnMgdGhhdCBydW4gYSBzY3JpcHQgYW5kIHRoZW4gZXhpdC4gVGhpcyBjb25kaXRpb24gY2FuJ3QgYmUgc2V0IG9uIGFuIGVzc2VudGlhbCBjb250YWluZXIuXG4gKiAgICsgICBgYFNVQ0NFU1NgYCAtIFRoaXMgY29uZGl0aW9uIGlzIHRoZSBzYW1lIGFzIGBgQ09NUExFVEVgYCwgYnV0IGl0IGFsc28gcmVxdWlyZXMgdGhhdCB0aGUgY29udGFpbmVyIGV4aXRzIHdpdGggYSBgYHplcm9gYCBzdGF0dXMuIFRoaXMgY29uZGl0aW9uIGNhbid0IGJlIHNldCBvbiBhbiBlc3NlbnRpYWwgY29udGFpbmVyLlxuICogICArICAgYGBIRUFMVEhZYGAgLSBUaGlzIGNvbmRpdGlvbiB2YWxpZGF0ZXMgdGhhdCB0aGUgZGVwZW5kZW50IGNvbnRhaW5lciBwYXNzZXMgaXRzIERvY2tlciBoZWFsdGggY2hlY2sgYmVmb3JlIHBlcm1pdHRpbmcgb3RoZXIgY29udGFpbmVycyB0byBzdGFydC4gVGhpcyByZXF1aXJlcyB0aGF0IHRoZSBkZXBlbmRlbnQgY29udGFpbmVyIGhhcyBoZWFsdGggY2hlY2tzIGNvbmZpZ3VyZWQuIFRoaXMgY29uZGl0aW9uIGlzIGNvbmZpcm1lZCBvbmx5IGF0IHRhc2sgc3RhcnR1cC5cbiAqL1xuQ29uZGl0aW9uPzogc3RyaW5nXG4vKipcbiAqIFRoZSBuYW1lIG9mIGEgY29udGFpbmVyLlxuICovXG5Db250YWluZXJOYW1lPzogc3RyaW5nXG59XG4vKipcbiAqIFRoZSBgYFBvcnRNYXBwaW5nYGAgcHJvcGVydHkgc3BlY2lmaWVzIGEgcG9ydCBtYXBwaW5nLiBQb3J0IG1hcHBpbmdzIGFsbG93IGNvbnRhaW5lcnMgdG8gYWNjZXNzIHBvcnRzIG9uIHRoZSBob3N0IGNvbnRhaW5lciBpbnN0YW5jZSB0byBzZW5kIG9yIHJlY2VpdmUgdHJhZmZpYy4gUG9ydCBtYXBwaW5ncyBhcmUgc3BlY2lmaWVkIGFzIHBhcnQgb2YgdGhlIGNvbnRhaW5lciBkZWZpbml0aW9uLlxuICogIElmIHlvdSBhcmUgdXNpbmcgY29udGFpbmVycyBpbiBhIHRhc2sgd2l0aCB0aGUgYGBhd3N2cGNgYCBvciBgYGhvc3RgYCBuZXR3b3JrIG1vZGUsIGV4cG9zZWQgcG9ydHMgc2hvdWxkIGJlIHNwZWNpZmllZCB1c2luZyBgYGNvbnRhaW5lclBvcnRgYC4gVGhlIGBgaG9zdFBvcnRgYCBjYW4gYmUgbGVmdCBibGFuayBvciBpdCBtdXN0IGJlIHRoZSBzYW1lIHZhbHVlIGFzIHRoZSBgYGNvbnRhaW5lclBvcnRgYC5cbiAqICBBZnRlciBhIHRhc2sgcmVhY2hlcyB0aGUgYGBSVU5OSU5HYGAgc3RhdHVzLCBtYW51YWwgYW5kIGF1dG9tYXRpYyBob3N0IGFuZCBjb250YWluZXIgcG9ydCBhc3NpZ25tZW50cyBhcmUgdmlzaWJsZSBpbiB0aGUgYGBuZXR3b3JrQmluZGluZ3NgYCBzZWN0aW9uIG9mIFtEZXNjcmliZVRhc2tzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlVGFza3MuaHRtbCkgQVBJIHJlc3BvbnNlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQb3J0TWFwcGluZyB7XG4vKipcbiAqIFRoZSBhcHBsaWNhdGlvbiBwcm90b2NvbCB0aGF0J3MgdXNlZCBmb3IgdGhlIHBvcnQgbWFwcGluZy4gVGhpcyBwYXJhbWV0ZXIgb25seSBhcHBsaWVzIHRvIFNlcnZpY2UgQ29ubmVjdC4gV2UgcmVjb21tZW5kIHRoYXQgeW91IHNldCB0aGlzIHBhcmFtZXRlciB0byBiZSBjb25zaXN0ZW50IHdpdGggdGhlIHByb3RvY29sIHRoYXQgeW91ciBhcHBsaWNhdGlvbiB1c2VzLiBJZiB5b3Ugc2V0IHRoaXMgcGFyYW1ldGVyLCBBbWF6b24gRUNTIGFkZHMgcHJvdG9jb2wtc3BlY2lmaWMgY29ubmVjdGlvbiBoYW5kbGluZyB0byB0aGUgU2VydmljZSBDb25uZWN0IHByb3h5LiBJZiB5b3Ugc2V0IHRoaXMgcGFyYW1ldGVyLCBBbWF6b24gRUNTIGFkZHMgcHJvdG9jb2wtc3BlY2lmaWMgdGVsZW1ldHJ5IGluIHRoZSBBbWF6b24gRUNTIGNvbnNvbGUgYW5kIENsb3VkV2F0Y2guXG4gKiAgSWYgeW91IGRvbid0IHNldCBhIHZhbHVlIGZvciB0aGlzIHBhcmFtZXRlciwgdGhlbiBUQ1AgaXMgdXNlZC4gSG93ZXZlciwgQW1hem9uIEVDUyBkb2Vzbid0IGFkZCBwcm90b2NvbC1zcGVjaWZpYyB0ZWxlbWV0cnkgZm9yIFRDUC5cbiAqICAgYGBhcHBQcm90b2NvbGBgIGlzIGltbXV0YWJsZSBpbiBhIFNlcnZpY2UgQ29ubmVjdCBzZXJ2aWNlLiBVcGRhdGluZyB0aGlzIGZpZWxkIHJlcXVpcmVzIGEgc2VydmljZSBkZWxldGlvbiBhbmQgcmVkZXBsb3ltZW50LlxuICogIFRhc2tzIHRoYXQgcnVuIGluIGEgbmFtZXNwYWNlIGNhbiB1c2Ugc2hvcnQgbmFtZXMgdG8gY29ubmVjdCB0byBzZXJ2aWNlcyBpbiB0aGUgbmFtZXNwYWNlLiBUYXNrcyBjYW4gY29ubmVjdCB0byBzZXJ2aWNlcyBhY3Jvc3MgYWxsIG9mIHRoZSBjbHVzdGVycyBpbiB0aGUgbmFtZXNwYWNlLiBUYXNrcyBjb25uZWN0IHRocm91Z2ggYSBtYW5hZ2VkIHByb3h5IGNvbnRhaW5lciB0aGF0IGNvbGxlY3RzIGxvZ3MgYW5kIG1ldHJpY3MgZm9yIGluY3JlYXNlZCB2aXNpYmlsaXR5LiBPbmx5IHRoZSB0YXNrcyB0aGF0IEFtYXpvbiBFQ1Mgc2VydmljZXMgY3JlYXRlIGFyZSBzdXBwb3J0ZWQgd2l0aCBTZXJ2aWNlIENvbm5lY3QuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1NlcnZpY2UgQ29ubmVjdF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvc2VydmljZS1jb25uZWN0Lmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuQXBwUHJvdG9jb2w/OiAoXCJodHRwXCIgfCBcImh0dHAyXCIgfCBcImdycGNcIilcbi8qKlxuICogVGhlIHBvcnQgbnVtYmVyIHJhbmdlIG9uIHRoZSBjb250YWluZXIgdGhhdCdzIGJvdW5kIHRvIHRoZSBkeW5hbWljYWxseSBtYXBwZWQgaG9zdCBwb3J0IHJhbmdlLiBcbiAqICBUaGUgZm9sbG93aW5nIHJ1bGVzIGFwcGx5IHdoZW4geW91IHNwZWNpZnkgYSBgYGNvbnRhaW5lclBvcnRSYW5nZWBgOlxuICogICArICBZb3UgbXVzdCB1c2UgZWl0aGVyIHRoZSBgYGJyaWRnZWBgIG5ldHdvcmsgbW9kZSBvciB0aGUgYGBhd3N2cGNgYCBuZXR3b3JrIG1vZGUuXG4gKiAgICsgIFRoaXMgcGFyYW1ldGVyIGlzIGF2YWlsYWJsZSBmb3IgYm90aCB0aGUgRUMyIGFuZCBGQVJHQVRFbG9uZyBsYXVuY2ggdHlwZXMuXG4gKiAgICsgIFRoaXMgcGFyYW1ldGVyIGlzIGF2YWlsYWJsZSBmb3IgYm90aCB0aGUgTGludXggYW5kIFdpbmRvd3Mgb3BlcmF0aW5nIHN5c3RlbXMuXG4gKiAgICsgIFRoZSBjb250YWluZXIgaW5zdGFuY2UgbXVzdCBoYXZlIGF0IGxlYXN0IHZlcnNpb24gMS42Ny4wIG9mIHRoZSBjb250YWluZXIgYWdlbnQgYW5kIGF0IGxlYXN0IHZlcnNpb24gMS42Ny4wLTEgb2YgdGhlIGBgZWNzLWluaXRgYCBwYWNrYWdlIFxuICogICArICBZb3UgY2FuIHNwZWNpZnkgYSBtYXhpbXVtIG9mIDEwMCBwb3J0IHJhbmdlcyBwZXIgY29udGFpbmVyLlxuICogICArICBZb3UgZG8gbm90IHNwZWNpZnkgYSBgYGhvc3RQb3J0UmFuZ2VgYC4gVGhlIHZhbHVlIG9mIHRoZSBgYGhvc3RQb3J0UmFuZ2VgYCBpcyBzZXQgYXMgZm9sbG93czpcbiAqICAgKyAgRm9yIGNvbnRhaW5lcnMgaW4gYSB0YXNrIHdpdGggdGhlIGBgYXdzdnBjYGAgbmV0d29yayBtb2RlLCB0aGUgYGBob3N0UG9ydFJhbmdlYGAgaXMgc2V0IHRvIHRoZSBzYW1lIHZhbHVlIGFzIHRoZSBgYGNvbnRhaW5lclBvcnRSYW5nZWBgLiBUaGlzIGlzIGEgc3RhdGljIG1hcHBpbmcgc3RyYXRlZ3kuXG4gKiAgICsgIEZvciBjb250YWluZXJzIGluIGEgdGFzayB3aXRoIHRoZSBgYGJyaWRnZWBgIG5ldHdvcmsgbW9kZSwgdGhlIEFtYXpvbiBFQ1MgYWdlbnQgZmluZHMgb3BlbiBob3N0IHBvcnRzIGZyb20gdGhlIGRlZmF1bHQgZXBoZW1lcmFsIHJhbmdlIGFuZCBwYXNzZXMgaXQgdG8gZG9ja2VyIHRvIGJpbmQgdGhlbSB0byB0aGUgY29udGFpbmVyIHBvcnRzLlxuICogICBcbiAqICAgKyAgVGhlIGBgY29udGFpbmVyUG9ydFJhbmdlYGAgdmFsaWQgdmFsdWVzIGFyZSBiZXR3ZWVuIDEgYW5kIDY1NTM1LlxuICogICArICBBIHBvcnQgY2FuIG9ubHkgYmUgaW5jbHVkZWQgaW4gb25lIHBvcnQgbWFwcGluZyBwZXIgY29udGFpbmVyLlxuICogICArICBZb3UgY2Fubm90IHNwZWNpZnkgb3ZlcmxhcHBpbmcgcG9ydCByYW5nZXMuXG4gKiAgICsgIFRoZSBmaXJzdCBwb3J0IGluIHRoZSByYW5nZSBtdXN0IGJlIGxlc3MgdGhhbiBsYXN0IHBvcnQgaW4gdGhlIHJhbmdlLlxuICogICArICBEb2NrZXIgcmVjb21tZW5kcyB0aGF0IHlvdSB0dXJuIG9mZiB0aGUgZG9ja2VyLXByb3h5IGluIHRoZSBEb2NrZXIgZGFlbW9uIGNvbmZpZyBmaWxlIHdoZW4geW91IGhhdmUgYSBsYXJnZSBudW1iZXIgb2YgcG9ydHMuXG4gKiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbSXNzdWUgIzExMTg1XShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaHR0cHM6Ly9naXRodWIuY29tL21vYnkvbW9ieS9pc3N1ZXMvMTExODUpIG9uIHRoZSBHaXRodWIgd2Vic2l0ZS5cbiAqICBGb3IgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRvIHR1cm4gb2ZmIHRoZSBkb2NrZXItcHJveHkgaW4gdGhlIERvY2tlciBkYWVtb24gY29uZmlnIGZpbGUsIHNlZSBbRG9ja2VyIGRhZW1vbl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvYm9vdHN0cmFwX2NvbnRhaW5lcl9pbnN0YW5jZS5odG1sI2Jvb3RzdHJhcF9kb2NrZXJfZGFlbW9uKSBpbiB0aGUgKkFtYXpvbiBFQ1MgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICAgXG4gKiAgWW91IGNhbiBjYWxsIFtEZXNjcmliZVRhc2tzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlVGFza3MuaHRtbCkgdG8gdmlldyB0aGUgYGBob3N0UG9ydFJhbmdlYGAgd2hpY2ggYXJlIHRoZSBob3N0IHBvcnRzIHRoYXQgYXJlIGJvdW5kIHRvIHRoZSBjb250YWluZXIgcG9ydHMuXG4gKi9cbkNvbnRhaW5lclBvcnRSYW5nZT86IHN0cmluZ1xuLyoqXG4gKiBUaGUgcG9ydCBudW1iZXIgb24gdGhlIGNvbnRhaW5lciBpbnN0YW5jZSB0byByZXNlcnZlIGZvciB5b3VyIGNvbnRhaW5lci5cbiAqICBJZiB5b3Ugc3BlY2lmeSBhIGBgY29udGFpbmVyUG9ydFJhbmdlYGAsIGxlYXZlIHRoaXMgZmllbGQgZW1wdHkgYW5kIHRoZSB2YWx1ZSBvZiB0aGUgYGBob3N0UG9ydGBgIGlzIHNldCBhcyBmb2xsb3dzOlxuICogICArICBGb3IgY29udGFpbmVycyBpbiBhIHRhc2sgd2l0aCB0aGUgYGBhd3N2cGNgYCBuZXR3b3JrIG1vZGUsIHRoZSBgYGhvc3RQb3J0YGAgaXMgc2V0IHRvIHRoZSBzYW1lIHZhbHVlIGFzIHRoZSBgYGNvbnRhaW5lclBvcnRgYC4gVGhpcyBpcyBhIHN0YXRpYyBtYXBwaW5nIHN0cmF0ZWd5LlxuICogICArICBGb3IgY29udGFpbmVycyBpbiBhIHRhc2sgd2l0aCB0aGUgYGBicmlkZ2VgYCBuZXR3b3JrIG1vZGUsIHRoZSBBbWF6b24gRUNTIGFnZW50IGZpbmRzIG9wZW4gcG9ydHMgb24gdGhlIGhvc3QgYW5kIGF1dG9tYXRpY2FsbHkgYmluZHMgdGhlbSB0byB0aGUgY29udGFpbmVyIHBvcnRzLiBUaGlzIGlzIGEgZHluYW1pYyBtYXBwaW5nIHN0cmF0ZWd5LlxuICogICBcbiAqICBJZiB5b3UgdXNlIGNvbnRhaW5lcnMgaW4gYSB0YXNrIHdpdGggdGhlIGBgYXdzdnBjYGAgb3IgYGBob3N0YGAgbmV0d29yayBtb2RlLCB0aGUgYGBob3N0UG9ydGBgIGNhbiBlaXRoZXIgYmUgbGVmdCBibGFuayBvciBzZXQgdG8gdGhlIHNhbWUgdmFsdWUgYXMgdGhlIGBgY29udGFpbmVyUG9ydGBgLlxuICogIElmIHlvdSB1c2UgY29udGFpbmVycyBpbiBhIHRhc2sgd2l0aCB0aGUgYGBicmlkZ2VgYCBuZXR3b3JrIG1vZGUsIHlvdSBjYW4gc3BlY2lmeSBhIG5vbi1yZXNlcnZlZCBob3N0IHBvcnQgZm9yIHlvdXIgY29udGFpbmVyIHBvcnQgbWFwcGluZywgb3IgeW91IGNhbiBvbWl0IHRoZSBgYGhvc3RQb3J0YGAgKG9yIHNldCBpdCB0byBgYDBgYCkgd2hpbGUgc3BlY2lmeWluZyBhIGBgY29udGFpbmVyUG9ydGBgIGFuZCB5b3VyIGNvbnRhaW5lciBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgcG9ydCBpbiB0aGUgZXBoZW1lcmFsIHBvcnQgcmFuZ2UgZm9yIHlvdXIgY29udGFpbmVyIGluc3RhbmNlIG9wZXJhdGluZyBzeXN0ZW0gYW5kIERvY2tlciB2ZXJzaW9uLlxuICogIFRoZSBkZWZhdWx0IGVwaGVtZXJhbCBwb3J0IHJhbmdlIGZvciBEb2NrZXIgdmVyc2lvbiAxLjYuMCBhbmQgbGF0ZXIgaXMgbGlzdGVkIG9uIHRoZSBpbnN0YW5jZSB1bmRlciBgYC9wcm9jL3N5cy9uZXQvaXB2NC9pcF9sb2NhbF9wb3J0X3JhbmdlYGAuIElmIHRoaXMga2VybmVsIHBhcmFtZXRlciBpcyB1bmF2YWlsYWJsZSwgdGhlIGRlZmF1bHQgZXBoZW1lcmFsIHBvcnQgcmFuZ2UgZnJvbSA0OTE1MyB0aHJvdWdoIDY1NTM1IChMaW51eCkgb3IgNDkxNTIgdGhyb3VnaCA2NTUzNSAoV2luZG93cykgaXMgdXNlZC4gRG8gbm90IGF0dGVtcHQgdG8gc3BlY2lmeSBhIGhvc3QgcG9ydCBpbiB0aGUgZXBoZW1lcmFsIHBvcnQgcmFuZ2UgYXMgdGhlc2UgYXJlIHJlc2VydmVkIGZvciBhdXRvbWF0aWMgYXNzaWdubWVudC4gSW4gZ2VuZXJhbCwgcG9ydHMgYmVsb3cgMzI3NjggYXJlIG91dHNpZGUgb2YgdGhlIGVwaGVtZXJhbCBwb3J0IHJhbmdlLlxuICogIFRoZSBkZWZhdWx0IHJlc2VydmVkIHBvcnRzIGFyZSAyMiBmb3IgU1NILCB0aGUgRG9ja2VyIHBvcnRzIDIzNzUgYW5kIDIzNzYsIGFuZCB0aGUgQW1hem9uIEVDUyBjb250YWluZXIgYWdlbnQgcG9ydHMgNTE2NzgtNTE2ODAuIEFueSBob3N0IHBvcnQgdGhhdCB3YXMgcHJldmlvdXNseSBzcGVjaWZpZWQgaW4gYSBydW5uaW5nIHRhc2sgaXMgYWxzbyByZXNlcnZlZCB3aGlsZSB0aGUgdGFzayBpcyBydW5uaW5nLiBUaGF0IGlzLCBhZnRlciBhIHRhc2sgc3RvcHMsIHRoZSBob3N0IHBvcnQgaXMgcmVsZWFzZWQuIFRoZSBjdXJyZW50IHJlc2VydmVkIHBvcnRzIGFyZSBkaXNwbGF5ZWQgaW4gdGhlIGBgcmVtYWluaW5nUmVzb3VyY2VzYGAgb2YgW0Rlc2NyaWJlQ29udGFpbmVySW5zdGFuY2VzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlQ29udGFpbmVySW5zdGFuY2VzLmh0bWwpIG91dHB1dC4gQSBjb250YWluZXIgaW5zdGFuY2UgY2FuIGhhdmUgdXAgdG8gMTAwIHJlc2VydmVkIHBvcnRzIGF0IGEgdGltZS4gVGhpcyBudW1iZXIgaW5jbHVkZXMgdGhlIGRlZmF1bHQgcmVzZXJ2ZWQgcG9ydHMuIEF1dG9tYXRpY2FsbHkgYXNzaWduZWQgcG9ydHMgYXJlbid0IGluY2x1ZGVkIGluIHRoZSAxMDAgcmVzZXJ2ZWQgcG9ydHMgcXVvdGEuXG4gKi9cbkhvc3RQb3J0PzogbnVtYmVyXG4vKipcbiAqIFRoZSBwb3J0IG51bWJlciBvbiB0aGUgY29udGFpbmVyIHRoYXQncyBib3VuZCB0byB0aGUgdXNlci1zcGVjaWZpZWQgb3IgYXV0b21hdGljYWxseSBhc3NpZ25lZCBob3N0IHBvcnQuXG4gKiAgSWYgeW91IHVzZSBjb250YWluZXJzIGluIGEgdGFzayB3aXRoIHRoZSBgYGF3c3ZwY2BgIG9yIGBgaG9zdGBgIG5ldHdvcmsgbW9kZSwgc3BlY2lmeSB0aGUgZXhwb3NlZCBwb3J0cyB1c2luZyBgYGNvbnRhaW5lclBvcnRgYC5cbiAqICBJZiB5b3UgdXNlIGNvbnRhaW5lcnMgaW4gYSB0YXNrIHdpdGggdGhlIGBgYnJpZGdlYGAgbmV0d29yayBtb2RlIGFuZCB5b3Ugc3BlY2lmeSBhIGNvbnRhaW5lciBwb3J0IGFuZCBub3QgYSBob3N0IHBvcnQsIHlvdXIgY29udGFpbmVyIGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBob3N0IHBvcnQgaW4gdGhlIGVwaGVtZXJhbCBwb3J0IHJhbmdlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGBgaG9zdFBvcnRgYC4gUG9ydCBtYXBwaW5ncyB0aGF0IGFyZSBhdXRvbWF0aWNhbGx5IGFzc2lnbmVkIGluIHRoaXMgd2F5IGRvIG5vdCBjb3VudCB0b3dhcmQgdGhlIDEwMCByZXNlcnZlZCBwb3J0cyBsaW1pdCBvZiBhIGNvbnRhaW5lciBpbnN0YW5jZS5cbiAqL1xuQ29udGFpbmVyUG9ydD86IG51bWJlclxuLyoqXG4gKiBUaGUgcHJvdG9jb2wgdXNlZCBmb3IgdGhlIHBvcnQgbWFwcGluZy4gVmFsaWQgdmFsdWVzIGFyZSBgYHRjcGBgIGFuZCBgYHVkcGBgLiBUaGUgZGVmYXVsdCBpcyBgYHRjcGBgLiBgYHByb3RvY29sYGAgaXMgaW1tdXRhYmxlIGluIGEgU2VydmljZSBDb25uZWN0IHNlcnZpY2UuIFVwZGF0aW5nIHRoaXMgZmllbGQgcmVxdWlyZXMgYSBzZXJ2aWNlIGRlbGV0aW9uIGFuZCByZWRlcGxveW1lbnQuXG4gKi9cblByb3RvY29sPzogc3RyaW5nXG4vKipcbiAqIFRoZSBuYW1lIHRoYXQncyB1c2VkIGZvciB0aGUgcG9ydCBtYXBwaW5nLiBUaGlzIHBhcmFtZXRlciBpcyB0aGUgbmFtZSB0aGF0IHlvdSB1c2UgaW4gdGhlIGBgc2VydmljZUNvbm5lY3RDb25maWd1cmF0aW9uYGAgYW5kIHRoZSBgYHZwY0xhdHRpY2VDb25maWd1cmF0aW9uc2BgIG9mIGEgc2VydmljZS4gVGhlIG5hbWUgY2FuIGluY2x1ZGUgdXAgdG8gNjQgY2hhcmFjdGVycy4gVGhlIGNoYXJhY3RlcnMgY2FuIGluY2x1ZGUgbG93ZXJjYXNlIGxldHRlcnMsIG51bWJlcnMsIHVuZGVyc2NvcmVzIChfKSwgYW5kIGh5cGhlbnMgKC0pLiBUaGUgbmFtZSBjYW4ndCBzdGFydCB3aXRoIGEgaHlwaGVuLlxuICovXG5OYW1lPzogc3RyaW5nXG59XG4vKipcbiAqIFRoZSBlcGhlbWVyYWwgc3RvcmFnZSBzZXR0aW5ncyB0byB1c2UgZm9yIHRhc2tzIHJ1biB3aXRoIHRoZSB0YXNrIGRlZmluaXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXBoZW1lcmFsU3RvcmFnZSB7XG4vKipcbiAqIFRoZSB0b3RhbCBhbW91bnQsIGluIEdpQiwgb2YgZXBoZW1lcmFsIHN0b3JhZ2UgdG8gc2V0IGZvciB0aGUgdGFzay4gVGhlIG1pbmltdW0gc3VwcG9ydGVkIHZhbHVlIGlzIGBgMjBgYCBHaUIgYW5kIHRoZSBtYXhpbXVtIHN1cHBvcnRlZCB2YWx1ZSBpcyBgYDIwMGBgIEdpQi5cbiAqL1xuU2l6ZUluR2lCPzogbnVtYmVyXG59XG4vKipcbiAqIFRoZSBtZXRhZGF0YSB0aGF0IHlvdSBhcHBseSB0byBhIHJlc291cmNlIHRvIGhlbHAgeW91IGNhdGVnb3JpemUgYW5kIG9yZ2FuaXplIHRoZW0uIEVhY2ggdGFnIGNvbnNpc3RzIG9mIGEga2V5IGFuZCBhbiBvcHRpb25hbCB2YWx1ZS4gWW91IGRlZmluZSB0aGVtLlxuICogIFRoZSBmb2xsb3dpbmcgYmFzaWMgcmVzdHJpY3Rpb25zIGFwcGx5IHRvIHRhZ3M6XG4gKiAgICsgIE1heGltdW0gbnVtYmVyIG9mIHRhZ3MgcGVyIHJlc291cmNlIC0gNTBcbiAqICAgKyAgRm9yIGVhY2ggcmVzb3VyY2UsIGVhY2ggdGFnIGtleSBtdXN0IGJlIHVuaXF1ZSwgYW5kIGVhY2ggdGFnIGtleSBjYW4gaGF2ZSBvbmx5IG9uZSB2YWx1ZS5cbiAqICAgKyAgTWF4aW11bSBrZXkgbGVuZ3RoIC0gMTI4IFVuaWNvZGUgY2hhcmFjdGVycyBpbiBVVEYtOFxuICogICArICBNYXhpbXVtIHZhbHVlIGxlbmd0aCAtIDI1NiBVbmljb2RlIGNoYXJhY3RlcnMgaW4gVVRGLThcbiAqICAgKyAgSWYgeW91ciB0YWdnaW5nIHNjaGVtYSBpcyB1c2VkIGFjcm9zcyBtdWx0aXBsZSBzZXJ2aWNlcyBhbmQgcmVzb3VyY2VzLCByZW1lbWJlciB0aGF0IG90aGVyIHNlcnZpY2VzIG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiBhbGxvd2VkIGNoYXJhY3RlcnMuIEdlbmVyYWxseSBhbGxvd2VkIGNoYXJhY3RlcnMgYXJlOiBsZXR0ZXJzLCBudW1iZXJzLCBhbmQgc3BhY2VzIHJlcHJlc2VudGFibGUgaW4gVVRGLTgsIGFuZCB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcnM6ICsgLSA9IC4gXyA6IC8gQC5cbiAqICAgKyAgVGFnIGtleXMgYW5kIHZhbHVlcyBhcmUgY2FzZS1zZW5zaXRpdmUuXG4gKiAgICsgIERvIG5vdCB1c2UgYGBhd3M6YGAsIGBgQVdTOmBgLCBvciBhbnkgdXBwZXIgb3IgbG93ZXJjYXNlIGNvbWJpbmF0aW9uIG9mIHN1Y2ggYXMgYSBwcmVmaXggZm9yIGVpdGhlciBrZXlzIG9yIHZhbHVlcyBhcyBpdCBpcyByZXNlcnZlZCBmb3IgQVdTIHVzZS4gWW91IGNhbm5vdCBlZGl0IG9yIGRlbGV0ZSB0YWcga2V5cyBvciB2YWx1ZXMgd2l0aCB0aGlzIHByZWZpeC4gVGFncyB3aXRoIHRoaXMgcHJlZml4IGRvIG5vdCBjb3VudCBhZ2FpbnN0IHlvdXIgdGFncyBwZXIgcmVzb3VyY2UgbGltaXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGFnIHtcbi8qKlxuICogVGhlIG9wdGlvbmFsIHBhcnQgb2YgYSBrZXktdmFsdWUgcGFpciB0aGF0IG1ha2UgdXAgYSB0YWcuIEEgYGB2YWx1ZWBgIGFjdHMgYXMgYSBkZXNjcmlwdG9yIHdpdGhpbiBhIHRhZyBjYXRlZ29yeSAoa2V5KS5cbiAqL1xuVmFsdWU/OiBzdHJpbmdcbi8qKlxuICogT25lIHBhcnQgb2YgYSBrZXktdmFsdWUgcGFpciB0aGF0IG1ha2UgdXAgYSB0YWcuIEEgYGBrZXlgYCBpcyBhIGdlbmVyYWwgbGFiZWwgdGhhdCBhY3RzIGxpa2UgYSBjYXRlZ29yeSBmb3IgbW9yZSBzcGVjaWZpYyB0YWcgdmFsdWVzLlxuICovXG5LZXk/OiBzdHJpbmdcbn1cbiJdfQ==
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzLWVjcy10YXNrZGVmaW5pdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImF3cy1lY3MtdGFza2RlZmluaXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUmVnaXN0ZXJzIGEgbmV3IHRhc2sgZGVmaW5pdGlvbiBmcm9tIHRoZSBzdXBwbGllZCBgYGZhbWlseWBgIGFuZCBgYGNvbnRhaW5lckRlZmluaXRpb25zYGAuIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGRhdGEgdm9sdW1lcyB0byB5b3VyIGNvbnRhaW5lcnMgd2l0aCB0aGUgYGB2b2x1bWVzYGAgcGFyYW1ldGVyLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0YXNrIGRlZmluaXRpb24gcGFyYW1ldGVycyBhbmQgZGVmYXVsdHMsIHNlZSBbQW1hem9uIEVDUyBUYXNrIERlZmluaXRpb25zXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS90YXNrX2RlZmludGlvbnMuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICogIFlvdSBjYW4gc3BlY2lmeSBhIHJvbGUgZm9yIHlvdXIgdGFzayB3aXRoIHRoZSBgYHRhc2tSb2xlQXJuYGAgcGFyYW1ldGVyLiBXaGVuIHlvdSBzcGVjaWZ5IGEgcm9sZSBmb3IgYSB0YXNrLCBpdHMgY29udGFpbmVycyBjYW4gdGhlbiB1c2UgdGhlIGxhdGVzdCB2ZXJzaW9ucyBvZiB0aGUgQ0xJIG9yIFNES3MgdG8gbWFrZSBBUEkgcmVxdWVzdHMgdG8gdGhlIEFXUyBzZXJ2aWNlcyB0aGF0IGFyZSBzcGVjaWZpZWQgaW4gdGhlIHBvbGljeSB0aGF0J3MgYXNzb2NpYXRlZCB3aXRoIHRoZSByb2xlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtJQU0gUm9sZXMgZm9yIFRhc2tzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS90YXNrLWlhbS1yb2xlcy5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKiAgWW91IGNhbiBzcGVjaWZ5IGEgRG9ja2VyIG5ldHdvcmtpbmcgbW9kZSBmb3IgdGhlIGNvbnRhaW5lcnMgaW4geW91ciB0YXNrIGRlZmluaXRpb24gd2l0aCB0aGUgYGBuZXR3b3JrTW9kZWBgIHBhcmFtZXRlci4gSWYgeW91IHNwZWNpZnkgdGhlIGBgYXdzdnBjYGAgbmV0d29yayBtb2RlLCB0aGUgdGFzayBpcyBhbGxvY2F0ZWQgYW4gZWxhc3RpYyBuZXR3b3JrIGludGVyZmFjZSwgYW5kIHlvdSBtdXN0IHNwZWNpZnkgYSBbTmV0d29ya0NvbmZpZ3VyYXRpb25dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTmV0d29ya0NvbmZpZ3VyYXRpb24uaHRtbCkgd2hlbiB5b3UgY3JlYXRlIGEgc2VydmljZSBvciBydW4gYSB0YXNrIHdpdGggdGhlIHRhc2sgZGVmaW5pdGlvbi4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbVGFzayBOZXR3b3JraW5nXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS90YXNrLW5ldHdvcmtpbmcuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICogICBJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUgb3IgZXhhbXBsZXMsIHRoZSBBdXRob3JpemF0aW9uIGhlYWRlciBjb250ZW50cyAoYGBBVVRIUEFSQU1TYGApIG11c3QgYmUgcmVwbGFjZWQgd2l0aCBhbiBBV1MgU2lnbmF0dXJlIFZlcnNpb24gNCBzaWduYXR1cmUuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1NpZ25hdHVyZSBWZXJzaW9uIDQgU2lnbmluZyBQcm9jZXNzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2VuZXJhbC9sYXRlc3QvZ3Ivc2lnbmF0dXJlLXZlcnNpb24tNC5odG1sKSBpbiB0aGUgKkdlbmVyYWwgUmVmZXJlbmNlKi5cbiAqICBZb3Ugb25seSBuZWVkIHRvIGxlYXJuIGhvdyB0byBzaWduIEhUVFAgcmVxdWVzdHMgaWYgeW91IGludGVuZCB0byBjcmVhdGUgdGhlbSBtYW51YWxseS4gV2hlbiB5b3UgdXNlIHRoZSBbXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xpLykgb3Igb25lIG9mIHRoZSBbU0RLc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3Rvb2xzLykgdG8gbWFrZSByZXF1ZXN0cyB0byBBV1MsIHRoZXNlIHRvb2xzIGF1dG9tYXRpY2FsbHkgc2lnbiB0aGUgcmVxdWVzdHMgZm9yIHlvdSwgd2l0aCB0aGUgYWNjZXNzIGtleSB0aGF0IHlvdSBzcGVjaWZ5IHdoZW4geW91IGNvbmZpZ3VyZSB0aGUgdG9vbHMuIFdoZW4geW91IHVzZSB0aGVzZSB0b29scywgeW91IGRvbid0IGhhdmUgdG8gc2lnbiByZXF1ZXN0cyB5b3Vyc2VsZi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBfQVdTX0VDU19UQVNLREVGSU5JVElPTiB7XG4vKipcbiAqIFRoZSBzaG9ydCBuYW1lIG9yIGZ1bGwgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIElBTWxvbmcgcm9sZSB0aGF0IGdyYW50cyBjb250YWluZXJzIGluIHRoZSB0YXNrIHBlcm1pc3Npb24gdG8gY2FsbCBBV1MgQVBJcyBvbiB5b3VyIGJlaGFsZi4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQW1hem9uIEVDUyBUYXNrIFJvbGVdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3Rhc2staWFtLXJvbGVzLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICBJQU0gcm9sZXMgZm9yIHRhc2tzIG9uIFdpbmRvd3MgcmVxdWlyZSB0aGF0IHRoZSBgYC1FbmFibGVUYXNrSUFNUm9sZWBgIG9wdGlvbiBpcyBzZXQgd2hlbiB5b3UgbGF1bmNoIHRoZSBBbWF6b24gRUNTLW9wdGltaXplZCBXaW5kb3dzIEFNSS4gWW91ciBjb250YWluZXJzIG11c3QgYWxzbyBydW4gc29tZSBjb25maWd1cmF0aW9uIGNvZGUgdG8gdXNlIHRoZSBmZWF0dXJlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtXaW5kb3dzIElBTSByb2xlcyBmb3IgdGFza3NdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3dpbmRvd3NfdGFza19JQU1fcm9sZXMuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICogICBTdHJpbmcgdmFsaWRhdGlvbiBpcyBkb25lIG9uIHRoZSBFQ1Mgc2lkZS4gSWYgYW4gaW52YWxpZCBzdHJpbmcgdmFsdWUgaXMgZ2l2ZW4gZm9yIGBgVGFza1JvbGVBcm5gYCwgaXQgbWF5IGNhdXNlIHRoZSBDbG91ZGZvcm1hdGlvbiBqb2IgdG8gaGFuZy5cbiAqL1xuVGFza1JvbGVBcm4/OiBzdHJpbmdcbi8qKlxuICogVGhlIElQQyByZXNvdXJjZSBuYW1lc3BhY2UgdG8gdXNlIGZvciB0aGUgY29udGFpbmVycyBpbiB0aGUgdGFzay4gVGhlIHZhbGlkIHZhbHVlcyBhcmUgYGBob3N0YGAsIGBgdGFza2BgLCBvciBgYG5vbmVgYC4gSWYgYGBob3N0YGAgaXMgc3BlY2lmaWVkLCB0aGVuIGFsbCBjb250YWluZXJzIHdpdGhpbiB0aGUgdGFza3MgdGhhdCBzcGVjaWZpZWQgdGhlIGBgaG9zdGBgIElQQyBtb2RlIG9uIHRoZSBzYW1lIGNvbnRhaW5lciBpbnN0YW5jZSBzaGFyZSB0aGUgc2FtZSBJUEMgcmVzb3VyY2VzIHdpdGggdGhlIGhvc3QgQW1hem9uIEVDMiBpbnN0YW5jZS4gSWYgYGB0YXNrYGAgaXMgc3BlY2lmaWVkLCBhbGwgY29udGFpbmVycyB3aXRoaW4gdGhlIHNwZWNpZmllZCB0YXNrIHNoYXJlIHRoZSBzYW1lIElQQyByZXNvdXJjZXMuIElmIGBgbm9uZWBgIGlzIHNwZWNpZmllZCwgdGhlbiBJUEMgcmVzb3VyY2VzIHdpdGhpbiB0aGUgY29udGFpbmVycyBvZiBhIHRhc2sgYXJlIHByaXZhdGUgYW5kIG5vdCBzaGFyZWQgd2l0aCBvdGhlciBjb250YWluZXJzIGluIGEgdGFzayBvciBvbiB0aGUgY29udGFpbmVyIGluc3RhbmNlLiBJZiBubyB2YWx1ZSBpcyBzcGVjaWZpZWQsIHRoZW4gdGhlIElQQyByZXNvdXJjZSBuYW1lc3BhY2Ugc2hhcmluZyBkZXBlbmRzIG9uIHRoZSBEb2NrZXIgZGFlbW9uIHNldHRpbmcgb24gdGhlIGNvbnRhaW5lciBpbnN0YW5jZS5cbiAqICBJZiB0aGUgYGBob3N0YGAgSVBDIG1vZGUgaXMgdXNlZCwgYmUgYXdhcmUgdGhhdCB0aGVyZSBpcyBhIGhlaWdodGVuZWQgcmlzayBvZiB1bmRlc2lyZWQgSVBDIG5hbWVzcGFjZSBleHBvc2UuXG4gKiAgSWYgeW91IGFyZSBzZXR0aW5nIG5hbWVzcGFjZWQga2VybmVsIHBhcmFtZXRlcnMgdXNpbmcgYGBzeXN0ZW1Db250cm9sc2BgIGZvciB0aGUgY29udGFpbmVycyBpbiB0aGUgdGFzaywgdGhlIGZvbGxvd2luZyB3aWxsIGFwcGx5IHRvIHlvdXIgSVBDIHJlc291cmNlIG5hbWVzcGFjZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbU3lzdGVtIENvbnRyb2xzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS90YXNrX2RlZmluaXRpb25fcGFyYW1ldGVycy5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKiAgICsgIEZvciB0YXNrcyB0aGF0IHVzZSB0aGUgYGBob3N0YGAgSVBDIG1vZGUsIElQQyBuYW1lc3BhY2UgcmVsYXRlZCBgYHN5c3RlbUNvbnRyb2xzYGAgYXJlIG5vdCBzdXBwb3J0ZWQuXG4gKiAgICsgIEZvciB0YXNrcyB0aGF0IHVzZSB0aGUgYGB0YXNrYGAgSVBDIG1vZGUsIElQQyBuYW1lc3BhY2UgcmVsYXRlZCBgYHN5c3RlbUNvbnRyb2xzYGAgd2lsbCBhcHBseSB0byBhbGwgY29udGFpbmVycyB3aXRoaW4gYSB0YXNrLlxuICogICBcbiAqICAgVGhpcyBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZCBmb3IgV2luZG93cyBjb250YWluZXJzIG9yIHRhc2tzIHJ1biBvbiBGQVJHQVRFbG9uZy5cbiAqL1xuSXBjTW9kZT86IHN0cmluZ1xuLyoqXG4gKiBUaGUgRWxhc3RpYyBJbmZlcmVuY2UgYWNjZWxlcmF0b3JzIHRvIHVzZSBmb3IgdGhlIGNvbnRhaW5lcnMgaW4gdGhlIHRhc2suXG4gKi9cbkluZmVyZW5jZUFjY2VsZXJhdG9ycz86IEluZmVyZW5jZUFjY2VsZXJhdG9yW11cbi8qKlxuICogVGhlIGFtb3VudCAoaW4gTWlCKSBvZiBtZW1vcnkgdXNlZCBieSB0aGUgdGFzay5cbiAqICBJZiB5b3VyIHRhc2tzIHJ1bnMgb24gQW1hem9uIEVDMiBpbnN0YW5jZXMsIHlvdSBtdXN0IHNwZWNpZnkgZWl0aGVyIGEgdGFzay1sZXZlbCBtZW1vcnkgdmFsdWUgb3IgYSBjb250YWluZXItbGV2ZWwgbWVtb3J5IHZhbHVlLiBUaGlzIGZpZWxkIGlzIG9wdGlvbmFsIGFuZCBhbnkgdmFsdWUgY2FuIGJlIHVzZWQuIElmIGEgdGFzay1sZXZlbCBtZW1vcnkgdmFsdWUgaXMgc3BlY2lmaWVkLCB0aGUgY29udGFpbmVyLWxldmVsIG1lbW9yeSB2YWx1ZSBpcyBvcHRpb25hbC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvbnRhaW5lci1sZXZlbCBtZW1vcnkgYW5kIG1lbW9yeSByZXNlcnZhdGlvbiwgc2VlIFtDb250YWluZXJEZWZpbml0aW9uXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NvbnRhaW5lckRlZmluaXRpb24uaHRtbCkuXG4gKiAgSWYgeW91ciB0YXNrcyBydW5zIG9uIEZBUkdBVEVsb25nLCB0aGlzIGZpZWxkIGlzIHJlcXVpcmVkLiBZb3UgbXVzdCB1c2Ugb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzLiBUaGUgdmFsdWUgeW91IGNob29zZSBkZXRlcm1pbmVzIHlvdXIgcmFuZ2Ugb2YgdmFsaWQgdmFsdWVzIGZvciB0aGUgYGBjcHVgYCBwYXJhbWV0ZXIuXG4gKiAgICsgIDUxMiAoMC41IEdCKSwgMTAyNCAoMSBHQiksIDIwNDggKDIgR0IpIC0gQXZhaWxhYmxlIGBgY3B1YGAgdmFsdWVzOiAyNTYgKC4yNSB2Q1BVKVxuICogICArICAxMDI0ICgxIEdCKSwgMjA0OCAoMiBHQiksIDMwNzIgKDMgR0IpLCA0MDk2ICg0IEdCKSAtIEF2YWlsYWJsZSBgYGNwdWBgIHZhbHVlczogNTEyICguNSB2Q1BVKVxuICogICArICAyMDQ4ICgyIEdCKSwgMzA3MiAoMyBHQiksIDQwOTYgKDQgR0IpLCA1MTIwICg1IEdCKSwgNjE0NCAoNiBHQiksIDcxNjggKDcgR0IpLCA4MTkyICg4IEdCKSAtIEF2YWlsYWJsZSBgYGNwdWBgIHZhbHVlczogMTAyNCAoMSB2Q1BVKVxuICogICArICBCZXR3ZWVuIDQwOTYgKDQgR0IpIGFuZCAxNjM4NCAoMTYgR0IpIGluIGluY3JlbWVudHMgb2YgMTAyNCAoMSBHQikgLSBBdmFpbGFibGUgYGBjcHVgYCB2YWx1ZXM6IDIwNDggKDIgdkNQVSlcbiAqICAgKyAgQmV0d2VlbiA4MTkyICg4IEdCKSBhbmQgMzA3MjAgKDMwIEdCKSBpbiBpbmNyZW1lbnRzIG9mIDEwMjQgKDEgR0IpIC0gQXZhaWxhYmxlIGBgY3B1YGAgdmFsdWVzOiA0MDk2ICg0IHZDUFUpXG4gKiAgICsgIEJldHdlZW4gMTYgR0IgYW5kIDYwIEdCIGluIDQgR0IgaW5jcmVtZW50cyAtIEF2YWlsYWJsZSBgYGNwdWBgIHZhbHVlczogODE5MiAoOCB2Q1BVKVxuICogIFRoaXMgb3B0aW9uIHJlcXVpcmVzIExpbnV4IHBsYXRmb3JtIGBgMS40LjBgYCBvciBsYXRlci5cbiAqICAgKyAgQmV0d2VlbiAzMkdCIGFuZCAxMjAgR0IgaW4gOCBHQiBpbmNyZW1lbnRzIC0gQXZhaWxhYmxlIGBgY3B1YGAgdmFsdWVzOiAxNjM4NCAoMTYgdkNQVSlcbiAqICBUaGlzIG9wdGlvbiByZXF1aXJlcyBMaW51eCBwbGF0Zm9ybSBgYDEuNC4wYGAgb3IgbGF0ZXIuXG4gKi9cbk1lbW9yeT86IHN0cmluZ1xuLyoqXG4gKiBBbiBhcnJheSBvZiBwbGFjZW1lbnQgY29uc3RyYWludCBvYmplY3RzIHRvIHVzZSBmb3IgdGFza3MuXG4gKiAgIFRoaXMgcGFyYW1ldGVyIGlzbid0IHN1cHBvcnRlZCBmb3IgdGFza3MgcnVuIG9uIEZBUkdBVEVsb25nLlxuICovXG5QbGFjZW1lbnRDb25zdHJhaW50cz86IFRhc2tEZWZpbml0aW9uUGxhY2VtZW50Q29uc3RyYWludFtdXG4vKipcbiAqIFRoZSBudW1iZXIgb2YgYGBjcHVgYCB1bml0cyB1c2VkIGJ5IHRoZSB0YXNrLiBJZiB5b3UgdXNlIHRoZSBFQzIgbGF1bmNoIHR5cGUsIHRoaXMgZmllbGQgaXMgb3B0aW9uYWwuIEFueSB2YWx1ZSBjYW4gYmUgdXNlZC4gSWYgeW91IHVzZSB0aGUgRmFyZ2F0ZSBsYXVuY2ggdHlwZSwgdGhpcyBmaWVsZCBpcyByZXF1aXJlZC4gWW91IG11c3QgdXNlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcy4gVGhlIHZhbHVlIHRoYXQgeW91IGNob29zZSBkZXRlcm1pbmVzIHlvdXIgcmFuZ2Ugb2YgdmFsaWQgdmFsdWVzIGZvciB0aGUgYGBtZW1vcnlgYCBwYXJhbWV0ZXIuXG4gKiAgSWYgeW91IHVzZSB0aGUgRUMyIGxhdW5jaCB0eXBlLCB0aGlzIGZpZWxkIGlzIG9wdGlvbmFsLiBTdXBwb3J0ZWQgdmFsdWVzIGFyZSBiZXR3ZWVuIGBgMTI4YGAgQ1BVIHVuaXRzIChgYDAuMTI1YGAgdkNQVXMpIGFuZCBgYDEwMjQwYGAgQ1BVIHVuaXRzIChgYDEwYGAgdkNQVXMpLlxuICogIFRoZSBDUFUgdW5pdHMgY2Fubm90IGJlIGxlc3MgdGhhbiAxIHZDUFUgd2hlbiB5b3UgdXNlIFdpbmRvd3MgY29udGFpbmVycyBvbiBGYXJnYXRlLlxuICogICArICAyNTYgKC4yNSB2Q1BVKSAtIEF2YWlsYWJsZSBgYG1lbW9yeWBgIHZhbHVlczogNTEyICgwLjUgR0IpLCAxMDI0ICgxIEdCKSwgMjA0OCAoMiBHQilcbiAqICAgKyAgNTEyICguNSB2Q1BVKSAtIEF2YWlsYWJsZSBgYG1lbW9yeWBgIHZhbHVlczogMTAyNCAoMSBHQiksIDIwNDggKDIgR0IpLCAzMDcyICgzIEdCKSwgNDA5NiAoNCBHQilcbiAqICAgKyAgMTAyNCAoMSB2Q1BVKSAtIEF2YWlsYWJsZSBgYG1lbW9yeWBgIHZhbHVlczogMjA0OCAoMiBHQiksIDMwNzIgKDMgR0IpLCA0MDk2ICg0IEdCKSwgNTEyMCAoNSBHQiksIDYxNDQgKDYgR0IpLCA3MTY4ICg3IEdCKSwgODE5MiAoOCBHQilcbiAqICAgKyAgMjA0OCAoMiB2Q1BVKSAtIEF2YWlsYWJsZSBgYG1lbW9yeWBgIHZhbHVlczogNDA5NiAoNCBHQikgYW5kIDE2Mzg0ICgxNiBHQikgaW4gaW5jcmVtZW50cyBvZiAxMDI0ICgxIEdCKVxuICogICArICA0MDk2ICg0IHZDUFUpIC0gQXZhaWxhYmxlIGBgbWVtb3J5YGAgdmFsdWVzOiA4MTkyICg4IEdCKSBhbmQgMzA3MjAgKDMwIEdCKSBpbiBpbmNyZW1lbnRzIG9mIDEwMjQgKDEgR0IpXG4gKiAgICsgIDgxOTIgKDggdkNQVSkgLSBBdmFpbGFibGUgYGBtZW1vcnlgYCB2YWx1ZXM6IDE2IEdCIGFuZCA2MCBHQiBpbiA0IEdCIGluY3JlbWVudHNcbiAqICBUaGlzIG9wdGlvbiByZXF1aXJlcyBMaW51eCBwbGF0Zm9ybSBgYDEuNC4wYGAgb3IgbGF0ZXIuXG4gKiAgICsgIDE2Mzg0ICgxNnZDUFUpIC0gQXZhaWxhYmxlIGBgbWVtb3J5YGAgdmFsdWVzOiAzMkdCIGFuZCAxMjAgR0IgaW4gOCBHQiBpbmNyZW1lbnRzXG4gKiAgVGhpcyBvcHRpb24gcmVxdWlyZXMgTGludXggcGxhdGZvcm0gYGAxLjQuMGBgIG9yIGxhdGVyLlxuICovXG5DcHU/OiBzdHJpbmdcbi8qKlxuICogVGhlIHRhc2sgbGF1bmNoIHR5cGVzIHRoZSB0YXNrIGRlZmluaXRpb24gd2FzIHZhbGlkYXRlZCBhZ2FpbnN0LiBUaGUgdmFsaWQgdmFsdWVzIGFyZSBgYEVDMmBgLCBgYEZBUkdBVEVgYCwgYW5kIGBgRVhURVJOQUxgYC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQW1hem9uIEVDUyBsYXVuY2ggdHlwZXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2xhdW5jaF90eXBlcy5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKi9cblJlcXVpcmVzQ29tcGF0aWJpbGl0aWVzPzogc3RyaW5nW11cbi8qKlxuICogVGhlIERvY2tlciBuZXR3b3JraW5nIG1vZGUgdG8gdXNlIGZvciB0aGUgY29udGFpbmVycyBpbiB0aGUgdGFzay4gVGhlIHZhbGlkIHZhbHVlcyBhcmUgYGBub25lYGAsIGBgYnJpZGdlYGAsIGBgYXdzdnBjYGAsIGFuZCBgYGhvc3RgYC4gSWYgbm8gbmV0d29yayBtb2RlIGlzIHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgaXMgYGBicmlkZ2VgYC5cbiAqICBGb3IgQW1hem9uIEVDUyB0YXNrcyBvbiBGYXJnYXRlLCB0aGUgYGBhd3N2cGNgYCBuZXR3b3JrIG1vZGUgaXMgcmVxdWlyZWQuIEZvciBBbWF6b24gRUNTIHRhc2tzIG9uIEFtYXpvbiBFQzIgTGludXggaW5zdGFuY2VzLCBhbnkgbmV0d29yayBtb2RlIGNhbiBiZSB1c2VkLiBGb3IgQW1hem9uIEVDUyB0YXNrcyBvbiBBbWF6b24gRUMyIFdpbmRvd3MgaW5zdGFuY2VzLCBgYDxkZWZhdWx0PmBgIG9yIGBgYXdzdnBjYGAgY2FuIGJlIHVzZWQuIElmIHRoZSBuZXR3b3JrIG1vZGUgaXMgc2V0IHRvIGBgbm9uZWBgLCB5b3UgY2Fubm90IHNwZWNpZnkgcG9ydCBtYXBwaW5ncyBpbiB5b3VyIGNvbnRhaW5lciBkZWZpbml0aW9ucywgYW5kIHRoZSB0YXNrcyBjb250YWluZXJzIGRvIG5vdCBoYXZlIGV4dGVybmFsIGNvbm5lY3Rpdml0eS4gVGhlIGBgaG9zdGBgIGFuZCBgYGF3c3ZwY2BgIG5ldHdvcmsgbW9kZXMgb2ZmZXIgdGhlIGhpZ2hlc3QgbmV0d29ya2luZyBwZXJmb3JtYW5jZSBmb3IgY29udGFpbmVycyBiZWNhdXNlIHRoZXkgdXNlIHRoZSBFQzIgbmV0d29yayBzdGFjayBpbnN0ZWFkIG9mIHRoZSB2aXJ0dWFsaXplZCBuZXR3b3JrIHN0YWNrIHByb3ZpZGVkIGJ5IHRoZSBgYGJyaWRnZWBgIG1vZGUuXG4gKiAgV2l0aCB0aGUgYGBob3N0YGAgYW5kIGBgYXdzdnBjYGAgbmV0d29yayBtb2RlcywgZXhwb3NlZCBjb250YWluZXIgcG9ydHMgYXJlIG1hcHBlZCBkaXJlY3RseSB0byB0aGUgY29ycmVzcG9uZGluZyBob3N0IHBvcnQgKGZvciB0aGUgYGBob3N0YGAgbmV0d29yayBtb2RlKSBvciB0aGUgYXR0YWNoZWQgZWxhc3RpYyBuZXR3b3JrIGludGVyZmFjZSBwb3J0IChmb3IgdGhlIGBgYXdzdnBjYGAgbmV0d29yayBtb2RlKSwgc28geW91IGNhbm5vdCB0YWtlIGFkdmFudGFnZSBvZiBkeW5hbWljIGhvc3QgcG9ydCBtYXBwaW5ncy4gXG4gKiAgIFdoZW4gdXNpbmcgdGhlIGBgaG9zdGBgIG5ldHdvcmsgbW9kZSwgeW91IHNob3VsZCBub3QgcnVuIGNvbnRhaW5lcnMgdXNpbmcgdGhlIHJvb3QgdXNlciAoVUlEIDApLiBJdCBpcyBjb25zaWRlcmVkIGJlc3QgcHJhY3RpY2UgdG8gdXNlIGEgbm9uLXJvb3QgdXNlci5cbiAqICAgSWYgdGhlIG5ldHdvcmsgbW9kZSBpcyBgYGF3c3ZwY2BgLCB0aGUgdGFzayBpcyBhbGxvY2F0ZWQgYW4gZWxhc3RpYyBuZXR3b3JrIGludGVyZmFjZSwgYW5kIHlvdSBtdXN0IHNwZWNpZnkgYSBbTmV0d29ya0NvbmZpZ3VyYXRpb25dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTmV0d29ya0NvbmZpZ3VyYXRpb24uaHRtbCkgdmFsdWUgd2hlbiB5b3UgY3JlYXRlIGEgc2VydmljZSBvciBydW4gYSB0YXNrIHdpdGggdGhlIHRhc2sgZGVmaW5pdGlvbi4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbVGFzayBOZXR3b3JraW5nXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS90YXNrLW5ldHdvcmtpbmcuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICogIElmIHRoZSBuZXR3b3JrIG1vZGUgaXMgYGBob3N0YGAsIHlvdSBjYW5ub3QgcnVuIG11bHRpcGxlIGluc3RhbnRpYXRpb25zIG9mIHRoZSBzYW1lIHRhc2sgb24gYSBzaW5nbGUgY29udGFpbmVyIGluc3RhbmNlIHdoZW4gcG9ydCBtYXBwaW5ncyBhcmUgdXNlZC5cbiAqL1xuTmV0d29ya01vZGU/OiBzdHJpbmdcbi8qKlxuICogVGhlIHByb2Nlc3MgbmFtZXNwYWNlIHRvIHVzZSBmb3IgdGhlIGNvbnRhaW5lcnMgaW4gdGhlIHRhc2suIFRoZSB2YWxpZCB2YWx1ZXMgYXJlIGBgaG9zdGBgIG9yIGBgdGFza2BgLiBPbiBGYXJnYXRlIGZvciBMaW51eCBjb250YWluZXJzLCB0aGUgb25seSB2YWxpZCB2YWx1ZSBpcyBgYHRhc2tgYC4gRm9yIGV4YW1wbGUsIG1vbml0b3Jpbmcgc2lkZWNhcnMgbWlnaHQgbmVlZCBgYHBpZE1vZGVgYCB0byBhY2Nlc3MgaW5mb3JtYXRpb24gYWJvdXQgb3RoZXIgY29udGFpbmVycyBydW5uaW5nIGluIHRoZSBzYW1lIHRhc2suXG4gKiAgSWYgYGBob3N0YGAgaXMgc3BlY2lmaWVkLCBhbGwgY29udGFpbmVycyB3aXRoaW4gdGhlIHRhc2tzIHRoYXQgc3BlY2lmaWVkIHRoZSBgYGhvc3RgYCBQSUQgbW9kZSBvbiB0aGUgc2FtZSBjb250YWluZXIgaW5zdGFuY2Ugc2hhcmUgdGhlIHNhbWUgcHJvY2VzcyBuYW1lc3BhY2Ugd2l0aCB0aGUgaG9zdCBBbWF6b24gRUMyIGluc3RhbmNlLlxuICogIElmIGBgdGFza2BgIGlzIHNwZWNpZmllZCwgYWxsIGNvbnRhaW5lcnMgd2l0aGluIHRoZSBzcGVjaWZpZWQgdGFzayBzaGFyZSB0aGUgc2FtZSBwcm9jZXNzIG5hbWVzcGFjZS5cbiAqICBJZiBubyB2YWx1ZSBpcyBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IGlzIGEgcHJpdmF0ZSBuYW1lc3BhY2UgZm9yIGVhY2ggY29udGFpbmVyLlxuICogIElmIHRoZSBgYGhvc3RgYCBQSUQgbW9kZSBpcyB1c2VkLCB0aGVyZSdzIGEgaGVpZ2h0ZW5lZCByaXNrIG9mIHVuZGVzaXJlZCBwcm9jZXNzIG5hbWVzcGFjZSBleHBvc3VyZS5cbiAqICAgVGhpcyBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZCBmb3IgV2luZG93cyBjb250YWluZXJzLlxuICogICAgVGhpcyBwYXJhbWV0ZXIgaXMgb25seSBzdXBwb3J0ZWQgZm9yIHRhc2tzIHRoYXQgYXJlIGhvc3RlZCBvbiBGQVJHQVRFbG9uZyBpZiB0aGUgdGFza3MgYXJlIHVzaW5nIHBsYXRmb3JtIHZlcnNpb24gYGAxLjQuMGBgIG9yIGxhdGVyIChMaW51eCkuIFRoaXMgaXNuJ3Qgc3VwcG9ydGVkIGZvciBXaW5kb3dzIGNvbnRhaW5lcnMgb24gRmFyZ2F0ZS5cbiAqL1xuUGlkTW9kZT86IHN0cmluZ1xuLyoqXG4gKiBFbmFibGVzIGZhdWx0IGluamVjdGlvbiBhbmQgYWxsb3dzIGZvciBmYXVsdCBpbmplY3Rpb24gcmVxdWVzdHMgdG8gYmUgYWNjZXB0ZWQgZnJvbSB0aGUgdGFzaydzIGNvbnRhaW5lcnMuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBgZmFsc2VgYC5cbiAqL1xuRW5hYmxlRmF1bHRJbmplY3Rpb24/OiBib29sZWFuXG4vKipcbiAqIFRoZSBBbWF6b24gUmVzb3VyY2UgTmFtZSAoQVJOKSBvZiB0aGUgdGFzayBleGVjdXRpb24gcm9sZSB0aGF0IGdyYW50cyB0aGUgQW1hem9uIEVDUyBjb250YWluZXIgYWdlbnQgcGVybWlzc2lvbiB0byBtYWtlIEFXUyBBUEkgY2FsbHMgb24geW91ciBiZWhhbGYuIEZvciBpbmZvcm1hdGlvbmFib3V0IHRoZSByZXF1aXJlZCBJQU0gcm9sZXMgZm9yIEFtYXpvbiBFQ1MsIHNlZSBbSUFNIHJvbGVzIGZvciBBbWF6b24gRUNTXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9zZWN1cml0eS1lY3MtaWFtLXJvbGUtb3ZlcnZpZXcuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5FeGVjdXRpb25Sb2xlQXJuPzogc3RyaW5nXG5SdW50aW1lUGxhdGZvcm0/OiBSdW50aW1lUGxhdGZvcm1cblByb3h5Q29uZmlndXJhdGlvbj86IFByb3h5Q29uZmlndXJhdGlvblxuLyoqXG4gKiBUaGUgbGlzdCBvZiBkYXRhIHZvbHVtZSBkZWZpbml0aW9ucyBmb3IgdGhlIHRhc2suIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1VzaW5nIGRhdGEgdm9sdW1lcyBpbiB0YXNrc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvdXNpbmdfZGF0YV92b2x1bWVzLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICAgVGhlIGBgaG9zdGBgIGFuZCBgYHNvdXJjZVBhdGhgYCBwYXJhbWV0ZXJzIGFyZW4ndCBzdXBwb3J0ZWQgZm9yIHRhc2tzIHJ1biBvbiBGQVJHQVRFbG9uZy5cbiAqL1xuVm9sdW1lcz86IFZvbHVtZVtdXG4vKipcbiAqIEEgbGlzdCBvZiBjb250YWluZXIgZGVmaW5pdGlvbnMgaW4gSlNPTiBmb3JtYXQgdGhhdCBkZXNjcmliZSB0aGUgZGlmZmVyZW50IGNvbnRhaW5lcnMgdGhhdCBtYWtlIHVwIHlvdXIgdGFzay4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgY29udGFpbmVyIGRlZmluaXRpb24gcGFyYW1ldGVycyBhbmQgZGVmYXVsdHMsIHNlZSBbQW1hem9uIEVDUyBUYXNrIERlZmluaXRpb25zXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS90YXNrX2RlZmludGlvbnMuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5Db250YWluZXJEZWZpbml0aW9ucz86IENvbnRhaW5lckRlZmluaXRpb25bXVxuLyoqXG4gKiBUaGUgbmFtZSBvZiBhIGZhbWlseSB0aGF0IHRoaXMgdGFzayBkZWZpbml0aW9uIGlzIHJlZ2lzdGVyZWQgdG8uIFVwIHRvIDI1NSBsZXR0ZXJzICh1cHBlcmNhc2UgYW5kIGxvd2VyY2FzZSksIG51bWJlcnMsIGh5cGhlbnMsIGFuZCB1bmRlcnNjb3JlcyBhcmUgYWxsb3dlZC5cbiAqICBBIGZhbWlseSBncm91cHMgbXVsdGlwbGUgdmVyc2lvbnMgb2YgYSB0YXNrIGRlZmluaXRpb24uIEFtYXpvbiBFQ1MgZ2l2ZXMgdGhlIGZpcnN0IHRhc2sgZGVmaW5pdGlvbiB0aGF0IHlvdSByZWdpc3RlcmVkIHRvIGEgZmFtaWx5IGEgcmV2aXNpb24gbnVtYmVyIG9mIDEuIEFtYXpvbiBFQ1MgZ2l2ZXMgc2VxdWVudGlhbCByZXZpc2lvbiBudW1iZXJzIHRvIGVhY2ggdGFzayBkZWZpbml0aW9uIHRoYXQgeW91IGFkZC5cbiAqICAgVG8gdXNlIHJldmlzaW9uIG51bWJlcnMgd2hlbiB5b3UgdXBkYXRlIGEgdGFzayBkZWZpbml0aW9uLCBzcGVjaWZ5IHRoaXMgcHJvcGVydHkuIElmIHlvdSBkb24ndCBzcGVjaWZ5IGEgdmFsdWUsIENGTmxvbmcgZ2VuZXJhdGVzIGEgbmV3IHRhc2sgZGVmaW5pdGlvbiBlYWNoIHRpbWUgdGhhdCB5b3UgdXBkYXRlIGl0LlxuICovXG5GYW1pbHk/OiBzdHJpbmdcbkVwaGVtZXJhbFN0b3JhZ2U/OiBFcGhlbWVyYWxTdG9yYWdlXG4vKipcbiAqIFRoZSBtZXRhZGF0YSB0aGF0IHlvdSBhcHBseSB0byB0aGUgdGFzayBkZWZpbml0aW9uIHRvIGhlbHAgeW91IGNhdGVnb3JpemUgYW5kIG9yZ2FuaXplIHRoZW0uIEVhY2ggdGFnIGNvbnNpc3RzIG9mIGEga2V5IGFuZCBhbiBvcHRpb25hbCB2YWx1ZS4gWW91IGRlZmluZSBib3RoIG9mIHRoZW0uXG4gKiAgVGhlIGZvbGxvd2luZyBiYXNpYyByZXN0cmljdGlvbnMgYXBwbHkgdG8gdGFnczpcbiAqICAgKyAgTWF4aW11bSBudW1iZXIgb2YgdGFncyBwZXIgcmVzb3VyY2UgLSA1MFxuICogICArICBGb3IgZWFjaCByZXNvdXJjZSwgZWFjaCB0YWcga2V5IG11c3QgYmUgdW5pcXVlLCBhbmQgZWFjaCB0YWcga2V5IGNhbiBoYXZlIG9ubHkgb25lIHZhbHVlLlxuICogICArICBNYXhpbXVtIGtleSBsZW5ndGggLSAxMjggVW5pY29kZSBjaGFyYWN0ZXJzIGluIFVURi04XG4gKiAgICsgIE1heGltdW0gdmFsdWUgbGVuZ3RoIC0gMjU2IFVuaWNvZGUgY2hhcmFjdGVycyBpbiBVVEYtOFxuICogICArICBJZiB5b3VyIHRhZ2dpbmcgc2NoZW1hIGlzIHVzZWQgYWNyb3NzIG11bHRpcGxlIHNlcnZpY2VzIGFuZCByZXNvdXJjZXMsIHJlbWVtYmVyIHRoYXQgb3RoZXIgc2VydmljZXMgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIGFsbG93ZWQgY2hhcmFjdGVycy4gR2VuZXJhbGx5IGFsbG93ZWQgY2hhcmFjdGVycyBhcmU6IGxldHRlcnMsIG51bWJlcnMsIGFuZCBzcGFjZXMgcmVwcmVzZW50YWJsZSBpbiBVVEYtOCwgYW5kIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyczogKyAtID0gLiBfIDogLyBALlxuICogICArICBUYWcga2V5cyBhbmQgdmFsdWVzIGFyZSBjYXNlLXNlbnNpdGl2ZS5cbiAqICAgKyAgRG8gbm90IHVzZSBgYGF3czpgYCwgYGBBV1M6YGAsIG9yIGFueSB1cHBlciBvciBsb3dlcmNhc2UgY29tYmluYXRpb24gb2Ygc3VjaCBhcyBhIHByZWZpeCBmb3IgZWl0aGVyIGtleXMgb3IgdmFsdWVzIGFzIGl0IGlzIHJlc2VydmVkIGZvciBBV1MgdXNlLiBZb3UgY2Fubm90IGVkaXQgb3IgZGVsZXRlIHRhZyBrZXlzIG9yIHZhbHVlcyB3aXRoIHRoaXMgcHJlZml4LiBUYWdzIHdpdGggdGhpcyBwcmVmaXggZG8gbm90IGNvdW50IGFnYWluc3QgeW91ciB0YWdzIHBlciByZXNvdXJjZSBsaW1pdC5cbiAqL1xuVGFncz86IFRhZ1tdXG5UYXNrRGVmaW5pdGlvbkFybj86IHN0cmluZ1xufVxuLyoqXG4gKiBEZXRhaWxzIG9uIGFuIEVsYXN0aWMgSW5mZXJlbmNlIGFjY2VsZXJhdG9yLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtXb3JraW5nIHdpdGggQW1hem9uIEVsYXN0aWMgSW5mZXJlbmNlIG9uIEFtYXpvbiBFQ1NdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2Vjcy1pbmZlcmVuY2UuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluZmVyZW5jZUFjY2VsZXJhdG9yIHtcbi8qKlxuICogVGhlIEVsYXN0aWMgSW5mZXJlbmNlIGFjY2VsZXJhdG9yIHR5cGUgdG8gdXNlLlxuICovXG5EZXZpY2VUeXBlPzogc3RyaW5nXG4vKipcbiAqIFRoZSBFbGFzdGljIEluZmVyZW5jZSBhY2NlbGVyYXRvciBkZXZpY2UgbmFtZS4gVGhlIGBgZGV2aWNlTmFtZWBgIG11c3QgYWxzbyBiZSByZWZlcmVuY2VkIGluIGEgY29udGFpbmVyIGRlZmluaXRpb24gYXMgYSBbUmVzb3VyY2VSZXF1aXJlbWVudF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9SZXNvdXJjZVJlcXVpcmVtZW50Lmh0bWwpLlxuICovXG5EZXZpY2VOYW1lPzogc3RyaW5nXG59XG4vKipcbiAqIFRoZSBjb25zdHJhaW50IG9uIHRhc2sgcGxhY2VtZW50IGluIHRoZSB0YXNrIGRlZmluaXRpb24uIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1Rhc2sgcGxhY2VtZW50IGNvbnN0cmFpbnRzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS90YXNrLXBsYWNlbWVudC1jb25zdHJhaW50cy5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKiAgIFRhc2sgcGxhY2VtZW50IGNvbnN0cmFpbnRzIGFyZW4ndCBzdXBwb3J0ZWQgZm9yIHRhc2tzIHJ1biBvbiBGQVJHQVRFbG9uZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYXNrRGVmaW5pdGlvblBsYWNlbWVudENvbnN0cmFpbnQge1xuLyoqXG4gKiBUaGUgdHlwZSBvZiBjb25zdHJhaW50LiBUaGUgYGBNZW1iZXJPZmBgIGNvbnN0cmFpbnQgcmVzdHJpY3RzIHNlbGVjdGlvbiB0byBiZSBmcm9tIGEgZ3JvdXAgb2YgdmFsaWQgY2FuZGlkYXRlcy5cbiAqL1xuVHlwZTogc3RyaW5nXG4vKipcbiAqIEEgY2x1c3RlciBxdWVyeSBsYW5ndWFnZSBleHByZXNzaW9uIHRvIGFwcGx5IHRvIHRoZSBjb25zdHJhaW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtDbHVzdGVyIHF1ZXJ5IGxhbmd1YWdlXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9jbHVzdGVyLXF1ZXJ5LWxhbmd1YWdlLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuRXhwcmVzc2lvbj86IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgb3BlcmF0aW5nIHN5c3RlbSB0aGF0IHlvdXIgdGFza3MgZGVmaW5pdGlvbnMgcnVuIG9uLiBBIHBsYXRmb3JtIGZhbWlseSBpcyBzcGVjaWZpZWQgb25seSBmb3IgdGFza3MgdXNpbmcgdGhlIEZhcmdhdGUgbGF1bmNoIHR5cGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVudGltZVBsYXRmb3JtIHtcbi8qKlxuICogVGhlIG9wZXJhdGluZyBzeXN0ZW0uXG4gKi9cbk9wZXJhdGluZ1N5c3RlbUZhbWlseT86IHN0cmluZ1xuLyoqXG4gKiBUaGUgQ1BVIGFyY2hpdGVjdHVyZS5cbiAqICBZb3UgY2FuIHJ1biB5b3VyIExpbnV4IHRhc2tzIG9uIGFuIEFSTS1iYXNlZCBwbGF0Zm9ybSBieSBzZXR0aW5nIHRoZSB2YWx1ZSB0byBgYEFSTTY0YGAuIFRoaXMgb3B0aW9uIGlzIGF2YWlsYWJsZSBmb3IgdGFza3MgdGhhdCBydW4gb24gTGludXggQW1hem9uIEVDMiBpbnN0YW5jZSBvciBMaW51eCBjb250YWluZXJzIG9uIEZhcmdhdGUuXG4gKi9cbkNwdUFyY2hpdGVjdHVyZT86IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgY29uZmlndXJhdGlvbiBkZXRhaWxzIGZvciB0aGUgQXBwIE1lc2ggcHJveHkuXG4gKiAgWW91ciBBbWF6b24gRUNTIGNvbnRhaW5lciBpbnN0YW5jZXMgcmVxdWlyZSBhdCBsZWFzdCB2ZXJzaW9uIDEuMjYuMCBvZiB0aGUgY29udGFpbmVyIGFnZW50IGFuZCBhdCBsZWFzdCB2ZXJzaW9uIDEuMjYuMC0xIG9mIHRoZSBgYGVjcy1pbml0YGAgcGFja2FnZSB0byB1c2UgYSBwcm94eSBjb25maWd1cmF0aW9uLiBJZiB5b3VyIGNvbnRhaW5lciBpbnN0YW5jZXMgYXJlIGxhdW5jaGVkIGZyb20gdGhlIEFtYXpvbiBFQ1Mgb3B0aW1pemVkIEFNSSB2ZXJzaW9uIGBgMjAxOTAzMDFgYCBvciBsYXRlciwgdGhleSBjb250YWluIHRoZSByZXF1aXJlZCB2ZXJzaW9ucyBvZiB0aGUgY29udGFpbmVyIGFnZW50IGFuZCBgYGVjcy1pbml0YGAuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0FtYXpvbiBFQ1Mtb3B0aW1pemVkIExpbnV4IEFNSV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvZWNzLW9wdGltaXplZF9BTUkuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb3h5Q29uZmlndXJhdGlvbiB7XG4vKipcbiAqIFRoZSBzZXQgb2YgbmV0d29yayBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgdG8gcHJvdmlkZSB0aGUgQ29udGFpbmVyIE5ldHdvcmsgSW50ZXJmYWNlIChDTkkpIHBsdWdpbiwgc3BlY2lmaWVkIGFzIGtleS12YWx1ZSBwYWlycy5cbiAqICAgKyAgIGBgSWdub3JlZFVJRGBgIC0gKFJlcXVpcmVkKSBUaGUgdXNlciBJRCAoVUlEKSBvZiB0aGUgcHJveHkgY29udGFpbmVyIGFzIGRlZmluZWQgYnkgdGhlIGBgdXNlcmBgIHBhcmFtZXRlciBpbiBhIGNvbnRhaW5lciBkZWZpbml0aW9uLiBUaGlzIGlzIHVzZWQgdG8gZW5zdXJlIHRoZSBwcm94eSBpZ25vcmVzIGl0cyBvd24gdHJhZmZpYy4gSWYgYGBJZ25vcmVkR0lEYGAgaXMgc3BlY2lmaWVkLCB0aGlzIGZpZWxkIGNhbiBiZSBlbXB0eS5cbiAqICAgKyAgIGBgSWdub3JlZEdJRGBgIC0gKFJlcXVpcmVkKSBUaGUgZ3JvdXAgSUQgKEdJRCkgb2YgdGhlIHByb3h5IGNvbnRhaW5lciBhcyBkZWZpbmVkIGJ5IHRoZSBgYHVzZXJgYCBwYXJhbWV0ZXIgaW4gYSBjb250YWluZXIgZGVmaW5pdGlvbi4gVGhpcyBpcyB1c2VkIHRvIGVuc3VyZSB0aGUgcHJveHkgaWdub3JlcyBpdHMgb3duIHRyYWZmaWMuIElmIGBgSWdub3JlZFVJRGBgIGlzIHNwZWNpZmllZCwgdGhpcyBmaWVsZCBjYW4gYmUgZW1wdHkuXG4gKiAgICsgICBgYEFwcFBvcnRzYGAgLSAoUmVxdWlyZWQpIFRoZSBsaXN0IG9mIHBvcnRzIHRoYXQgdGhlIGFwcGxpY2F0aW9uIHVzZXMuIE5ldHdvcmsgdHJhZmZpYyB0byB0aGVzZSBwb3J0cyBpcyBmb3J3YXJkZWQgdG8gdGhlIGBgUHJveHlJbmdyZXNzUG9ydGBgIGFuZCBgYFByb3h5RWdyZXNzUG9ydGBgLlxuICogICArICAgYGBQcm94eUluZ3Jlc3NQb3J0YGAgLSAoUmVxdWlyZWQpIFNwZWNpZmllcyB0aGUgcG9ydCB0aGF0IGluY29taW5nIHRyYWZmaWMgdG8gdGhlIGBgQXBwUG9ydHNgYCBpcyBkaXJlY3RlZCB0by5cbiAqICAgKyAgIGBgUHJveHlFZ3Jlc3NQb3J0YGAgLSAoUmVxdWlyZWQpIFNwZWNpZmllcyB0aGUgcG9ydCB0aGF0IG91dGdvaW5nIHRyYWZmaWMgZnJvbSB0aGUgYGBBcHBQb3J0c2BgIGlzIGRpcmVjdGVkIHRvLlxuICogICArICAgYGBFZ3Jlc3NJZ25vcmVkUG9ydHNgYCAtIChSZXF1aXJlZCkgVGhlIGVncmVzcyB0cmFmZmljIGdvaW5nIHRvIHRoZSBzcGVjaWZpZWQgcG9ydHMgaXMgaWdub3JlZCBhbmQgbm90IHJlZGlyZWN0ZWQgdG8gdGhlIGBgUHJveHlFZ3Jlc3NQb3J0YGAuIEl0IGNhbiBiZSBhbiBlbXB0eSBsaXN0LlxuICogICArICAgYGBFZ3Jlc3NJZ25vcmVkSVBzYGAgLSAoUmVxdWlyZWQpIFRoZSBlZ3Jlc3MgdHJhZmZpYyBnb2luZyB0byB0aGUgc3BlY2lmaWVkIElQIGFkZHJlc3NlcyBpcyBpZ25vcmVkIGFuZCBub3QgcmVkaXJlY3RlZCB0byB0aGUgYGBQcm94eUVncmVzc1BvcnRgYC4gSXQgY2FuIGJlIGFuIGVtcHR5IGxpc3QuXG4gKi9cblByb3h5Q29uZmlndXJhdGlvblByb3BlcnRpZXM/OiBLZXlWYWx1ZVBhaXJbXVxuLyoqXG4gKiBUaGUgcHJveHkgdHlwZS4gVGhlIG9ubHkgc3VwcG9ydGVkIHZhbHVlIGlzIGBgQVBQTUVTSGBgLlxuICovXG5UeXBlPzogc3RyaW5nXG4vKipcbiAqIFRoZSBuYW1lIG9mIHRoZSBjb250YWluZXIgdGhhdCB3aWxsIHNlcnZlIGFzIHRoZSBBcHAgTWVzaCBwcm94eS5cbiAqL1xuQ29udGFpbmVyTmFtZTogc3RyaW5nXG59XG4vKipcbiAqIEEga2V5LXZhbHVlIHBhaXIgb2JqZWN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEtleVZhbHVlUGFpciB7XG4vKipcbiAqIFRoZSB2YWx1ZSBvZiB0aGUga2V5LXZhbHVlIHBhaXIuIEZvciBlbnZpcm9ubWVudCB2YXJpYWJsZXMsIHRoaXMgaXMgdGhlIHZhbHVlIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAqL1xuVmFsdWU/OiBzdHJpbmdcbi8qKlxuICogVGhlIG5hbWUgb2YgdGhlIGtleS12YWx1ZSBwYWlyLiBGb3IgZW52aXJvbm1lbnQgdmFyaWFibGVzLCB0aGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAqL1xuTmFtZT86IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgZGF0YSB2b2x1bWUgY29uZmlndXJhdGlvbiBmb3IgdGFza3MgbGF1bmNoZWQgdXNpbmcgdGhpcyB0YXNrIGRlZmluaXRpb24uIFNwZWNpZnlpbmcgYSB2b2x1bWUgY29uZmlndXJhdGlvbiBpbiBhIHRhc2sgZGVmaW5pdGlvbiBpcyBvcHRpb25hbC4gVGhlIHZvbHVtZSBjb25maWd1cmF0aW9uIG1heSBjb250YWluIG11bHRpcGxlIHZvbHVtZXMgYnV0IG9ubHkgb25lIHZvbHVtZSBjb25maWd1cmVkIGF0IGxhdW5jaCBpcyBzdXBwb3J0ZWQuIEVhY2ggdm9sdW1lIGRlZmluZWQgaW4gdGhlIHZvbHVtZSBjb25maWd1cmF0aW9uIG1heSBvbmx5IHNwZWNpZnkgYSBgYG5hbWVgYCBhbmQgb25lIG9mIGVpdGhlciBgYGNvbmZpZ3VyZWRBdExhdW5jaGBgLCBgYGRvY2tlclZvbHVtZUNvbmZpZ3VyYXRpb25gYCwgYGBlZnNWb2x1bWVDb25maWd1cmF0aW9uYGAsIGBgZnN4V2luZG93c0ZpbGVTZXJ2ZXJWb2x1bWVDb25maWd1cmF0aW9uYGAsIG9yIGBgaG9zdGBgLiBJZiBhbiBlbXB0eSB2b2x1bWUgY29uZmlndXJhdGlvbiBpcyBzcGVjaWZpZWQsIGJ5IGRlZmF1bHQgQW1hem9uIEVDUyB1c2VzIGEgaG9zdCB2b2x1bWUuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1VzaW5nIGRhdGEgdm9sdW1lcyBpbiB0YXNrc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvdXNpbmdfZGF0YV92b2x1bWVzLmh0bWwpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZvbHVtZSB7XG5FRlNWb2x1bWVDb25maWd1cmF0aW9uPzogRUZTVm9sdW1lQ29uZmlndXJhdGlvblxuSG9zdD86IEhvc3RWb2x1bWVQcm9wZXJ0aWVzXG4vKipcbiAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSB2b2x1bWUgc2hvdWxkIGJlIGNvbmZpZ3VyZWQgYXQgbGF1bmNoIHRpbWUuIFRoaXMgaXMgdXNlZCB0byBjcmVhdGUgQW1hem9uIEVCUyB2b2x1bWVzIGZvciBzdGFuZGFsb25lIHRhc2tzIG9yIHRhc2tzIGNyZWF0ZWQgYXMgcGFydCBvZiBhIHNlcnZpY2UuIEVhY2ggdGFzayBkZWZpbml0aW9uIHJldmlzaW9uIG1heSBvbmx5IGhhdmUgb25lIHZvbHVtZSBjb25maWd1cmVkIGF0IGxhdW5jaCBpbiB0aGUgdm9sdW1lIGNvbmZpZ3VyYXRpb24uXG4gKiAgVG8gY29uZmlndXJlIGEgdm9sdW1lIGF0IGxhdW5jaCB0aW1lLCB1c2UgdGhpcyB0YXNrIGRlZmluaXRpb24gcmV2aXNpb24gYW5kIHNwZWNpZnkgYSBgYHZvbHVtZUNvbmZpZ3VyYXRpb25zYGAgb2JqZWN0IHdoZW4gY2FsbGluZyB0aGUgYGBDcmVhdGVTZXJ2aWNlYGAsIGBgVXBkYXRlU2VydmljZWBgLCBgYFJ1blRhc2tgYCBvciBgYFN0YXJ0VGFza2BgIEFQSXMuXG4gKi9cbkNvbmZpZ3VyZWRBdExhdW5jaD86IGJvb2xlYW5cbkRvY2tlclZvbHVtZUNvbmZpZ3VyYXRpb24/OiBEb2NrZXJWb2x1bWVDb25maWd1cmF0aW9uXG5GU3hXaW5kb3dzRmlsZVNlcnZlclZvbHVtZUNvbmZpZ3VyYXRpb24/OiBGU3hXaW5kb3dzRmlsZVNlcnZlclZvbHVtZUNvbmZpZ3VyYXRpb25cbi8qKlxuICogVGhlIG5hbWUgb2YgdGhlIHZvbHVtZS4gVXAgdG8gMjU1IGxldHRlcnMgKHVwcGVyY2FzZSBhbmQgbG93ZXJjYXNlKSwgbnVtYmVycywgdW5kZXJzY29yZXMsIGFuZCBoeXBoZW5zIGFyZSBhbGxvd2VkLlxuICogIFdoZW4gdXNpbmcgYSB2b2x1bWUgY29uZmlndXJlZCBhdCBsYXVuY2gsIHRoZSBgYG5hbWVgYCBpcyByZXF1aXJlZCBhbmQgbXVzdCBhbHNvIGJlIHNwZWNpZmllZCBhcyB0aGUgdm9sdW1lIG5hbWUgaW4gdGhlIGBgU2VydmljZVZvbHVtZUNvbmZpZ3VyYXRpb25gYCBvciBgYFRhc2tWb2x1bWVDb25maWd1cmF0aW9uYGAgcGFyYW1ldGVyIHdoZW4gY3JlYXRpbmcgeW91ciBzZXJ2aWNlIG9yIHN0YW5kYWxvbmUgdGFzay5cbiAqICBGb3IgYWxsIG90aGVyIHR5cGVzIG9mIHZvbHVtZXMsIHRoaXMgbmFtZSBpcyByZWZlcmVuY2VkIGluIHRoZSBgYHNvdXJjZVZvbHVtZWBgIHBhcmFtZXRlciBvZiB0aGUgYGBtb3VudFBvaW50c2BgIG9iamVjdCBpbiB0aGUgY29udGFpbmVyIGRlZmluaXRpb24uXG4gKiAgV2hlbiBhIHZvbHVtZSBpcyB1c2luZyB0aGUgYGBlZnNWb2x1bWVDb25maWd1cmF0aW9uYGAsIHRoZSBuYW1lIGlzIHJlcXVpcmVkLlxuICovXG5OYW1lPzogc3RyaW5nXG59XG4vKipcbiAqIFRoaXMgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCB3aGVuIHlvdSB1c2UgYW4gQW1hem9uIEVsYXN0aWMgRmlsZSBTeXN0ZW0gZmlsZSBzeXN0ZW0gZm9yIHRhc2sgc3RvcmFnZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFRlNWb2x1bWVDb25maWd1cmF0aW9uIHtcbi8qKlxuICogVGhlIEFtYXpvbiBFRlMgZmlsZSBzeXN0ZW0gSUQgdG8gdXNlLlxuICovXG5GaWxlc3lzdGVtSWQ6IHN0cmluZ1xuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gdXNlIGVuY3J5cHRpb24gZm9yIEFtYXpvbiBFRlMgZGF0YSBpbiB0cmFuc2l0IGJldHdlZW4gdGhlIEFtYXpvbiBFQ1MgaG9zdCBhbmQgdGhlIEFtYXpvbiBFRlMgc2VydmVyLiBUcmFuc2l0IGVuY3J5cHRpb24gbXVzdCBiZSB0dXJuZWQgb24gaWYgQW1hem9uIEVGUyBJQU0gYXV0aG9yaXphdGlvbiBpcyB1c2VkLiBJZiB0aGlzIHBhcmFtZXRlciBpcyBvbWl0dGVkLCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBgYERJU0FCTEVEYGAgaXMgdXNlZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbRW5jcnlwdGluZyBkYXRhIGluIHRyYW5zaXRdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9lZnMvbGF0ZXN0L3VnL2VuY3J5cHRpb24taW4tdHJhbnNpdC5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIEZpbGUgU3lzdGVtIFVzZXIgR3VpZGUqLlxuICovXG5UcmFuc2l0RW5jcnlwdGlvbj86IChcIkVOQUJMRURcIiB8IFwiRElTQUJMRURcIilcbkF1dGhvcml6YXRpb25Db25maWc/OiBBdXRob3JpemF0aW9uQ29uZmlnXG4vKipcbiAqIFRoZSBkaXJlY3Rvcnkgd2l0aGluIHRoZSBBbWF6b24gRUZTIGZpbGUgc3lzdGVtIHRvIG1vdW50IGFzIHRoZSByb290IGRpcmVjdG9yeSBpbnNpZGUgdGhlIGhvc3QuIElmIHRoaXMgcGFyYW1ldGVyIGlzIG9taXR0ZWQsIHRoZSByb290IG9mIHRoZSBBbWF6b24gRUZTIHZvbHVtZSB3aWxsIGJlIHVzZWQuIFNwZWNpZnlpbmcgYGAvYGAgd2lsbCBoYXZlIHRoZSBzYW1lIGVmZmVjdCBhcyBvbWl0dGluZyB0aGlzIHBhcmFtZXRlci5cbiAqICAgSWYgYW4gRUZTIGFjY2VzcyBwb2ludCBpcyBzcGVjaWZpZWQgaW4gdGhlIGBgYXV0aG9yaXphdGlvbkNvbmZpZ2BgLCB0aGUgcm9vdCBkaXJlY3RvcnkgcGFyYW1ldGVyIG11c3QgZWl0aGVyIGJlIG9taXR0ZWQgb3Igc2V0IHRvIGBgL2BgIHdoaWNoIHdpbGwgZW5mb3JjZSB0aGUgcGF0aCBzZXQgb24gdGhlIEVGUyBhY2Nlc3MgcG9pbnQuXG4gKi9cblJvb3REaXJlY3Rvcnk/OiBzdHJpbmdcbi8qKlxuICogVGhlIHBvcnQgdG8gdXNlIHdoZW4gc2VuZGluZyBlbmNyeXB0ZWQgZGF0YSBiZXR3ZWVuIHRoZSBBbWF6b24gRUNTIGhvc3QgYW5kIHRoZSBBbWF6b24gRUZTIHNlcnZlci4gSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGEgdHJhbnNpdCBlbmNyeXB0aW9uIHBvcnQsIGl0IHdpbGwgdXNlIHRoZSBwb3J0IHNlbGVjdGlvbiBzdHJhdGVneSB0aGF0IHRoZSBBbWF6b24gRUZTIG1vdW50IGhlbHBlciB1c2VzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtFRlMgbW91bnQgaGVscGVyXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZWZzL2xhdGVzdC91Zy9lZnMtbW91bnQtaGVscGVyLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgRmlsZSBTeXN0ZW0gVXNlciBHdWlkZSouXG4gKi9cblRyYW5zaXRFbmNyeXB0aW9uUG9ydD86IG51bWJlclxufVxuLyoqXG4gKiBUaGUgYXV0aG9yaXphdGlvbiBjb25maWd1cmF0aW9uIGRldGFpbHMgZm9yIHRoZSBBbWF6b24gRUZTIGZpbGUgc3lzdGVtLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhvcml6YXRpb25Db25maWcge1xuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gdXNlIHRoZSBBbWF6b24gRUNTIHRhc2sgcm9sZSBkZWZpbmVkIGluIGEgdGFzayBkZWZpbml0aW9uIHdoZW4gbW91bnRpbmcgdGhlIEFtYXpvbiBFRlMgZmlsZSBzeXN0ZW0uIElmIGl0IGlzIHR1cm5lZCBvbiwgdHJhbnNpdCBlbmNyeXB0aW9uIG11c3QgYmUgdHVybmVkIG9uIGluIHRoZSBgYEVGU1ZvbHVtZUNvbmZpZ3VyYXRpb25gYC4gSWYgdGhpcyBwYXJhbWV0ZXIgaXMgb21pdHRlZCwgdGhlIGRlZmF1bHQgdmFsdWUgb2YgYGBESVNBQkxFRGBgIGlzIHVzZWQuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1VzaW5nIEFtYXpvbiBFRlMgYWNjZXNzIHBvaW50c10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvZWZzLXZvbHVtZXMuaHRtbCNlZnMtdm9sdW1lLWFjY2Vzc3BvaW50cykgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5JQU0/OiAoXCJFTkFCTEVEXCIgfCBcIkRJU0FCTEVEXCIpXG4vKipcbiAqIFRoZSBBbWF6b24gRUZTIGFjY2VzcyBwb2ludCBJRCB0byB1c2UuIElmIGFuIGFjY2VzcyBwb2ludCBpcyBzcGVjaWZpZWQsIHRoZSByb290IGRpcmVjdG9yeSB2YWx1ZSBzcGVjaWZpZWQgaW4gdGhlIGBgRUZTVm9sdW1lQ29uZmlndXJhdGlvbmBgIG11c3QgZWl0aGVyIGJlIG9taXR0ZWQgb3Igc2V0IHRvIGBgL2BgIHdoaWNoIHdpbGwgZW5mb3JjZSB0aGUgcGF0aCBzZXQgb24gdGhlIEVGUyBhY2Nlc3MgcG9pbnQuIElmIGFuIGFjY2VzcyBwb2ludCBpcyB1c2VkLCB0cmFuc2l0IGVuY3J5cHRpb24gbXVzdCBiZSBvbiBpbiB0aGUgYGBFRlNWb2x1bWVDb25maWd1cmF0aW9uYGAuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1dvcmtpbmcgd2l0aCBBbWF6b24gRUZTIGFjY2VzcyBwb2ludHNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9lZnMvbGF0ZXN0L3VnL2Vmcy1hY2Nlc3MtcG9pbnRzLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgRmlsZSBTeXN0ZW0gVXNlciBHdWlkZSouXG4gKi9cbkFjY2Vzc1BvaW50SWQ/OiBzdHJpbmdcbn1cbi8qKlxuICogVGhpcyBwYXJhbWV0ZXIgaXMgc3BlY2lmaWVkIHdoZW4geW91IHVzZSBiaW5kIG1vdW50IGhvc3Qgdm9sdW1lcy4gVGhlIGNvbnRlbnRzIG9mIHRoZSBgYGhvc3RgYCBwYXJhbWV0ZXIgZGV0ZXJtaW5lIHdoZXRoZXIgeW91ciBiaW5kIG1vdW50IGhvc3Qgdm9sdW1lIHBlcnNpc3RzIG9uIHRoZSBob3N0IGNvbnRhaW5lciBpbnN0YW5jZSBhbmQgd2hlcmUgaXQncyBzdG9yZWQuIElmIHRoZSBgYGhvc3RgYCBwYXJhbWV0ZXIgaXMgZW1wdHksIHRoZW4gdGhlIERvY2tlciBkYWVtb24gYXNzaWducyBhIGhvc3QgcGF0aCBmb3IgeW91ciBkYXRhIHZvbHVtZS4gSG93ZXZlciwgdGhlIGRhdGEgaXNuJ3QgZ3VhcmFudGVlZCB0byBwZXJzaXN0IGFmdGVyIHRoZSBjb250YWluZXJzIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCBpdCBzdG9wIHJ1bm5pbmcuXG4gKiAgV2luZG93cyBjb250YWluZXJzIGNhbiBtb3VudCB3aG9sZSBkaXJlY3RvcmllcyBvbiB0aGUgc2FtZSBkcml2ZSBhcyBgYCRlbnY6UHJvZ3JhbURhdGFgYC4gV2luZG93cyBjb250YWluZXJzIGNhbid0IG1vdW50IGRpcmVjdG9yaWVzIG9uIGEgZGlmZmVyZW50IGRyaXZlLCBhbmQgbW91bnQgcG9pbnQgY2FuJ3QgYmUgYWNyb3NzIGRyaXZlcy4gRm9yIGV4YW1wbGUsIHlvdSBjYW4gbW91bnQgYGBDOlxcbXlcXHBhdGg6QzpcXG15XFxwYXRoYGAgYW5kIGBgRDpcXDpEOlxcYGAsIGJ1dCBub3QgYGBEOlxcbXlcXHBhdGg6QzpcXG15XFxwYXRoYGAgb3IgYGBEOlxcOkM6XFxteVxccGF0aGBgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhvc3RWb2x1bWVQcm9wZXJ0aWVzIHtcbi8qKlxuICogV2hlbiB0aGUgYGBob3N0YGAgcGFyYW1ldGVyIGlzIHVzZWQsIHNwZWNpZnkgYSBgYHNvdXJjZVBhdGhgYCB0byBkZWNsYXJlIHRoZSBwYXRoIG9uIHRoZSBob3N0IGNvbnRhaW5lciBpbnN0YW5jZSB0aGF0J3MgcHJlc2VudGVkIHRvIHRoZSBjb250YWluZXIuIElmIHRoaXMgcGFyYW1ldGVyIGlzIGVtcHR5LCB0aGVuIHRoZSBEb2NrZXIgZGFlbW9uIGhhcyBhc3NpZ25lZCBhIGhvc3QgcGF0aCBmb3IgeW91LiBJZiB0aGUgYGBob3N0YGAgcGFyYW1ldGVyIGNvbnRhaW5zIGEgYGBzb3VyY2VQYXRoYGAgZmlsZSBsb2NhdGlvbiwgdGhlbiB0aGUgZGF0YSB2b2x1bWUgcGVyc2lzdHMgYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbiBvbiB0aGUgaG9zdCBjb250YWluZXIgaW5zdGFuY2UgdW50aWwgeW91IGRlbGV0ZSBpdCBtYW51YWxseS4gSWYgdGhlIGBgc291cmNlUGF0aGBgIHZhbHVlIGRvZXNuJ3QgZXhpc3Qgb24gdGhlIGhvc3QgY29udGFpbmVyIGluc3RhbmNlLCB0aGUgRG9ja2VyIGRhZW1vbiBjcmVhdGVzIGl0LiBJZiB0aGUgbG9jYXRpb24gZG9lcyBleGlzdCwgdGhlIGNvbnRlbnRzIG9mIHRoZSBzb3VyY2UgcGF0aCBmb2xkZXIgYXJlIGV4cG9ydGVkLlxuICogIElmIHlvdSdyZSB1c2luZyB0aGUgRmFyZ2F0ZSBsYXVuY2ggdHlwZSwgdGhlIGBgc291cmNlUGF0aGBgIHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkLlxuICovXG5Tb3VyY2VQYXRoPzogc3RyaW5nXG59XG4vKipcbiAqIFRoaXMgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCB3aGVuIHlvdSB1c2UgRG9ja2VyIHZvbHVtZXMuXG4gKiAgV2luZG93cyBjb250YWluZXJzIG9ubHkgc3VwcG9ydCB0aGUgdXNlIG9mIHRoZSBgYGxvY2FsYGAgZHJpdmVyLiBUbyB1c2UgYmluZCBtb3VudHMsIHNwZWNpZnkgdGhlIGBgaG9zdGBgIHBhcmFtZXRlciBpbnN0ZWFkLlxuICogICBEb2NrZXIgdm9sdW1lcyBhcmVuJ3Qgc3VwcG9ydGVkIGJ5IHRhc2tzIHJ1biBvbiBGQVJHQVRFbG9uZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb2NrZXJWb2x1bWVDb25maWd1cmF0aW9uIHtcbi8qKlxuICogQSBtYXAgb2YgRG9ja2VyIGRyaXZlci1zcGVjaWZpYyBvcHRpb25zIHBhc3NlZCB0aHJvdWdoLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgRHJpdmVyT3B0c2BgIGluIHRoZSBkb2NrZXIgY3JlYXRlLXZvbHVtZSBjb21tYW5kIGFuZCB0aGUgYGB4eG9wdGBgIG9wdGlvbiB0byBkb2NrZXIgdm9sdW1lIGNyZWF0ZS5cbiAqL1xuRHJpdmVyT3B0cz86IHtcbi8qKlxuICogVGhpcyBpbnRlcmZhY2Ugd2FzIHJlZmVyZW5jZWQgYnkgYHVuZGVmaW5lZGAncyBKU09OLVNjaGVtYSBkZWZpbml0aW9uXG4gKiB2aWEgdGhlIGBwYXR0ZXJuUHJvcGVydHlgIFwiLnsxLH1cIi5cbiAqL1xuW2s6IHN0cmluZ106IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgc2NvcGUgZm9yIHRoZSBEb2NrZXIgdm9sdW1lIHRoYXQgZGV0ZXJtaW5lcyBpdHMgbGlmZWN5Y2xlLiBEb2NrZXIgdm9sdW1lcyB0aGF0IGFyZSBzY29wZWQgdG8gYSBgYHRhc2tgYCBhcmUgYXV0b21hdGljYWxseSBwcm92aXNpb25lZCB3aGVuIHRoZSB0YXNrIHN0YXJ0cyBhbmQgZGVzdHJveWVkIHdoZW4gdGhlIHRhc2sgc3RvcHMuIERvY2tlciB2b2x1bWVzIHRoYXQgYXJlIHNjb3BlZCBhcyBgYHNoYXJlZGBgIHBlcnNpc3QgYWZ0ZXIgdGhlIHRhc2sgc3RvcHMuXG4gKi9cblNjb3BlPzogc3RyaW5nXG4vKipcbiAqIElmIHRoaXMgdmFsdWUgaXMgYGB0cnVlYGAsIHRoZSBEb2NrZXIgdm9sdW1lIGlzIGNyZWF0ZWQgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LlxuICogICBUaGlzIGZpZWxkIGlzIG9ubHkgdXNlZCBpZiB0aGUgYGBzY29wZWBgIGlzIGBgc2hhcmVkYGAuXG4gKi9cbkF1dG9wcm92aXNpb24/OiBib29sZWFuXG4vKipcbiAqIFRoZSBEb2NrZXIgdm9sdW1lIGRyaXZlciB0byB1c2UuIFRoZSBkcml2ZXIgdmFsdWUgbXVzdCBtYXRjaCB0aGUgZHJpdmVyIG5hbWUgcHJvdmlkZWQgYnkgRG9ja2VyIGJlY2F1c2UgaXQgaXMgdXNlZCBmb3IgdGFzayBwbGFjZW1lbnQuIElmIHRoZSBkcml2ZXIgd2FzIGluc3RhbGxlZCB1c2luZyB0aGUgRG9ja2VyIHBsdWdpbiBDTEksIHVzZSBgYGRvY2tlciBwbHVnaW4gbHNgYCB0byByZXRyaWV2ZSB0aGUgZHJpdmVyIG5hbWUgZnJvbSB5b3VyIGNvbnRhaW5lciBpbnN0YW5jZS4gSWYgdGhlIGRyaXZlciB3YXMgaW5zdGFsbGVkIHVzaW5nIGFub3RoZXIgbWV0aG9kLCB1c2UgRG9ja2VyIHBsdWdpbiBkaXNjb3ZlcnkgdG8gcmV0cmlldmUgdGhlIGRyaXZlciBuYW1lLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgRHJpdmVyYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYHh4ZHJpdmVyYGAgb3B0aW9uIHRvIGRvY2tlciB2b2x1bWUgY3JlYXRlLlxuICovXG5Ecml2ZXI/OiBzdHJpbmdcbi8qKlxuICogQ3VzdG9tIG1ldGFkYXRhIHRvIGFkZCB0byB5b3VyIERvY2tlciB2b2x1bWUuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBMYWJlbHNgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgeHhsYWJlbGBgIG9wdGlvbiB0byBkb2NrZXIgdm9sdW1lIGNyZWF0ZS5cbiAqL1xuTGFiZWxzPzoge1xuLyoqXG4gKiBUaGlzIGludGVyZmFjZSB3YXMgcmVmZXJlbmNlZCBieSBgdW5kZWZpbmVkYCdzIEpTT04tU2NoZW1hIGRlZmluaXRpb25cbiAqIHZpYSB0aGUgYHBhdHRlcm5Qcm9wZXJ0eWAgXCIuezEsfVwiLlxuICovXG5bazogc3RyaW5nXTogc3RyaW5nXG59XG59XG4vKipcbiAqIFRoaXMgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCB3aGVuIHlvdSB1c2UgQW1hem9uIEZTeCBmb3IgV2luZG93cyBGaWxlIFNlcnZlciBmaWxlIHN5c3RlbSBmb3IgdGFzayBzdG9yYWdlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZTeFdpbmRvd3NGaWxlU2VydmVyVm9sdW1lQ29uZmlndXJhdGlvbiB7XG5BdXRob3JpemF0aW9uQ29uZmlnPzogRlN4QXV0aG9yaXphdGlvbkNvbmZpZ1xuLyoqXG4gKiBUaGUgQW1hem9uIEZTeCBmb3IgV2luZG93cyBGaWxlIFNlcnZlciBmaWxlIHN5c3RlbSBJRCB0byB1c2UuXG4gKi9cbkZpbGVTeXN0ZW1JZDogc3RyaW5nXG4vKipcbiAqIFRoZSBkaXJlY3Rvcnkgd2l0aGluIHRoZSBBbWF6b24gRlN4IGZvciBXaW5kb3dzIEZpbGUgU2VydmVyIGZpbGUgc3lzdGVtIHRvIG1vdW50IGFzIHRoZSByb290IGRpcmVjdG9yeSBpbnNpZGUgdGhlIGhvc3QuXG4gKi9cblJvb3REaXJlY3Rvcnk6IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgYXV0aG9yaXphdGlvbiBjb25maWd1cmF0aW9uIGRldGFpbHMgZm9yIHRoZSBBbWF6b24gRlN4IGZvciBXaW5kb3dzIEZpbGUgU2VydmVyIGZpbGUgc3lzdGVtLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZTeEF1dGhvcml6YXRpb25Db25maWcge1xuLyoqXG4gKiBUaGUgYXV0aG9yaXphdGlvbiBjcmVkZW50aWFsIG9wdGlvbiB0byB1c2UuIFRoZSBhdXRob3JpemF0aW9uIGNyZWRlbnRpYWwgb3B0aW9ucyBjYW4gYmUgcHJvdmlkZWQgdXNpbmcgZWl0aGVyIHRoZSBBbWF6b24gUmVzb3VyY2UgTmFtZSAoQVJOKSBvZiBhbiBBU01sb25nIHNlY3JldCBvciBTU00gUGFyYW1ldGVyIFN0b3JlIHBhcmFtZXRlci4gVGhlIEFSTiByZWZlcnMgdG8gdGhlIHN0b3JlZCBjcmVkZW50aWFscy5cbiAqL1xuQ3JlZGVudGlhbHNQYXJhbWV0ZXI6IHN0cmluZ1xuLyoqXG4gKiBBIGZ1bGx5IHF1YWxpZmllZCBkb21haW4gbmFtZSBob3N0ZWQgYnkgYW4gW10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RpcmVjdG9yeXNlcnZpY2UvbGF0ZXN0L2FkbWluLWd1aWRlL2RpcmVjdG9yeV9taWNyb3NvZnRfYWQuaHRtbCkgTWFuYWdlZCBNaWNyb3NvZnQgQUQgKEFjdGl2ZSBEaXJlY3RvcnkpIG9yIHNlbGYtaG9zdGVkIEFEIG9uIEFtYXpvbiBFQzIuXG4gKi9cbkRvbWFpbjogc3RyaW5nXG59XG4vKipcbiAqIFRoZSBgYENvbnRhaW5lckRlZmluaXRpb25gYCBwcm9wZXJ0eSBzcGVjaWZpZXMgYSBjb250YWluZXIgZGVmaW5pdGlvbi4gQ29udGFpbmVyIGRlZmluaXRpb25zIGFyZSB1c2VkIGluIHRhc2sgZGVmaW5pdGlvbnMgdG8gZGVzY3JpYmUgdGhlIGRpZmZlcmVudCBjb250YWluZXJzIHRoYXQgYXJlIGxhdW5jaGVkIGFzIHBhcnQgb2YgYSB0YXNrLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRhaW5lckRlZmluaXRpb24ge1xuLyoqXG4gKiBUaGUgdXNlciB0byB1c2UgaW5zaWRlIHRoZSBjb250YWluZXIuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBVc2VyYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYC0tdXNlcmBgIG9wdGlvbiB0byBkb2NrZXIgcnVuLlxuICogICBXaGVuIHJ1bm5pbmcgdGFza3MgdXNpbmcgdGhlIGBgaG9zdGBgIG5ldHdvcmsgbW9kZSwgZG9uJ3QgcnVuIGNvbnRhaW5lcnMgdXNpbmcgdGhlIHJvb3QgdXNlciAoVUlEIDApLiBXZSByZWNvbW1lbmQgdXNpbmcgYSBub24tcm9vdCB1c2VyIGZvciBiZXR0ZXIgc2VjdXJpdHkuXG4gKiAgIFlvdSBjYW4gc3BlY2lmeSB0aGUgYGB1c2VyYGAgdXNpbmcgdGhlIGZvbGxvd2luZyBmb3JtYXRzLiBJZiBzcGVjaWZ5aW5nIGEgVUlEIG9yIEdJRCwgeW91IG11c3Qgc3BlY2lmeSBpdCBhcyBhIHBvc2l0aXZlIGludGVnZXIuXG4gKiAgICsgICBgYHVzZXJgYCBcbiAqICAgKyAgIGBgdXNlcjpncm91cGBgIFxuICogICArICAgYGB1aWRgYCBcbiAqICAgKyAgIGBgdWlkOmdpZGBgIFxuICogICArICAgYGB1c2VyOmdpZGBgIFxuICogICArICAgYGB1aWQ6Z3JvdXBgYCBcbiAqICAgXG4gKiAgIFRoaXMgcGFyYW1ldGVyIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIFdpbmRvd3MgY29udGFpbmVycy5cbiAqL1xuVXNlcj86IHN0cmluZ1xuLyoqXG4gKiBUaGUgc2VjcmV0cyB0byBwYXNzIHRvIHRoZSBjb250YWluZXIuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1NwZWNpZnlpbmcgU2Vuc2l0aXZlIERhdGFdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3NwZWNpZnlpbmctc2Vuc2l0aXZlLWRhdGEuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5TZWNyZXRzPzogU2VjcmV0W11cbi8qKlxuICogVGhlIGFtb3VudCAoaW4gTWlCKSBvZiBtZW1vcnkgdG8gcHJlc2VudCB0byB0aGUgY29udGFpbmVyLiBJZiB5b3VyIGNvbnRhaW5lciBhdHRlbXB0cyB0byBleGNlZWQgdGhlIG1lbW9yeSBzcGVjaWZpZWQgaGVyZSwgdGhlIGNvbnRhaW5lciBpcyBraWxsZWQuIFRoZSB0b3RhbCBhbW91bnQgb2YgbWVtb3J5IHJlc2VydmVkIGZvciBhbGwgY29udGFpbmVycyB3aXRoaW4gYSB0YXNrIG11c3QgYmUgbG93ZXIgdGhhbiB0aGUgdGFzayBgYG1lbW9yeWBgIHZhbHVlLCBpZiBvbmUgaXMgc3BlY2lmaWVkLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgTWVtb3J5YGAgaW4gdGhlIFtDcmVhdGUgYSBjb250YWluZXJdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9odHRwczovL2RvY3MuZG9ja2VyLmNvbS9lbmdpbmUvYXBpL3YxLjM1LyNvcGVyYXRpb24vQ29udGFpbmVyQ3JlYXRlKSBzZWN0aW9uIG9mIHRoZSBbRG9ja2VyIFJlbW90ZSBBUEldKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9odHRwczovL2RvY3MuZG9ja2VyLmNvbS9lbmdpbmUvYXBpL3YxLjM1LykgYW5kIHRoZSBgYC0tbWVtb3J5YGAgb3B0aW9uIHRvIFtkb2NrZXIgcnVuXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaHR0cHM6Ly9kb2NzLmRvY2tlci5jb20vZW5naW5lL3JlZmVyZW5jZS9ydW4vI3NlY3VyaXR5LWNvbmZpZ3VyYXRpb24pLlxuICogIElmIHVzaW5nIHRoZSBGYXJnYXRlIGxhdW5jaCB0eXBlLCB0aGlzIHBhcmFtZXRlciBpcyBvcHRpb25hbC5cbiAqICBJZiB1c2luZyB0aGUgRUMyIGxhdW5jaCB0eXBlLCB5b3UgbXVzdCBzcGVjaWZ5IGVpdGhlciBhIHRhc2stbGV2ZWwgbWVtb3J5IHZhbHVlIG9yIGEgY29udGFpbmVyLWxldmVsIG1lbW9yeSB2YWx1ZS4gSWYgeW91IHNwZWNpZnkgYm90aCBhIGNvbnRhaW5lci1sZXZlbCBgYG1lbW9yeWBgIGFuZCBgYG1lbW9yeVJlc2VydmF0aW9uYGAgdmFsdWUsIGBgbWVtb3J5YGAgbXVzdCBiZSBncmVhdGVyIHRoYW4gYGBtZW1vcnlSZXNlcnZhdGlvbmBgLiBJZiB5b3Ugc3BlY2lmeSBgYG1lbW9yeVJlc2VydmF0aW9uYGAsIHRoZW4gdGhhdCB2YWx1ZSBpcyBzdWJ0cmFjdGVkIGZyb20gdGhlIGF2YWlsYWJsZSBtZW1vcnkgcmVzb3VyY2VzIGZvciB0aGUgY29udGFpbmVyIGluc3RhbmNlIHdoZXJlIHRoZSBjb250YWluZXIgaXMgcGxhY2VkLiBPdGhlcndpc2UsIHRoZSB2YWx1ZSBvZiBgYG1lbW9yeWBgIGlzIHVzZWQuXG4gKiAgVGhlIERvY2tlciAyMC4xMC4wIG9yIGxhdGVyIGRhZW1vbiByZXNlcnZlcyBhIG1pbmltdW0gb2YgNiBNaUIgb2YgbWVtb3J5IGZvciBhIGNvbnRhaW5lciwgc28geW91IHNob3VsZCBub3Qgc3BlY2lmeSBmZXdlciB0aGFuIDYgTWlCIG9mIG1lbW9yeSBmb3IgeW91ciBjb250YWluZXJzLlxuICogIFRoZSBEb2NrZXIgMTkuMDMuMTMtY2Ugb3IgZWFybGllciBkYWVtb24gcmVzZXJ2ZXMgYSBtaW5pbXVtIG9mIDQgTWlCIG9mIG1lbW9yeSBmb3IgYSBjb250YWluZXIsIHNvIHlvdSBzaG91bGQgbm90IHNwZWNpZnkgZmV3ZXIgdGhhbiA0IE1pQiBvZiBtZW1vcnkgZm9yIHlvdXIgY29udGFpbmVycy5cbiAqL1xuTWVtb3J5PzogbnVtYmVyXG4vKipcbiAqIFdoZW4gdGhpcyBwYXJhbWV0ZXIgaXMgdHJ1ZSwgdGhlIGNvbnRhaW5lciBpcyBnaXZlbiBlbGV2YXRlZCBwcml2aWxlZ2VzIG9uIHRoZSBob3N0IGNvbnRhaW5lciBpbnN0YW5jZSAoc2ltaWxhciB0byB0aGUgYGByb290YGAgdXNlcikuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBQcml2aWxlZ2VkYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYC0tcHJpdmlsZWdlZGBgIG9wdGlvbiB0byBkb2NrZXIgcnVuXG4gKiAgIFRoaXMgcGFyYW1ldGVyIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIFdpbmRvd3MgY29udGFpbmVycyBvciB0YXNrcyBydW4gb24gRkFSR0FURWxvbmcuXG4gKi9cblByaXZpbGVnZWQ/OiBib29sZWFuXG5IZWFsdGhDaGVjaz86IEhlYWx0aENoZWNrXG4vKipcbiAqIFRpbWUgZHVyYXRpb24gKGluIHNlY29uZHMpIHRvIHdhaXQgYmVmb3JlIGdpdmluZyB1cCBvbiByZXNvbHZpbmcgZGVwZW5kZW5jaWVzIGZvciBhIGNvbnRhaW5lci4gRm9yIGV4YW1wbGUsIHlvdSBzcGVjaWZ5IHR3byBjb250YWluZXJzIGluIGEgdGFzayBkZWZpbml0aW9uIHdpdGggY29udGFpbmVyQSBoYXZpbmcgYSBkZXBlbmRlbmN5IG9uIGNvbnRhaW5lckIgcmVhY2hpbmcgYSBgYENPTVBMRVRFYGAsIGBgU1VDQ0VTU2BgLCBvciBgYEhFQUxUSFlgYCBzdGF0dXMuIElmIGEgYGBzdGFydFRpbWVvdXRgYCB2YWx1ZSBpcyBzcGVjaWZpZWQgZm9yIGNvbnRhaW5lckIgYW5kIGl0IGRvZXNuJ3QgcmVhY2ggdGhlIGRlc2lyZWQgc3RhdHVzIHdpdGhpbiB0aGF0IHRpbWUgdGhlbiBjb250YWluZXJBIGdpdmVzIHVwIGFuZCBub3Qgc3RhcnQuIFRoaXMgcmVzdWx0cyBpbiB0aGUgdGFzayB0cmFuc2l0aW9uaW5nIHRvIGEgYGBTVE9QUEVEYGAgc3RhdGUuXG4gKiAgIFdoZW4gdGhlIGBgRUNTX0NPTlRBSU5FUl9TVEFSVF9USU1FT1VUYGAgY29udGFpbmVyIGFnZW50IGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgaXMgdXNlZCwgaXQncyBlbmZvcmNlZCBpbmRlcGVuZGVudGx5IGZyb20gdGhpcyBzdGFydCB0aW1lb3V0IHZhbHVlLlxuICogICBGb3IgdGFza3MgdXNpbmcgdGhlIEZhcmdhdGUgbGF1bmNoIHR5cGUsIHRoZSB0YXNrIG9yIHNlcnZpY2UgcmVxdWlyZXMgdGhlIGZvbGxvd2luZyBwbGF0Zm9ybXM6XG4gKiAgICsgIExpbnV4IHBsYXRmb3JtIHZlcnNpb24gYGAxLjMuMGBgIG9yIGxhdGVyLlxuICogICArICBXaW5kb3dzIHBsYXRmb3JtIHZlcnNpb24gYGAxLjAuMGBgIG9yIGxhdGVyLlxuICogICBcbiAqICBGb3IgdGFza3MgdXNpbmcgdGhlIEVDMiBsYXVuY2ggdHlwZSwgeW91ciBjb250YWluZXIgaW5zdGFuY2VzIHJlcXVpcmUgYXQgbGVhc3QgdmVyc2lvbiBgYDEuMjYuMGBgIG9mIHRoZSBjb250YWluZXIgYWdlbnQgdG8gdXNlIGEgY29udGFpbmVyIHN0YXJ0IHRpbWVvdXQgdmFsdWUuIEhvd2V2ZXIsIHdlIHJlY29tbWVuZCB1c2luZyB0aGUgbGF0ZXN0IGNvbnRhaW5lciBhZ2VudCB2ZXJzaW9uLiBGb3IgaW5mb3JtYXRpb24gYWJvdXQgY2hlY2tpbmcgeW91ciBhZ2VudCB2ZXJzaW9uIGFuZCB1cGRhdGluZyB0byB0aGUgbGF0ZXN0IHZlcnNpb24sIHNlZSBbVXBkYXRpbmcgdGhlIEFtYXpvbiBFQ1MgQ29udGFpbmVyIEFnZW50XShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9lY3MtYWdlbnQtdXBkYXRlLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi4gSWYgeW91J3JlIHVzaW5nIGFuIEFtYXpvbiBFQ1Mtb3B0aW1pemVkIExpbnV4IEFNSSwgeW91ciBpbnN0YW5jZSBuZWVkcyBhdCBsZWFzdCB2ZXJzaW9uIGBgMS4yNi4wLTFgYCBvZiB0aGUgYGBlY3MtaW5pdGBgIHBhY2thZ2UuIElmIHlvdXIgY29udGFpbmVyIGluc3RhbmNlcyBhcmUgbGF1bmNoZWQgZnJvbSB2ZXJzaW9uIGBgMjAxOTAzMDFgYCBvciBsYXRlciwgdGhlbiB0aGV5IGNvbnRhaW4gdGhlIHJlcXVpcmVkIHZlcnNpb25zIG9mIHRoZSBjb250YWluZXIgYWdlbnQgYW5kIGBgZWNzLWluaXRgYC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQW1hem9uIEVDUy1vcHRpbWl6ZWQgTGludXggQU1JXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9lY3Mtb3B0aW1pemVkX0FNSS5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKiAgVGhlIHZhbGlkIHZhbHVlcyBmb3IgRmFyZ2F0ZSBhcmUgMi0xMjAgc2Vjb25kcy5cbiAqL1xuU3RhcnRUaW1lb3V0PzogbnVtYmVyXG4vKipcbiAqIERhdGEgdm9sdW1lcyB0byBtb3VudCBmcm9tIGFub3RoZXIgY29udGFpbmVyLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgVm9sdW1lc0Zyb21gYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS12b2x1bWVzLWZyb21gYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi5cbiAqL1xuVm9sdW1lc0Zyb20/OiBWb2x1bWVGcm9tW11cbi8qKlxuICogVGhlIG51bWJlciBvZiBgYGNwdWBgIHVuaXRzIHJlc2VydmVkIGZvciB0aGUgY29udGFpbmVyLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgQ3B1U2hhcmVzYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmRhbmQgdGhlIGBgLS1jcHUtc2hhcmVzYGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKiAgVGhpcyBmaWVsZCBpcyBvcHRpb25hbCBmb3IgdGFza3MgdXNpbmcgdGhlIEZhcmdhdGUgbGF1bmNoIHR5cGUsIGFuZCB0aGUgb25seSByZXF1aXJlbWVudCBpcyB0aGF0IHRoZSB0b3RhbCBhbW91bnQgb2YgQ1BVIHJlc2VydmVkIGZvciBhbGwgY29udGFpbmVycyB3aXRoaW4gYSB0YXNrIGJlIGxvd2VyIHRoYW4gdGhlIHRhc2stbGV2ZWwgYGBjcHVgYCB2YWx1ZS5cbiAqICAgWW91IGNhbiBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBDUFUgdW5pdHMgdGhhdCBhcmUgYXZhaWxhYmxlIHBlciBFQzIgaW5zdGFuY2UgdHlwZSBieSBtdWx0aXBseWluZyB0aGUgdkNQVXMgbGlzdGVkIGZvciB0aGF0IGluc3RhbmNlIHR5cGUgb24gdGhlIFtBbWF6b24gRUMyIEluc3RhbmNlc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2VjMi9pbnN0YW5jZS10eXBlcy8pIGRldGFpbCBwYWdlIGJ5IDEsMDI0LlxuICogICBMaW51eCBjb250YWluZXJzIHNoYXJlIHVuYWxsb2NhdGVkIENQVSB1bml0cyB3aXRoIG90aGVyIGNvbnRhaW5lcnMgb24gdGhlIGNvbnRhaW5lciBpbnN0YW5jZSB3aXRoIHRoZSBzYW1lIHJhdGlvIGFzIHRoZWlyIGFsbG9jYXRlZCBhbW91bnQuIEZvciBleGFtcGxlLCBpZiB5b3UgcnVuIGEgc2luZ2xlLWNvbnRhaW5lciB0YXNrIG9uIGEgc2luZ2xlLWNvcmUgaW5zdGFuY2UgdHlwZSB3aXRoIDUxMiBDUFUgdW5pdHMgc3BlY2lmaWVkIGZvciB0aGF0IGNvbnRhaW5lciwgYW5kIHRoYXQncyB0aGUgb25seSB0YXNrIHJ1bm5pbmcgb24gdGhlIGNvbnRhaW5lciBpbnN0YW5jZSwgdGhhdCBjb250YWluZXIgY291bGQgdXNlIHRoZSBmdWxsIDEsMDI0IENQVSB1bml0IHNoYXJlIGF0IGFueSBnaXZlbiB0aW1lLiBIb3dldmVyLCBpZiB5b3UgbGF1bmNoZWQgYW5vdGhlciBjb3B5IG9mIHRoZSBzYW1lIHRhc2sgb24gdGhhdCBjb250YWluZXIgaW5zdGFuY2UsIGVhY2ggdGFzayBpcyBndWFyYW50ZWVkIGEgbWluaW11bSBvZiA1MTIgQ1BVIHVuaXRzIHdoZW4gbmVlZGVkLiBNb3Jlb3ZlciwgZWFjaCBjb250YWluZXIgY291bGQgZmxvYXQgdG8gaGlnaGVyIENQVSB1c2FnZSBpZiB0aGUgb3RoZXIgY29udGFpbmVyIHdhcyBub3QgdXNpbmcgaXQuIElmIGJvdGggdGFza3Mgd2VyZSAxMDAlIGFjdGl2ZSBhbGwgb2YgdGhlIHRpbWUsIHRoZXkgd291bGQgYmUgbGltaXRlZCB0byA1MTIgQ1BVIHVuaXRzLlxuICogIE9uIExpbnV4IGNvbnRhaW5lciBpbnN0YW5jZXMsIHRoZSBEb2NrZXIgZGFlbW9uIG9uIHRoZSBjb250YWluZXIgaW5zdGFuY2UgdXNlcyB0aGUgQ1BVIHZhbHVlIHRvIGNhbGN1bGF0ZSB0aGUgcmVsYXRpdmUgQ1BVIHNoYXJlIHJhdGlvcyBmb3IgcnVubmluZyBjb250YWluZXJzLiBUaGUgbWluaW11bSB2YWxpZCBDUFUgc2hhcmUgdmFsdWUgdGhhdCB0aGUgTGludXgga2VybmVsIGFsbG93cyBpcyAyLCBhbmQgdGhlIG1heGltdW0gdmFsaWQgQ1BVIHNoYXJlIHZhbHVlIHRoYXQgdGhlIExpbnV4IGtlcm5lbCBhbGxvd3MgaXMgMjYyMTQ0LiBIb3dldmVyLCB0aGUgQ1BVIHBhcmFtZXRlciBpc24ndCByZXF1aXJlZCwgYW5kIHlvdSBjYW4gdXNlIENQVSB2YWx1ZXMgYmVsb3cgMiBvciBhYm92ZSAyNjIxNDQgaW4geW91ciBjb250YWluZXIgZGVmaW5pdGlvbnMuIEZvciBDUFUgdmFsdWVzIGJlbG93IDIgKGluY2x1ZGluZyBudWxsKSBvciBhYm92ZSAyNjIxNDQsIHRoZSBiZWhhdmlvciB2YXJpZXMgYmFzZWQgb24geW91ciBBbWF6b24gRUNTIGNvbnRhaW5lciBhZ2VudCB2ZXJzaW9uOlxuICogICArICAgKkFnZW50IHZlcnNpb25zIGxlc3MgdGhhbiBvciBlcXVhbCB0byAxLjEuMDoqIE51bGwgYW5kIHplcm8gQ1BVIHZhbHVlcyBhcmUgcGFzc2VkIHRvIERvY2tlciBhcyAwLCB3aGljaCBEb2NrZXIgdGhlbiBjb252ZXJ0cyB0byAxLDAyNCBDUFUgc2hhcmVzLiBDUFUgdmFsdWVzIG9mIDEgYXJlIHBhc3NlZCB0byBEb2NrZXIgYXMgMSwgd2hpY2ggdGhlIExpbnV4IGtlcm5lbCBjb252ZXJ0cyB0byB0d28gQ1BVIHNoYXJlcy5cbiAqICAgKyAgICpBZ2VudCB2ZXJzaW9ucyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMS4yLjA6KiBOdWxsLCB6ZXJvLCBhbmQgQ1BVIHZhbHVlcyBvZiAxIGFyZSBwYXNzZWQgdG8gRG9ja2VyIGFzIDIuXG4gKiAgICsgICAqQWdlbnQgdmVyc2lvbnMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEuODQuMDoqIENQVSB2YWx1ZXMgZ3JlYXRlciB0aGFuIDI1NiB2Q1BVIGFyZSBwYXNzZWQgdG8gRG9ja2VyIGFzIDI1Niwgd2hpY2ggaXMgZXF1aXZhbGVudCB0byAyNjIxNDQgQ1BVIHNoYXJlcy5cbiAqICAgXG4gKiAgT24gV2luZG93cyBjb250YWluZXIgaW5zdGFuY2VzLCB0aGUgQ1BVIGxpbWl0IGlzIGVuZm9yY2VkIGFzIGFuIGFic29sdXRlIGxpbWl0LCBvciBhIHF1b3RhLiBXaW5kb3dzIGNvbnRhaW5lcnMgb25seSBoYXZlIGFjY2VzcyB0byB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBDUFUgdGhhdCdzIGRlc2NyaWJlZCBpbiB0aGUgdGFzayBkZWZpbml0aW9uLiBBIG51bGwgb3IgemVybyBDUFUgdmFsdWUgaXMgcGFzc2VkIHRvIERvY2tlciBhcyBgYDBgYCwgd2hpY2ggV2luZG93cyBpbnRlcnByZXRzIGFzIDElIG9mIG9uZSBDUFUuXG4gKi9cbkNwdT86IG51bWJlclxuLyoqXG4gKiBFYXJseSB2ZXJzaW9ucyBvZiB0aGUgQW1hem9uIEVDUyBjb250YWluZXIgYWdlbnQgZG9uJ3QgcHJvcGVybHkgaGFuZGxlIGBgZW50cnlQb2ludGBgIHBhcmFtZXRlcnMuIElmIHlvdSBoYXZlIHByb2JsZW1zIHVzaW5nIGBgZW50cnlQb2ludGBgLCB1cGRhdGUgeW91ciBjb250YWluZXIgYWdlbnQgb3IgZW50ZXIgeW91ciBjb21tYW5kcyBhbmQgYXJndW1lbnRzIGFzIGBgY29tbWFuZGBgIGFycmF5IGl0ZW1zIGluc3RlYWQuXG4gKiAgIFRoZSBlbnRyeSBwb2ludCB0aGF0J3MgcGFzc2VkIHRvIHRoZSBjb250YWluZXIuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBFbnRyeXBvaW50YGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYC0tZW50cnlwb2ludGBgIG9wdGlvbiB0byBkb2NrZXIgcnVuLlxuICovXG5FbnRyeVBvaW50Pzogc3RyaW5nW11cbi8qKlxuICogQSBsaXN0IG9mIEROUyBzZXJ2ZXJzIHRoYXQgYXJlIHByZXNlbnRlZCB0byB0aGUgY29udGFpbmVyLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgRG5zYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYC0tZG5zYGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKiAgIFRoaXMgcGFyYW1ldGVyIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIFdpbmRvd3MgY29udGFpbmVycy5cbiAqL1xuRG5zU2VydmVycz86IHN0cmluZ1tdXG4vKipcbiAqIFdoZW4gdGhpcyBwYXJhbWV0ZXIgaXMgdHJ1ZSwgdGhlIGNvbnRhaW5lciBpcyBnaXZlbiByZWFkLW9ubHkgYWNjZXNzIHRvIGl0cyByb290IGZpbGUgc3lzdGVtLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgUmVhZG9ubHlSb290ZnNgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS1yZWFkLW9ubHlgYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi5cbiAqICAgVGhpcyBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZCBmb3IgV2luZG93cyBjb250YWluZXJzLlxuICovXG5SZWFkb25seVJvb3RGaWxlc3lzdGVtPzogYm9vbGVhblxuLyoqXG4gKiBUaGUgaW1hZ2UgdXNlZCB0byBzdGFydCBhIGNvbnRhaW5lci4gVGhpcyBzdHJpbmcgaXMgcGFzc2VkIGRpcmVjdGx5IHRvIHRoZSBEb2NrZXIgZGFlbW9uLiBCeSBkZWZhdWx0LCBpbWFnZXMgaW4gdGhlIERvY2tlciBIdWIgcmVnaXN0cnkgYXJlIGF2YWlsYWJsZS4gT3RoZXIgcmVwb3NpdG9yaWVzIGFyZSBzcGVjaWZpZWQgd2l0aCBlaXRoZXIgYGByZXBvc2l0b3J5LXVybC9pbWFnZTp0YWdgYCBvciBgYHJlcG9zaXRvcnktdXJsL2ltYWdlQGRpZ2VzdGBgLiBVcCB0byAyNTUgbGV0dGVycyAodXBwZXJjYXNlIGFuZCBsb3dlcmNhc2UpLCBudW1iZXJzLCBoeXBoZW5zLCB1bmRlcnNjb3JlcywgY29sb25zLCBwZXJpb2RzLCBmb3J3YXJkIHNsYXNoZXMsIGFuZCBudW1iZXIgc2lnbnMgYXJlIGFsbG93ZWQuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBJbWFnZWBgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kIGFuZCB0aGUgYGBJTUFHRWBgIHBhcmFtZXRlciBvZiBkb2NrZXIgcnVuLlxuICogICArICBXaGVuIGEgbmV3IHRhc2sgc3RhcnRzLCB0aGUgQW1hem9uIEVDUyBjb250YWluZXIgYWdlbnQgcHVsbHMgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpZWQgaW1hZ2UgYW5kIHRhZyBmb3IgdGhlIGNvbnRhaW5lciB0byB1c2UuIEhvd2V2ZXIsIHN1YnNlcXVlbnQgdXBkYXRlcyB0byBhIHJlcG9zaXRvcnkgaW1hZ2UgYXJlbid0IHByb3BhZ2F0ZWQgdG8gYWxyZWFkeSBydW5uaW5nIHRhc2tzLlxuICogICArICBJbWFnZXMgaW4gQW1hem9uIEVDUiByZXBvc2l0b3JpZXMgY2FuIGJlIHNwZWNpZmllZCBieSBlaXRoZXIgdXNpbmcgdGhlIGZ1bGwgYGByZWdpc3RyeS9yZXBvc2l0b3J5OnRhZ2BgIG9yIGBgcmVnaXN0cnkvcmVwb3NpdG9yeUBkaWdlc3RgYC4gRm9yIGV4YW1wbGUsIGBgMDEyMzQ1Njc4OTEwLmRrci5lY3IuPHJlZ2lvbi1uYW1lPi5hbWF6b25hd3MuY29tLzxyZXBvc2l0b3J5LW5hbWU+OmxhdGVzdGBgIG9yIGBgMDEyMzQ1Njc4OTEwLmRrci5lY3IuPHJlZ2lvbi1uYW1lPi5hbWF6b25hd3MuY29tLzxyZXBvc2l0b3J5LW5hbWU+QHNoYTI1Njo5NGFmZDFmMmU2NGQ5MDhiYzkwZGJjYTAwMzVhNWI1NjdFWEFNUExFYGAuIFxuICogICArICBJbWFnZXMgaW4gb2ZmaWNpYWwgcmVwb3NpdG9yaWVzIG9uIERvY2tlciBIdWIgdXNlIGEgc2luZ2xlIG5hbWUgKGZvciBleGFtcGxlLCBgYHVidW50dWBgIG9yIGBgbW9uZ29gYCkuXG4gKiAgICsgIEltYWdlcyBpbiBvdGhlciByZXBvc2l0b3JpZXMgb24gRG9ja2VyIEh1YiBhcmUgcXVhbGlmaWVkIHdpdGggYW4gb3JnYW5pemF0aW9uIG5hbWUgKGZvciBleGFtcGxlLCBgYGFtYXpvbi9hbWF6b24tZWNzLWFnZW50YGApLlxuICogICArICBJbWFnZXMgaW4gb3RoZXIgb25saW5lIHJlcG9zaXRvcmllcyBhcmUgcXVhbGlmaWVkIGZ1cnRoZXIgYnkgYSBkb21haW4gbmFtZSAoZm9yIGV4YW1wbGUsIGBgcXVheS5pby9hc3NlbWJseWxpbmUvdWJ1bnR1YGApLlxuICovXG5JbWFnZTogc3RyaW5nXG4vKipcbiAqIElmIHRoZSBgYGVzc2VudGlhbGBgIHBhcmFtZXRlciBvZiBhIGNvbnRhaW5lciBpcyBtYXJrZWQgYXMgYGB0cnVlYGAsIGFuZCB0aGF0IGNvbnRhaW5lciBmYWlscyBvciBzdG9wcyBmb3IgYW55IHJlYXNvbiwgYWxsIG90aGVyIGNvbnRhaW5lcnMgdGhhdCBhcmUgcGFydCBvZiB0aGUgdGFzayBhcmUgc3RvcHBlZC4gSWYgdGhlIGBgZXNzZW50aWFsYGAgcGFyYW1ldGVyIG9mIGEgY29udGFpbmVyIGlzIG1hcmtlZCBhcyBgYGZhbHNlYGAsIGl0cyBmYWlsdXJlIGRvZXNuJ3QgYWZmZWN0IHRoZSByZXN0IG9mIHRoZSBjb250YWluZXJzIGluIGEgdGFzay4gSWYgdGhpcyBwYXJhbWV0ZXIgaXMgb21pdHRlZCwgYSBjb250YWluZXIgaXMgYXNzdW1lZCB0byBiZSBlc3NlbnRpYWwuXG4gKiAgQWxsIHRhc2tzIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgZXNzZW50aWFsIGNvbnRhaW5lci4gSWYgeW91IGhhdmUgYW4gYXBwbGljYXRpb24gdGhhdCdzIGNvbXBvc2VkIG9mIG11bHRpcGxlIGNvbnRhaW5lcnMsIGdyb3VwIGNvbnRhaW5lcnMgdGhhdCBhcmUgdXNlZCBmb3IgYSBjb21tb24gcHVycG9zZSBpbnRvIGNvbXBvbmVudHMsIGFuZCBzZXBhcmF0ZSB0aGUgZGlmZmVyZW50IGNvbXBvbmVudHMgaW50byBtdWx0aXBsZSB0YXNrIGRlZmluaXRpb25zLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtBcHBsaWNhdGlvbiBBcmNoaXRlY3R1cmVdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2FwcGxpY2F0aW9uX2FyY2hpdGVjdHVyZS5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKi9cbkVzc2VudGlhbD86IGJvb2xlYW5cbkxvZ0NvbmZpZ3VyYXRpb24/OiBMb2dDb25maWd1cmF0aW9uXG4vKipcbiAqIFRoZSB0eXBlIGFuZCBhbW91bnQgb2YgYSByZXNvdXJjZSB0byBhc3NpZ24gdG8gYSBjb250YWluZXIuIFRoZSBvbmx5IHN1cHBvcnRlZCByZXNvdXJjZSBpcyBhIEdQVS5cbiAqL1xuUmVzb3VyY2VSZXF1aXJlbWVudHM/OiBSZXNvdXJjZVJlcXVpcmVtZW50W11cbi8qKlxuICogQSBsaXN0IG9mIGZpbGVzIGNvbnRhaW5pbmcgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBwYXNzIHRvIGEgY29udGFpbmVyLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIHRoZSBgYC0tZW52LWZpbGVgYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi5cbiAqICBZb3UgY2FuIHNwZWNpZnkgdXAgdG8gdGVuIGVudmlyb25tZW50IGZpbGVzLiBUaGUgZmlsZSBtdXN0IGhhdmUgYSBgYC5lbnZgYCBmaWxlIGV4dGVuc2lvbi4gRWFjaCBsaW5lIGluIGFuIGVudmlyb25tZW50IGZpbGUgY29udGFpbnMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgaW4gYGBWQVJJQUJMRT1WQUxVRWBgIGZvcm1hdC4gTGluZXMgYmVnaW5uaW5nIHdpdGggYGAjYGAgYXJlIHRyZWF0ZWQgYXMgY29tbWVudHMgYW5kIGFyZSBpZ25vcmVkLlxuICogIElmIHRoZXJlIGFyZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgc3BlY2lmaWVkIHVzaW5nIHRoZSBgYGVudmlyb25tZW50YGAgcGFyYW1ldGVyIGluIGEgY29udGFpbmVyIGRlZmluaXRpb24sIHRoZXkgdGFrZSBwcmVjZWRlbmNlIG92ZXIgdGhlIHZhcmlhYmxlcyBjb250YWluZWQgd2l0aGluIGFuIGVudmlyb25tZW50IGZpbGUuIElmIG11bHRpcGxlIGVudmlyb25tZW50IGZpbGVzIGFyZSBzcGVjaWZpZWQgdGhhdCBjb250YWluIHRoZSBzYW1lIHZhcmlhYmxlLCB0aGV5J3JlIHByb2Nlc3NlZCBmcm9tIHRoZSB0b3AgZG93bi4gV2UgcmVjb21tZW5kIHRoYXQgeW91IHVzZSB1bmlxdWUgdmFyaWFibGUgbmFtZXMuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1NwZWNpZnlpbmcgRW52aXJvbm1lbnQgVmFyaWFibGVzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS90YXNrZGVmLWVudmZpbGVzLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuRW52aXJvbm1lbnRGaWxlcz86IEVudmlyb25tZW50RmlsZVtdXG4vKipcbiAqIFRoZSBuYW1lIG9mIGEgY29udGFpbmVyLiBJZiB5b3UncmUgbGlua2luZyBtdWx0aXBsZSBjb250YWluZXJzIHRvZ2V0aGVyIGluIGEgdGFzayBkZWZpbml0aW9uLCB0aGUgYGBuYW1lYGAgb2Ygb25lIGNvbnRhaW5lciBjYW4gYmUgZW50ZXJlZCBpbiB0aGUgYGBsaW5rc2BgIG9mIGFub3RoZXIgY29udGFpbmVyIHRvIGNvbm5lY3QgdGhlIGNvbnRhaW5lcnMuIFVwIHRvIDI1NSBsZXR0ZXJzICh1cHBlcmNhc2UgYW5kIGxvd2VyY2FzZSksIG51bWJlcnMsIHVuZGVyc2NvcmVzLCBhbmQgaHlwaGVucyBhcmUgYWxsb3dlZC4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYG5hbWVgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS1uYW1lYGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKi9cbk5hbWU6IHN0cmluZ1xuRmlyZWxlbnNDb25maWd1cmF0aW9uPzogRmlyZWxlbnNDb25maWd1cmF0aW9uXG4vKipcbiAqIEEgbGlzdCBvZiBzdHJpbmdzIHRvIHByb3ZpZGUgY3VzdG9tIGNvbmZpZ3VyYXRpb24gZm9yIG11bHRpcGxlIHNlY3VyaXR5IHN5c3RlbXMuIFRoaXMgZmllbGQgaXNuJ3QgdmFsaWQgZm9yIGNvbnRhaW5lcnMgaW4gdGFza3MgdXNpbmcgdGhlIEZhcmdhdGUgbGF1bmNoIHR5cGUuXG4gKiAgRm9yIExpbnV4IHRhc2tzIG9uIEVDMiwgdGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHVzZWQgdG8gcmVmZXJlbmNlIGN1c3RvbSBsYWJlbHMgZm9yIFNFTGludXggYW5kIEFwcEFybW9yIG11bHRpLWxldmVsIHNlY3VyaXR5IHN5c3RlbXMuXG4gKiAgRm9yIGFueSB0YXNrcyBvbiBFQzIsIHRoaXMgcGFyYW1ldGVyIGNhbiBiZSB1c2VkIHRvIHJlZmVyZW5jZSBhIGNyZWRlbnRpYWwgc3BlYyBmaWxlIHRoYXQgY29uZmlndXJlcyBhIGNvbnRhaW5lciBmb3IgQWN0aXZlIERpcmVjdG9yeSBhdXRoZW50aWNhdGlvbi4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbVXNpbmcgZ01TQXMgZm9yIFdpbmRvd3MgQ29udGFpbmVyc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvd2luZG93cy1nbXNhLmh0bWwpIGFuZCBbVXNpbmcgZ01TQXMgZm9yIExpbnV4IENvbnRhaW5lcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2xpbnV4LWdtc2EuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICogIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBTZWN1cml0eU9wdGBgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kIGFuZCB0aGUgYGAtLXNlY3VyaXR5LW9wdGBgIG9wdGlvbiB0byBkb2NrZXIgcnVuLlxuICogICBUaGUgQW1hem9uIEVDUyBjb250YWluZXIgYWdlbnQgcnVubmluZyBvbiBhIGNvbnRhaW5lciBpbnN0YW5jZSBtdXN0IHJlZ2lzdGVyIHdpdGggdGhlIGBgRUNTX1NFTElOVVhfQ0FQQUJMRT10cnVlYGAgb3IgYGBFQ1NfQVBQQVJNT1JfQ0FQQUJMRT10cnVlYGAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGJlZm9yZSBjb250YWluZXJzIHBsYWNlZCBvbiB0aGF0IGluc3RhbmNlIGNhbiB1c2UgdGhlc2Ugc2VjdXJpdHkgb3B0aW9ucy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQW1hem9uIEVDUyBDb250YWluZXIgQWdlbnQgQ29uZmlndXJhdGlvbl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvZWNzLWFnZW50LWNvbmZpZy5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKiAgIFZhbGlkIHZhbHVlczogXCJuby1uZXctcHJpdmlsZWdlc1wiIHwgXCJhcHBhcm1vcjpQUk9GSUxFXCIgfCBcImxhYmVsOnZhbHVlXCIgfCBcImNyZWRlbnRpYWxzcGVjOkNyZWRlbnRpYWxTcGVjRmlsZVBhdGhcIlxuICovXG5Eb2NrZXJTZWN1cml0eU9wdGlvbnM/OiBzdHJpbmdbXVxuLyoqXG4gKiBBIGxpc3Qgb2YgbmFtZXNwYWNlZCBrZXJuZWwgcGFyYW1ldGVycyB0byBzZXQgaW4gdGhlIGNvbnRhaW5lci4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYFN5c2N0bHNgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS1zeXNjdGxgYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi4gRm9yIGV4YW1wbGUsIHlvdSBjYW4gY29uZmlndXJlIGBgbmV0LmlwdjQudGNwX2tlZXBhbGl2ZV90aW1lYGAgc2V0dGluZyB0byBtYWludGFpbiBsb25nZXIgbGl2ZWQgY29ubmVjdGlvbnMuXG4gKi9cblN5c3RlbUNvbnRyb2xzPzogU3lzdGVtQ29udHJvbFtdXG4vKipcbiAqIFdoZW4gdGhpcyBwYXJhbWV0ZXIgaXMgYGB0cnVlYGAsIHlvdSBjYW4gZGVwbG95IGNvbnRhaW5lcml6ZWQgYXBwbGljYXRpb25zIHRoYXQgcmVxdWlyZSBgYHN0ZGluYGAgb3IgYSBgYHR0eWBgIHRvIGJlIGFsbG9jYXRlZC4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYE9wZW5TdGRpbmBgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kIGFuZCB0aGUgYGAtLWludGVyYWN0aXZlYGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKi9cbkludGVyYWN0aXZlPzogYm9vbGVhblxuLyoqXG4gKiBBIGxpc3Qgb2YgRE5TIHNlYXJjaCBkb21haW5zIHRoYXQgYXJlIHByZXNlbnRlZCB0byB0aGUgY29udGFpbmVyLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgRG5zU2VhcmNoYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYC0tZG5zLXNlYXJjaGBgIG9wdGlvbiB0byBkb2NrZXIgcnVuLlxuICogICBUaGlzIHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkIGZvciBXaW5kb3dzIGNvbnRhaW5lcnMuXG4gKi9cbkRuc1NlYXJjaERvbWFpbnM/OiBzdHJpbmdbXVxuLyoqXG4gKiBBIGxpc3Qgb2YgQVJOcyBpbiBTU00gb3IgQW1hem9uIFMzIHRvIGEgY3JlZGVudGlhbCBzcGVjIChgYENyZWRTcGVjYGApIGZpbGUgdGhhdCBjb25maWd1cmVzIHRoZSBjb250YWluZXIgZm9yIEFjdGl2ZSBEaXJlY3RvcnkgYXV0aGVudGljYXRpb24uIFdlIHJlY29tbWVuZCB0aGF0IHlvdSB1c2UgdGhpcyBwYXJhbWV0ZXIgaW5zdGVhZCBvZiB0aGUgYGBkb2NrZXJTZWN1cml0eU9wdGlvbnNgYC4gVGhlIG1heGltdW0gbnVtYmVyIG9mIEFSTnMgaXMgMS5cbiAqICBUaGVyZSBhcmUgdHdvIGZvcm1hdHMgZm9yIGVhY2ggQVJOLlxuICogICArIGNyZWRlbnRpYWxzcGVjZG9tYWlubGVzczpNeUFSTiBZb3UgdXNlIGNyZWRlbnRpYWxzcGVjZG9tYWlubGVzczpNeUFSTiB0byBwcm92aWRlIGEgQ3JlZFNwZWMgd2l0aCBhbiBhZGRpdGlvbmFsIHNlY3Rpb24gZm9yIGEgc2VjcmV0IGluIC4gWW91IHByb3ZpZGUgdGhlIGxvZ2luIGNyZWRlbnRpYWxzIHRvIHRoZSBkb21haW4gaW4gdGhlIHNlY3JldC4gRWFjaCB0YXNrIHRoYXQgcnVucyBvbiBhbnkgY29udGFpbmVyIGluc3RhbmNlIGNhbiBqb2luIGRpZmZlcmVudCBkb21haW5zLiBZb3UgY2FuIHVzZSB0aGlzIGZvcm1hdCB3aXRob3V0IGpvaW5pbmcgdGhlIGNvbnRhaW5lciBpbnN0YW5jZSB0byBhIGRvbWFpbi4gKyBjcmVkZW50aWFsc3BlYzpNeUFSTiBZb3UgdXNlIGNyZWRlbnRpYWxzcGVjOk15QVJOIHRvIHByb3ZpZGUgYSBDcmVkU3BlYyBmb3IgYSBzaW5nbGUgZG9tYWluLiBZb3UgbXVzdCBqb2luIHRoZSBjb250YWluZXIgaW5zdGFuY2UgdG8gdGhlIGRvbWFpbiBiZWZvcmUgeW91IHN0YXJ0IGFueSB0YXNrcyB0aGF0IHVzZSB0aGlzIHRhc2sgZGVmaW5pdGlvbi4gXG4gKiAgSW4gYm90aCBmb3JtYXRzLCByZXBsYWNlIGBgTXlBUk5gYCB3aXRoIHRoZSBBUk4gaW4gU1NNIG9yIEFtYXpvbiBTMy5cbiAqICBJZiB5b3UgcHJvdmlkZSBhIGBgY3JlZGVudGlhbHNwZWNkb21haW5sZXNzOk15QVJOYGAsIHRoZSBgYGNyZWRzcGVjYGAgbXVzdCBwcm92aWRlIGEgQVJOIGluIEFTTWxvbmcgZm9yIGEgc2VjcmV0IGNvbnRhaW5pbmcgdGhlIHVzZXJuYW1lLCBwYXNzd29yZCwgYW5kIHRoZSBkb21haW4gdG8gY29ubmVjdCB0by4gRm9yIGJldHRlciBzZWN1cml0eSwgdGhlIGluc3RhbmNlIGlzbid0IGpvaW5lZCB0byB0aGUgZG9tYWluIGZvciBkb21haW5sZXNzIGF1dGhlbnRpY2F0aW9uLiBPdGhlciBhcHBsaWNhdGlvbnMgb24gdGhlIGluc3RhbmNlIGNhbid0IHVzZSB0aGUgZG9tYWlubGVzcyBjcmVkZW50aWFscy4gWW91IGNhbiB1c2UgdGhpcyBwYXJhbWV0ZXIgdG8gcnVuIHRhc2tzIG9uIHRoZSBzYW1lIGluc3RhbmNlLCBldmVuIGl0IHRoZSB0YXNrcyBuZWVkIHRvIGpvaW4gZGlmZmVyZW50IGRvbWFpbnMuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1VzaW5nIGdNU0FzIGZvciBXaW5kb3dzIENvbnRhaW5lcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3dpbmRvd3MtZ21zYS5odG1sKSBhbmQgW1VzaW5nIGdNU0FzIGZvciBMaW51eCBDb250YWluZXJzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9saW51eC1nbXNhLmh0bWwpLlxuICovXG5DcmVkZW50aWFsU3BlY3M/OiBzdHJpbmdbXVxuLyoqXG4gKiBBIGxpc3Qgb2YgYGB1bGltaXRzYGAgdG8gc2V0IGluIHRoZSBjb250YWluZXIuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBVbGltaXRzYGAgaW4gdGhlIFtDcmVhdGUgYSBjb250YWluZXJdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9odHRwczovL2RvY3MuZG9ja2VyLmNvbS9lbmdpbmUvYXBpL3YxLjM1LyNvcGVyYXRpb24vQ29udGFpbmVyQ3JlYXRlKSBzZWN0aW9uIG9mIHRoZSBbRG9ja2VyIFJlbW90ZSBBUEldKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9odHRwczovL2RvY3MuZG9ja2VyLmNvbS9lbmdpbmUvYXBpL3YxLjM1LykgYW5kIHRoZSBgYC0tdWxpbWl0YGAgb3B0aW9uIHRvIFtkb2NrZXIgcnVuXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaHR0cHM6Ly9kb2NzLmRvY2tlci5jb20vZW5naW5lL3JlZmVyZW5jZS9ydW4vKS4gVmFsaWQgbmFtaW5nIHZhbHVlcyBhcmUgZGlzcGxheWVkIGluIHRoZSBbVWxpbWl0XShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1VsaW1pdC5odG1sKSBkYXRhIHR5cGUuIFRoaXMgcGFyYW1ldGVyIHJlcXVpcmVzIHZlcnNpb24gMS4xOCBvZiB0aGUgRG9ja2VyIFJlbW90ZSBBUEkgb3IgZ3JlYXRlciBvbiB5b3VyIGNvbnRhaW5lciBpbnN0YW5jZS4gVG8gY2hlY2sgdGhlIERvY2tlciBSZW1vdGUgQVBJIHZlcnNpb24gb24geW91ciBjb250YWluZXIgaW5zdGFuY2UsIGxvZyBpbiB0byB5b3VyIGNvbnRhaW5lciBpbnN0YW5jZSBhbmQgcnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZDogYGBzdWRvIGRvY2tlciB2ZXJzaW9uIC0tZm9ybWF0ICd7ey5TZXJ2ZXIuQVBJVmVyc2lvbn19J2BgIFxuICogICBUaGlzIHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkIGZvciBXaW5kb3dzIGNvbnRhaW5lcnMuXG4gKi9cblVsaW1pdHM/OiBVbGltaXRbXVxuLyoqXG4gKiBUaW1lIGR1cmF0aW9uIChpbiBzZWNvbmRzKSB0byB3YWl0IGJlZm9yZSB0aGUgY29udGFpbmVyIGlzIGZvcmNlZnVsbHkga2lsbGVkIGlmIGl0IGRvZXNuJ3QgZXhpdCBub3JtYWxseSBvbiBpdHMgb3duLlxuICogIEZvciB0YXNrcyB1c2luZyB0aGUgRmFyZ2F0ZSBsYXVuY2ggdHlwZSwgdGhlIHRhc2sgb3Igc2VydmljZSByZXF1aXJlcyB0aGUgZm9sbG93aW5nIHBsYXRmb3JtczpcbiAqICAgKyAgTGludXggcGxhdGZvcm0gdmVyc2lvbiBgYDEuMy4wYGAgb3IgbGF0ZXIuXG4gKiAgICsgIFdpbmRvd3MgcGxhdGZvcm0gdmVyc2lvbiBgYDEuMC4wYGAgb3IgbGF0ZXIuXG4gKiAgIFxuICogIEZvciB0YXNrcyB0aGF0IHVzZSB0aGUgRmFyZ2F0ZSBsYXVuY2ggdHlwZSwgdGhlIG1heCBzdG9wIHRpbWVvdXQgdmFsdWUgaXMgMTIwIHNlY29uZHMgYW5kIGlmIHRoZSBwYXJhbWV0ZXIgaXMgbm90IHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgdmFsdWUgb2YgMzAgc2Vjb25kcyBpcyB1c2VkLlxuICogIEZvciB0YXNrcyB0aGF0IHVzZSB0aGUgRUMyIGxhdW5jaCB0eXBlLCBpZiB0aGUgYGBzdG9wVGltZW91dGBgIHBhcmFtZXRlciBpc24ndCBzcGVjaWZpZWQsIHRoZSB2YWx1ZSBzZXQgZm9yIHRoZSBBbWF6b24gRUNTIGNvbnRhaW5lciBhZ2VudCBjb25maWd1cmF0aW9uIHZhcmlhYmxlIGBgRUNTX0NPTlRBSU5FUl9TVE9QX1RJTUVPVVRgYCBpcyB1c2VkLiBJZiBuZWl0aGVyIHRoZSBgYHN0b3BUaW1lb3V0YGAgcGFyYW1ldGVyIG9yIHRoZSBgYEVDU19DT05UQUlORVJfU1RPUF9USU1FT1VUYGAgYWdlbnQgY29uZmlndXJhdGlvbiB2YXJpYWJsZSBhcmUgc2V0LCB0aGVuIHRoZSBkZWZhdWx0IHZhbHVlcyBvZiAzMCBzZWNvbmRzIGZvciBMaW51eCBjb250YWluZXJzIGFuZCAzMCBzZWNvbmRzIG9uIFdpbmRvd3MgY29udGFpbmVycyBhcmUgdXNlZC4gWW91ciBjb250YWluZXIgaW5zdGFuY2VzIHJlcXVpcmUgYXQgbGVhc3QgdmVyc2lvbiAxLjI2LjAgb2YgdGhlIGNvbnRhaW5lciBhZ2VudCB0byB1c2UgYSBjb250YWluZXIgc3RvcCB0aW1lb3V0IHZhbHVlLiBIb3dldmVyLCB3ZSByZWNvbW1lbmQgdXNpbmcgdGhlIGxhdGVzdCBjb250YWluZXIgYWdlbnQgdmVyc2lvbi4gRm9yIGluZm9ybWF0aW9uIGFib3V0IGNoZWNraW5nIHlvdXIgYWdlbnQgdmVyc2lvbiBhbmQgdXBkYXRpbmcgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uLCBzZWUgW1VwZGF0aW5nIHRoZSBBbWF6b24gRUNTIENvbnRhaW5lciBBZ2VudF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvZWNzLWFnZW50LXVwZGF0ZS5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouIElmIHlvdSdyZSB1c2luZyBhbiBBbWF6b24gRUNTLW9wdGltaXplZCBMaW51eCBBTUksIHlvdXIgaW5zdGFuY2UgbmVlZHMgYXQgbGVhc3QgdmVyc2lvbiAxLjI2LjAtMSBvZiB0aGUgYGBlY3MtaW5pdGBgIHBhY2thZ2UuIElmIHlvdXIgY29udGFpbmVyIGluc3RhbmNlcyBhcmUgbGF1bmNoZWQgZnJvbSB2ZXJzaW9uIGBgMjAxOTAzMDFgYCBvciBsYXRlciwgdGhlbiB0aGV5IGNvbnRhaW4gdGhlIHJlcXVpcmVkIHZlcnNpb25zIG9mIHRoZSBjb250YWluZXIgYWdlbnQgYW5kIGBgZWNzLWluaXRgYC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQW1hem9uIEVDUy1vcHRpbWl6ZWQgTGludXggQU1JXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9lY3Mtb3B0aW1pemVkX0FNSS5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKiAgVGhlIHZhbGlkIHZhbHVlcyBmb3IgRmFyZ2F0ZSBhcmUgMi0xMjAgc2Vjb25kcy5cbiAqL1xuU3RvcFRpbWVvdXQ/OiBudW1iZXJcbi8qKlxuICogVGhlIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHJ1biBjb21tYW5kcyBpbnNpZGUgdGhlIGNvbnRhaW5lciBpbi4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYFdvcmtpbmdEaXJgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS13b3JrZGlyYGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKi9cbldvcmtpbmdEaXJlY3Rvcnk/OiBzdHJpbmdcbi8qKlxuICogVGhlIHNvZnQgbGltaXQgKGluIE1pQikgb2YgbWVtb3J5IHRvIHJlc2VydmUgZm9yIHRoZSBjb250YWluZXIuIFdoZW4gc3lzdGVtIG1lbW9yeSBpcyB1bmRlciBoZWF2eSBjb250ZW50aW9uLCBEb2NrZXIgYXR0ZW1wdHMgdG8ga2VlcCB0aGUgY29udGFpbmVyIG1lbW9yeSB0byB0aGlzIHNvZnQgbGltaXQuIEhvd2V2ZXIsIHlvdXIgY29udGFpbmVyIGNhbiBjb25zdW1lIG1vcmUgbWVtb3J5IHdoZW4gaXQgbmVlZHMgdG8sIHVwIHRvIGVpdGhlciB0aGUgaGFyZCBsaW1pdCBzcGVjaWZpZWQgd2l0aCB0aGUgYGBtZW1vcnlgYCBwYXJhbWV0ZXIgKGlmIGFwcGxpY2FibGUpLCBvciBhbGwgb2YgdGhlIGF2YWlsYWJsZSBtZW1vcnkgb24gdGhlIGNvbnRhaW5lciBpbnN0YW5jZSwgd2hpY2hldmVyIGNvbWVzIGZpcnN0LiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgTWVtb3J5UmVzZXJ2YXRpb25gYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS1tZW1vcnktcmVzZXJ2YXRpb25gYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi5cbiAqICBJZiBhIHRhc2stbGV2ZWwgbWVtb3J5IHZhbHVlIGlzIG5vdCBzcGVjaWZpZWQsIHlvdSBtdXN0IHNwZWNpZnkgYSBub24temVybyBpbnRlZ2VyIGZvciBvbmUgb3IgYm90aCBvZiBgYG1lbW9yeWBgIG9yIGBgbWVtb3J5UmVzZXJ2YXRpb25gYCBpbiBhIGNvbnRhaW5lciBkZWZpbml0aW9uLiBJZiB5b3Ugc3BlY2lmeSBib3RoLCBgYG1lbW9yeWBgIG11c3QgYmUgZ3JlYXRlciB0aGFuIGBgbWVtb3J5UmVzZXJ2YXRpb25gYC4gSWYgeW91IHNwZWNpZnkgYGBtZW1vcnlSZXNlcnZhdGlvbmBgLCB0aGVuIHRoYXQgdmFsdWUgaXMgc3VidHJhY3RlZCBmcm9tIHRoZSBhdmFpbGFibGUgbWVtb3J5IHJlc291cmNlcyBmb3IgdGhlIGNvbnRhaW5lciBpbnN0YW5jZSB3aGVyZSB0aGUgY29udGFpbmVyIGlzIHBsYWNlZC4gT3RoZXJ3aXNlLCB0aGUgdmFsdWUgb2YgYGBtZW1vcnlgYCBpcyB1c2VkLlxuICogIEZvciBleGFtcGxlLCBpZiB5b3VyIGNvbnRhaW5lciBub3JtYWxseSB1c2VzIDEyOCBNaUIgb2YgbWVtb3J5LCBidXQgb2NjYXNpb25hbGx5IGJ1cnN0cyB0byAyNTYgTWlCIG9mIG1lbW9yeSBmb3Igc2hvcnQgcGVyaW9kcyBvZiB0aW1lLCB5b3UgY2FuIHNldCBhIGBgbWVtb3J5UmVzZXJ2YXRpb25gYCBvZiAxMjggTWlCLCBhbmQgYSBgYG1lbW9yeWBgIGhhcmQgbGltaXQgb2YgMzAwIE1pQi4gVGhpcyBjb25maWd1cmF0aW9uIHdvdWxkIGFsbG93IHRoZSBjb250YWluZXIgdG8gb25seSByZXNlcnZlIDEyOCBNaUIgb2YgbWVtb3J5IGZyb20gdGhlIHJlbWFpbmluZyByZXNvdXJjZXMgb24gdGhlIGNvbnRhaW5lciBpbnN0YW5jZSwgYnV0IGFsc28gYWxsb3cgdGhlIGNvbnRhaW5lciB0byBjb25zdW1lIG1vcmUgbWVtb3J5IHJlc291cmNlcyB3aGVuIG5lZWRlZC5cbiAqICBUaGUgRG9ja2VyIDIwLjEwLjAgb3IgbGF0ZXIgZGFlbW9uIHJlc2VydmVzIGEgbWluaW11bSBvZiA2IE1pQiBvZiBtZW1vcnkgZm9yIGEgY29udGFpbmVyLiBTbywgZG9uJ3Qgc3BlY2lmeSBsZXNzIHRoYW4gNiBNaUIgb2YgbWVtb3J5IGZvciB5b3VyIGNvbnRhaW5lcnMuIFxuICogIFRoZSBEb2NrZXIgMTkuMDMuMTMtY2Ugb3IgZWFybGllciBkYWVtb24gcmVzZXJ2ZXMgYSBtaW5pbXVtIG9mIDQgTWlCIG9mIG1lbW9yeSBmb3IgYSBjb250YWluZXIuIFNvLCBkb24ndCBzcGVjaWZ5IGxlc3MgdGhhbiA0IE1pQiBvZiBtZW1vcnkgZm9yIHlvdXIgY29udGFpbmVycy5cbiAqL1xuTWVtb3J5UmVzZXJ2YXRpb24/OiBudW1iZXJcblJlcG9zaXRvcnlDcmVkZW50aWFscz86IFJlcG9zaXRvcnlDcmVkZW50aWFsc1xuLyoqXG4gKiBBIGxpc3Qgb2YgaG9zdG5hbWVzIGFuZCBJUCBhZGRyZXNzIG1hcHBpbmdzIHRvIGFwcGVuZCB0byB0aGUgYGAvZXRjL2hvc3RzYGAgZmlsZSBvbiB0aGUgY29udGFpbmVyLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgRXh0cmFIb3N0c2BgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kIGFuZCB0aGUgYGAtLWFkZC1ob3N0YGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKiAgIFRoaXMgcGFyYW1ldGVyIGlzbid0IHN1cHBvcnRlZCBmb3IgV2luZG93cyBjb250YWluZXJzIG9yIHRhc2tzIHRoYXQgdXNlIHRoZSBgYGF3c3ZwY2BgIG5ldHdvcmsgbW9kZS5cbiAqL1xuRXh0cmFIb3N0cz86IEhvc3RFbnRyeVtdXG4vKipcbiAqIFRoZSBob3N0bmFtZSB0byB1c2UgZm9yIHlvdXIgY29udGFpbmVyLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgSG9zdG5hbWVgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS1ob3N0bmFtZWBgIG9wdGlvbiB0byBkb2NrZXIgcnVuLlxuICogICBUaGUgYGBob3N0bmFtZWBgIHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkIGlmIHlvdSdyZSB1c2luZyB0aGUgYGBhd3N2cGNgYCBuZXR3b3JrIG1vZGUuXG4gKi9cbkhvc3RuYW1lPzogc3RyaW5nXG5MaW51eFBhcmFtZXRlcnM/OiBMaW51eFBhcmFtZXRlcnNcbi8qKlxuICogU3BlY2lmaWVzIHdoZXRoZXIgQW1hem9uIEVDUyB3aWxsIHJlc29sdmUgdGhlIGNvbnRhaW5lciBpbWFnZSB0YWcgcHJvdmlkZWQgaW4gdGhlIGNvbnRhaW5lciBkZWZpbml0aW9uIHRvIGFuIGltYWdlIGRpZ2VzdC4gQnkgZGVmYXVsdCwgdGhlIHZhbHVlIGlzIGBgZW5hYmxlZGBgLiBJZiB5b3Ugc2V0IHRoZSB2YWx1ZSBmb3IgYSBjb250YWluZXIgYXMgYGBkaXNhYmxlZGBgLCBBbWF6b24gRUNTIHdpbGwgbm90IHJlc29sdmUgdGhlIHByb3ZpZGVkIGNvbnRhaW5lciBpbWFnZSB0YWcgdG8gYSBkaWdlc3QgYW5kIHdpbGwgdXNlIHRoZSBvcmlnaW5hbCBpbWFnZSBVUkkgc3BlY2lmaWVkIGluIHRoZSBjb250YWluZXIgZGVmaW5pdGlvbiBmb3IgZGVwbG95bWVudC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgY29udGFpbmVyIGltYWdlIHJlc29sdXRpb24sIHNlZSBbQ29udGFpbmVyIGltYWdlIHJlc29sdXRpb25dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2RlcGxveW1lbnQtdHlwZS1lY3MuaHRtbCNkZXBsb3ltZW50LWNvbnRhaW5lci1pbWFnZS1zdGFiaWxpdHkpIGluIHRoZSAqQW1hem9uIEVDUyBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5WZXJzaW9uQ29uc2lzdGVuY3k/OiAoXCJlbmFibGVkXCIgfCBcImRpc2FibGVkXCIpXG5SZXN0YXJ0UG9saWN5PzogUmVzdGFydFBvbGljeVxuLyoqXG4gKiBXaGVuIHRoaXMgcGFyYW1ldGVyIGlzIHRydWUsIG5ldHdvcmtpbmcgaXMgb2ZmIHdpdGhpbiB0aGUgY29udGFpbmVyLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgTmV0d29ya0Rpc2FibGVkYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQuXG4gKiAgIFRoaXMgcGFyYW1ldGVyIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIFdpbmRvd3MgY29udGFpbmVycy5cbiAqL1xuRGlzYWJsZU5ldHdvcmtpbmc/OiBib29sZWFuXG4vKipcbiAqIFdoZW4gdGhpcyBwYXJhbWV0ZXIgaXMgYGB0cnVlYGAsIGEgVFRZIGlzIGFsbG9jYXRlZC4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYFR0eWBgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kIGFuZCB0aGUgYGAtLXR0eWBgIG9wdGlvbiB0byBkb2NrZXIgcnVuLlxuICovXG5Qc2V1ZG9UZXJtaW5hbD86IGJvb2xlYW5cbi8qKlxuICogVGhlIG1vdW50IHBvaW50cyBmb3IgZGF0YSB2b2x1bWVzIGluIHlvdXIgY29udGFpbmVyLlxuICogIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBWb2x1bWVzYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYC0tdm9sdW1lYGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKiAgV2luZG93cyBjb250YWluZXJzIGNhbiBtb3VudCB3aG9sZSBkaXJlY3RvcmllcyBvbiB0aGUgc2FtZSBkcml2ZSBhcyBgYCRlbnY6UHJvZ3JhbURhdGFgYC4gV2luZG93cyBjb250YWluZXJzIGNhbid0IG1vdW50IGRpcmVjdG9yaWVzIG9uIGEgZGlmZmVyZW50IGRyaXZlLCBhbmQgbW91bnQgcG9pbnQgY2FuJ3QgYmUgYWNyb3NzIGRyaXZlcy5cbiAqL1xuTW91bnRQb2ludHM/OiBNb3VudFBvaW50W11cbi8qKlxuICogVGhlIGRlcGVuZGVuY2llcyBkZWZpbmVkIGZvciBjb250YWluZXIgc3RhcnR1cCBhbmQgc2h1dGRvd24uIEEgY29udGFpbmVyIGNhbiBjb250YWluIG11bHRpcGxlIGRlcGVuZGVuY2llcy4gV2hlbiBhIGRlcGVuZGVuY3kgaXMgZGVmaW5lZCBmb3IgY29udGFpbmVyIHN0YXJ0dXAsIGZvciBjb250YWluZXIgc2h1dGRvd24gaXQgaXMgcmV2ZXJzZWQuXG4gKiAgRm9yIHRhc2tzIHVzaW5nIHRoZSBFQzIgbGF1bmNoIHR5cGUsIHRoZSBjb250YWluZXIgaW5zdGFuY2VzIHJlcXVpcmUgYXQgbGVhc3QgdmVyc2lvbiAxLjI2LjAgb2YgdGhlIGNvbnRhaW5lciBhZ2VudCB0byB0dXJuIG9uIGNvbnRhaW5lciBkZXBlbmRlbmNpZXMuIEhvd2V2ZXIsIHdlIHJlY29tbWVuZCB1c2luZyB0aGUgbGF0ZXN0IGNvbnRhaW5lciBhZ2VudCB2ZXJzaW9uLiBGb3IgaW5mb3JtYXRpb24gYWJvdXQgY2hlY2tpbmcgeW91ciBhZ2VudCB2ZXJzaW9uIGFuZCB1cGRhdGluZyB0byB0aGUgbGF0ZXN0IHZlcnNpb24sIHNlZSBbVXBkYXRpbmcgdGhlIEFtYXpvbiBFQ1MgQ29udGFpbmVyIEFnZW50XShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9lY3MtYWdlbnQtdXBkYXRlLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi4gSWYgeW91J3JlIHVzaW5nIGFuIEFtYXpvbiBFQ1Mtb3B0aW1pemVkIExpbnV4IEFNSSwgeW91ciBpbnN0YW5jZSBuZWVkcyBhdCBsZWFzdCB2ZXJzaW9uIDEuMjYuMC0xIG9mIHRoZSBgYGVjcy1pbml0YGAgcGFja2FnZS4gSWYgeW91ciBjb250YWluZXIgaW5zdGFuY2VzIGFyZSBsYXVuY2hlZCBmcm9tIHZlcnNpb24gYGAyMDE5MDMwMWBgIG9yIGxhdGVyLCB0aGVuIHRoZXkgY29udGFpbiB0aGUgcmVxdWlyZWQgdmVyc2lvbnMgb2YgdGhlIGNvbnRhaW5lciBhZ2VudCBhbmQgYGBlY3MtaW5pdGBgLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtBbWF6b24gRUNTLW9wdGltaXplZCBMaW51eCBBTUldKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2Vjcy1vcHRpbWl6ZWRfQU1JLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICBGb3IgdGFza3MgdXNpbmcgdGhlIEZhcmdhdGUgbGF1bmNoIHR5cGUsIHRoZSB0YXNrIG9yIHNlcnZpY2UgcmVxdWlyZXMgdGhlIGZvbGxvd2luZyBwbGF0Zm9ybXM6XG4gKiAgICsgIExpbnV4IHBsYXRmb3JtIHZlcnNpb24gYGAxLjMuMGBgIG9yIGxhdGVyLlxuICogICArICBXaW5kb3dzIHBsYXRmb3JtIHZlcnNpb24gYGAxLjAuMGBgIG9yIGxhdGVyLlxuICogICBcbiAqICBJZiB0aGUgdGFzayBkZWZpbml0aW9uIGlzIHVzZWQgaW4gYSBibHVlL2dyZWVuIGRlcGxveW1lbnQgdGhhdCB1c2VzIFtBV1M6OkNvZGVEZXBsb3k6OkRlcGxveW1lbnRHcm91cCBCbHVlR3JlZW5EZXBsb3ltZW50Q29uZmlndXJhdGlvbl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvYXdzLXByb3BlcnRpZXMtY29kZWRlcGxveS1kZXBsb3ltZW50Z3JvdXAtYmx1ZWdyZWVuZGVwbG95bWVudGNvbmZpZ3VyYXRpb24uaHRtbCksIHRoZSBgYGRlcGVuZHNPbmBgIHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgW0lzc3VlICM2ODBdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9odHRwczovL2dpdGh1Yi5jb20vYXdzLWNsb3VkZm9ybWF0aW9uL2Nsb3VkZm9ybWF0aW9uLWNvdmVyYWdlLXJvYWRtYXAvaXNzdWVzLzY4MCkgb24gdGhlIG9uIHRoZSBHaXRIdWIgd2Vic2l0ZS5cbiAqL1xuRGVwZW5kc09uPzogQ29udGFpbmVyRGVwZW5kZW5jeVtdXG4vKipcbiAqIEEga2V5L3ZhbHVlIG1hcCBvZiBsYWJlbHMgdG8gYWRkIHRvIHRoZSBjb250YWluZXIuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBMYWJlbHNgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS1sYWJlbGBgIG9wdGlvbiB0byBkb2NrZXIgcnVuLiBUaGlzIHBhcmFtZXRlciByZXF1aXJlcyB2ZXJzaW9uIDEuMTggb2YgdGhlIERvY2tlciBSZW1vdGUgQVBJIG9yIGdyZWF0ZXIgb24geW91ciBjb250YWluZXIgaW5zdGFuY2UuIFRvIGNoZWNrIHRoZSBEb2NrZXIgUmVtb3RlIEFQSSB2ZXJzaW9uIG9uIHlvdXIgY29udGFpbmVyIGluc3RhbmNlLCBsb2cgaW4gdG8geW91ciBjb250YWluZXIgaW5zdGFuY2UgYW5kIHJ1biB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6IGBgc3VkbyBkb2NrZXIgdmVyc2lvbiAtLWZvcm1hdCAne3suU2VydmVyLkFQSVZlcnNpb259fSdgYFxuICovXG5Eb2NrZXJMYWJlbHM/OiB7XG4vKipcbiAqIFRoaXMgaW50ZXJmYWNlIHdhcyByZWZlcmVuY2VkIGJ5IGB1bmRlZmluZWRgJ3MgSlNPTi1TY2hlbWEgZGVmaW5pdGlvblxuICogdmlhIHRoZSBgcGF0dGVyblByb3BlcnR5YCBcIi57MSx9XCIuXG4gKi9cbltrOiBzdHJpbmddOiBzdHJpbmdcbn1cbi8qKlxuICogVGhlIGxpc3Qgb2YgcG9ydCBtYXBwaW5ncyBmb3IgdGhlIGNvbnRhaW5lci4gUG9ydCBtYXBwaW5ncyBhbGxvdyBjb250YWluZXJzIHRvIGFjY2VzcyBwb3J0cyBvbiB0aGUgaG9zdCBjb250YWluZXIgaW5zdGFuY2UgdG8gc2VuZCBvciByZWNlaXZlIHRyYWZmaWMuXG4gKiAgRm9yIHRhc2sgZGVmaW5pdGlvbnMgdGhhdCB1c2UgdGhlIGBgYXdzdnBjYGAgbmV0d29yayBtb2RlLCB5b3Ugc2hvdWxkIG9ubHkgc3BlY2lmeSB0aGUgYGBjb250YWluZXJQb3J0YGAuIFRoZSBgYGhvc3RQb3J0YGAgY2FuIGJlIGxlZnQgYmxhbmsgb3IgaXQgbXVzdCBiZSB0aGUgc2FtZSB2YWx1ZSBhcyB0aGUgYGBjb250YWluZXJQb3J0YGAuXG4gKiAgUG9ydCBtYXBwaW5ncyBvbiBXaW5kb3dzIHVzZSB0aGUgYGBOZXROQVRgYCBnYXRld2F5IGFkZHJlc3MgcmF0aGVyIHRoYW4gYGBsb2NhbGhvc3RgYC4gVGhlcmUgaXMgbm8gbG9vcGJhY2sgZm9yIHBvcnQgbWFwcGluZ3Mgb24gV2luZG93cywgc28geW91IGNhbm5vdCBhY2Nlc3MgYSBjb250YWluZXIncyBtYXBwZWQgcG9ydCBmcm9tIHRoZSBob3N0IGl0c2VsZi4gXG4gKiAgVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYFBvcnRCaW5kaW5nc2BgIGluIHRoZSBbQ3JlYXRlIGEgY29udGFpbmVyXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaHR0cHM6Ly9kb2NzLmRvY2tlci5jb20vZW5naW5lL2FwaS92MS4zNS8jb3BlcmF0aW9uL0NvbnRhaW5lckNyZWF0ZSkgc2VjdGlvbiBvZiB0aGUgW0RvY2tlciBSZW1vdGUgQVBJXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaHR0cHM6Ly9kb2NzLmRvY2tlci5jb20vZW5naW5lL2FwaS92MS4zNS8pIGFuZCB0aGUgYGAtLXB1Ymxpc2hgYCBvcHRpb24gdG8gW2RvY2tlciBydW5dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9odHRwczovL2RvY3MuZG9ja2VyLmNvbS9lbmdpbmUvcmVmZXJlbmNlL3J1bi8pLiBJZiB0aGUgbmV0d29yayBtb2RlIG9mIGEgdGFzayBkZWZpbml0aW9uIGlzIHNldCB0byBgYG5vbmVgYCwgdGhlbiB5b3UgY2FuJ3Qgc3BlY2lmeSBwb3J0IG1hcHBpbmdzLiBJZiB0aGUgbmV0d29yayBtb2RlIG9mIGEgdGFzayBkZWZpbml0aW9uIGlzIHNldCB0byBgYGhvc3RgYCwgdGhlbiBob3N0IHBvcnRzIG11c3QgZWl0aGVyIGJlIHVuZGVmaW5lZCBvciB0aGV5IG11c3QgbWF0Y2ggdGhlIGNvbnRhaW5lciBwb3J0IGluIHRoZSBwb3J0IG1hcHBpbmcuXG4gKiAgIEFmdGVyIGEgdGFzayByZWFjaGVzIHRoZSBgYFJVTk5JTkdgYCBzdGF0dXMsIG1hbnVhbCBhbmQgYXV0b21hdGljIGhvc3QgYW5kIGNvbnRhaW5lciBwb3J0IGFzc2lnbm1lbnRzIGFyZSB2aXNpYmxlIGluIHRoZSAqTmV0d29yayBCaW5kaW5ncyogc2VjdGlvbiBvZiBhIGNvbnRhaW5lciBkZXNjcmlwdGlvbiBmb3IgYSBzZWxlY3RlZCB0YXNrIGluIHRoZSBBbWF6b24gRUNTIGNvbnNvbGUuIFRoZSBhc3NpZ25tZW50cyBhcmUgYWxzbyB2aXNpYmxlIGluIHRoZSBgYG5ldHdvcmtCaW5kaW5nc2BgIHNlY3Rpb24gW0Rlc2NyaWJlVGFza3NdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVUYXNrcy5odG1sKSByZXNwb25zZXMuXG4gKi9cblBvcnRNYXBwaW5ncz86IFBvcnRNYXBwaW5nW11cbi8qKlxuICogVGhlIGNvbW1hbmQgdGhhdCdzIHBhc3NlZCB0byB0aGUgY29udGFpbmVyLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgQ21kYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYENPTU1BTkRgYCBwYXJhbWV0ZXIgdG8gZG9ja2VyIHJ1bi4gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGFyZ3VtZW50cywgZWFjaCBhcmd1bWVudCBpcyBhIHNlcGFyYXRlZCBzdHJpbmcgaW4gdGhlIGFycmF5LlxuICovXG5Db21tYW5kPzogc3RyaW5nW11cbi8qKlxuICogVGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBwYXNzIHRvIGEgY29udGFpbmVyLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgRW52YGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYC0tZW52YGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKiAgIFdlIGRvbid0IHJlY29tbWVuZCB0aGF0IHlvdSB1c2UgcGxhaW50ZXh0IGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3Igc2Vuc2l0aXZlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGNyZWRlbnRpYWwgZGF0YS5cbiAqL1xuRW52aXJvbm1lbnQ/OiBLZXlWYWx1ZVBhaXJbXVxuLyoqXG4gKiBUaGUgYGBsaW5rc2BgIHBhcmFtZXRlciBhbGxvd3MgY29udGFpbmVycyB0byBjb21tdW5pY2F0ZSB3aXRoIGVhY2ggb3RoZXIgd2l0aG91dCB0aGUgbmVlZCBmb3IgcG9ydCBtYXBwaW5ncy4gVGhpcyBwYXJhbWV0ZXIgaXMgb25seSBzdXBwb3J0ZWQgaWYgdGhlIG5ldHdvcmsgbW9kZSBvZiBhIHRhc2sgZGVmaW5pdGlvbiBpcyBgYGJyaWRnZWBgLiBUaGUgYGBuYW1lOmludGVybmFsTmFtZWBgIGNvbnN0cnVjdCBpcyBhbmFsb2dvdXMgdG8gYGBuYW1lOmFsaWFzYGAgaW4gRG9ja2VyIGxpbmtzLiBVcCB0byAyNTUgbGV0dGVycyAodXBwZXJjYXNlIGFuZCBsb3dlcmNhc2UpLCBudW1iZXJzLCB1bmRlcnNjb3JlcywgYW5kIGh5cGhlbnMgYXJlIGFsbG93ZWQuLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgTGlua3NgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS1saW5rYGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKiAgIFRoaXMgcGFyYW1ldGVyIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIFdpbmRvd3MgY29udGFpbmVycy5cbiAqICAgIENvbnRhaW5lcnMgdGhhdCBhcmUgY29sbG9jYXRlZCBvbiBhIHNpbmdsZSBjb250YWluZXIgaW5zdGFuY2UgbWF5IGJlIGFibGUgdG8gY29tbXVuaWNhdGUgd2l0aCBlYWNoIG90aGVyIHdpdGhvdXQgcmVxdWlyaW5nIGxpbmtzIG9yIGhvc3QgcG9ydCBtYXBwaW5ncy4gTmV0d29yayBpc29sYXRpb24gaXMgYWNoaWV2ZWQgb24gdGhlIGNvbnRhaW5lciBpbnN0YW5jZSB1c2luZyBzZWN1cml0eSBncm91cHMgYW5kIFZQQyBzZXR0aW5ncy5cbiAqL1xuTGlua3M/OiBzdHJpbmdbXVxufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzZWNyZXQgdG8gZXhwb3NlIHRvIHlvdXIgY29udGFpbmVyLiBTZWNyZXRzIGNhbiBiZSBleHBvc2VkIHRvIGEgY29udGFpbmVyIGluIHRoZSBmb2xsb3dpbmcgd2F5czpcbiAqICAgKyAgVG8gaW5qZWN0IHNlbnNpdGl2ZSBkYXRhIGludG8geW91ciBjb250YWluZXJzIGFzIGVudmlyb25tZW50IHZhcmlhYmxlcywgdXNlIHRoZSBgYHNlY3JldHNgYCBjb250YWluZXIgZGVmaW5pdGlvbiBwYXJhbWV0ZXIuXG4gKiAgICsgIFRvIHJlZmVyZW5jZSBzZW5zaXRpdmUgaW5mb3JtYXRpb24gaW4gdGhlIGxvZyBjb25maWd1cmF0aW9uIG9mIGEgY29udGFpbmVyLCB1c2UgdGhlIGBgc2VjcmV0T3B0aW9uc2BgIGNvbnRhaW5lciBkZWZpbml0aW9uIHBhcmFtZXRlci5cbiAqICAgXG4gKiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbU3BlY2lmeWluZyBzZW5zaXRpdmUgZGF0YV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvc3BlY2lmeWluZy1zZW5zaXRpdmUtZGF0YS5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VjcmV0IHtcbi8qKlxuICogVGhlIHNlY3JldCB0byBleHBvc2UgdG8gdGhlIGNvbnRhaW5lci4gVGhlIHN1cHBvcnRlZCB2YWx1ZXMgYXJlIGVpdGhlciB0aGUgZnVsbCBBUk4gb2YgdGhlIEFTTWxvbmcgc2VjcmV0IG9yIHRoZSBmdWxsIEFSTiBvZiB0aGUgcGFyYW1ldGVyIGluIHRoZSBTU00gUGFyYW1ldGVyIFN0b3JlLlxuICogIEZvciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVxdWlyZSBJQU1sb25nIHBlcm1pc3Npb25zLCBzZWUgW1JlcXVpcmVkIElBTSBwZXJtaXNzaW9ucyBmb3IgQW1hem9uIEVDUyBzZWNyZXRzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9zcGVjaWZ5aW5nLXNlbnNpdGl2ZS1kYXRhLXNlY3JldHMuaHRtbCNzZWNyZXRzLWlhbSkgKGZvciBTZWNyZXRzIE1hbmFnZXIpIG9yIFtSZXF1aXJlZCBJQU0gcGVybWlzc2lvbnMgZm9yIEFtYXpvbiBFQ1Mgc2VjcmV0c10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvc3BlY2lmeWluZy1zZW5zaXRpdmUtZGF0YS1wYXJhbWV0ZXJzLmh0bWwpIChmb3IgU3lzdGVtcyBNYW5hZ2VyIFBhcmFtZXRlciBzdG9yZSkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICogICBJZiB0aGUgU1NNIFBhcmFtZXRlciBTdG9yZSBwYXJhbWV0ZXIgZXhpc3RzIGluIHRoZSBzYW1lIFJlZ2lvbiBhcyB0aGUgdGFzayB5b3UncmUgbGF1bmNoaW5nLCB0aGVuIHlvdSBjYW4gdXNlIGVpdGhlciB0aGUgZnVsbCBBUk4gb3IgbmFtZSBvZiB0aGUgcGFyYW1ldGVyLiBJZiB0aGUgcGFyYW1ldGVyIGV4aXN0cyBpbiBhIGRpZmZlcmVudCBSZWdpb24sIHRoZW4gdGhlIGZ1bGwgQVJOIG11c3QgYmUgc3BlY2lmaWVkLlxuICovXG5WYWx1ZUZyb206IHN0cmluZ1xuLyoqXG4gKiBUaGUgbmFtZSBvZiB0aGUgc2VjcmV0LlxuICovXG5OYW1lOiBzdHJpbmdcbn1cbi8qKlxuICogVGhlIGNvbnRhaW5lciBoZWFsdGggY2hlY2sgY29tbWFuZCBhbmQgYXNzb2NpYXRlZCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgZm9yIHRoZSBjb250YWluZXIuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBIZWFsdGhDaGVja2BgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kIGFuZCB0aGUgYGBIRUFMVEhDSEVDS2BgIHBhcmFtZXRlciBvZiBkb2NrZXIgcnVuLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhlYWx0aENoZWNrIHtcbi8qKlxuICogQSBzdHJpbmcgYXJyYXkgcmVwcmVzZW50aW5nIHRoZSBjb21tYW5kIHRoYXQgdGhlIGNvbnRhaW5lciBydW5zIHRvIGRldGVybWluZSBpZiBpdCBpcyBoZWFsdGh5LiBUaGUgc3RyaW5nIGFycmF5IG11c3Qgc3RhcnQgd2l0aCBgYENNRGBgIHRvIHJ1biB0aGUgY29tbWFuZCBhcmd1bWVudHMgZGlyZWN0bHksIG9yIGBgQ01ELVNIRUxMYGAgdG8gcnVuIHRoZSBjb21tYW5kIHdpdGggdGhlIGNvbnRhaW5lcidzIGRlZmF1bHQgc2hlbGwuIFxuICogICBXaGVuIHlvdSB1c2UgdGhlIEFXUyBNYW5hZ2VtZW50IENvbnNvbGUgSlNPTiBwYW5lbCwgdGhlIENMSWxvbmcsIG9yIHRoZSBBUElzLCBlbmNsb3NlIHRoZSBsaXN0IG9mIGNvbW1hbmRzIGluIGRvdWJsZSBxdW90ZXMgYW5kIGJyYWNrZXRzLlxuICogICBgYFsgXCJDTUQtU0hFTExcIiwgXCJjdXJsIC1mIGh0dHA6Ly9sb2NhbGhvc3QvIHx8IGV4aXQgMVwiIF1gYCBcbiAqICBZb3UgZG9uJ3QgaW5jbHVkZSB0aGUgZG91YmxlIHF1b3RlcyBhbmQgYnJhY2tldHMgd2hlbiB5b3UgdXNlIHRoZSBBV1MgTWFuYWdlbWVudCBDb25zb2xlLlxuICogICBgYENNRC1TSEVMTCwgY3VybCAtZiBodHRwOi8vbG9jYWxob3N0LyB8fCBleGl0IDFgYCBcbiAqICBBbiBleGl0IGNvZGUgb2YgMCBpbmRpY2F0ZXMgc3VjY2VzcywgYW5kIG5vbi16ZXJvIGV4aXQgY29kZSBpbmRpY2F0ZXMgZmFpbHVyZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBgYEhlYWx0aENoZWNrYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQuXG4gKi9cbkNvbW1hbmQ/OiBzdHJpbmdbXVxuLyoqXG4gKiBUaGUgdGltZSBwZXJpb2QgaW4gc2Vjb25kcyB0byB3YWl0IGZvciBhIGhlYWx0aCBjaGVjayB0byBzdWNjZWVkIGJlZm9yZSBpdCBpcyBjb25zaWRlcmVkIGEgZmFpbHVyZS4gWW91IG1heSBzcGVjaWZ5IGJldHdlZW4gMiBhbmQgNjAgc2Vjb25kcy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgNS5cbiAqL1xuVGltZW91dD86IG51bWJlclxuLyoqXG4gKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIHJldHJ5IGEgZmFpbGVkIGhlYWx0aCBjaGVjayBiZWZvcmUgdGhlIGNvbnRhaW5lciBpcyBjb25zaWRlcmVkIHVuaGVhbHRoeS4gWW91IG1heSBzcGVjaWZ5IGJldHdlZW4gMSBhbmQgMTAgcmV0cmllcy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMy5cbiAqL1xuUmV0cmllcz86IG51bWJlclxuLyoqXG4gKiBUaGUgdGltZSBwZXJpb2QgaW4gc2Vjb25kcyBiZXR3ZWVuIGVhY2ggaGVhbHRoIGNoZWNrIGV4ZWN1dGlvbi4gWW91IG1heSBzcGVjaWZ5IGJldHdlZW4gNSBhbmQgMzAwIHNlY29uZHMuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDMwIHNlY29uZHMuXG4gKi9cbkludGVydmFsPzogbnVtYmVyXG4vKipcbiAqIFRoZSBvcHRpb25hbCBncmFjZSBwZXJpb2QgdG8gcHJvdmlkZSBjb250YWluZXJzIHRpbWUgdG8gYm9vdHN0cmFwIGJlZm9yZSBmYWlsZWQgaGVhbHRoIGNoZWNrcyBjb3VudCB0b3dhcmRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiByZXRyaWVzLiBZb3UgY2FuIHNwZWNpZnkgYmV0d2VlbiAwIGFuZCAzMDAgc2Vjb25kcy4gQnkgZGVmYXVsdCwgdGhlIGBgc3RhcnRQZXJpb2RgYCBpcyBvZmYuXG4gKiAgIElmIGEgaGVhbHRoIGNoZWNrIHN1Y2NlZWRzIHdpdGhpbiB0aGUgYGBzdGFydFBlcmlvZGBgLCB0aGVuIHRoZSBjb250YWluZXIgaXMgY29uc2lkZXJlZCBoZWFsdGh5IGFuZCBhbnkgc3Vic2VxdWVudCBmYWlsdXJlcyBjb3VudCB0b3dhcmQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJldHJpZXMuXG4gKi9cblN0YXJ0UGVyaW9kPzogbnVtYmVyXG59XG4vKipcbiAqIERldGFpbHMgb24gYSBkYXRhIHZvbHVtZSBmcm9tIGFub3RoZXIgY29udGFpbmVyIGluIHRoZSBzYW1lIHRhc2sgZGVmaW5pdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWb2x1bWVGcm9tIHtcbi8qKlxuICogSWYgdGhpcyB2YWx1ZSBpcyBgYHRydWVgYCwgdGhlIGNvbnRhaW5lciBoYXMgcmVhZC1vbmx5IGFjY2VzcyB0byB0aGUgdm9sdW1lLiBJZiB0aGlzIHZhbHVlIGlzIGBgZmFsc2VgYCwgdGhlbiB0aGUgY29udGFpbmVyIGNhbiB3cml0ZSB0byB0aGUgdm9sdW1lLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgYGZhbHNlYGAuXG4gKi9cblJlYWRPbmx5PzogYm9vbGVhblxuLyoqXG4gKiBUaGUgbmFtZSBvZiBhbm90aGVyIGNvbnRhaW5lciB3aXRoaW4gdGhlIHNhbWUgdGFzayBkZWZpbml0aW9uIHRvIG1vdW50IHZvbHVtZXMgZnJvbS5cbiAqL1xuU291cmNlQ29udGFpbmVyPzogc3RyaW5nXG59XG4vKipcbiAqIFRoZSBsb2cgY29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9uIGZvciB0aGUgY29udGFpbmVyLlxuICogIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBMb2dDb25maWdgYCBpbiB0aGUgZG9ja2VyIENyZWF0ZSBhIGNvbnRhaW5lciBjb21tYW5kIGFuZCB0aGUgYGAtLWxvZy1kcml2ZXJgYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi4gQnkgZGVmYXVsdCwgY29udGFpbmVycyB1c2UgdGhlIHNhbWUgbG9nZ2luZyBkcml2ZXIgdGhhdCB0aGUgRG9ja2VyIGRhZW1vbiB1c2VzLiBIb3dldmVyLCB0aGUgY29udGFpbmVyIG1heSB1c2UgYSBkaWZmZXJlbnQgbG9nZ2luZyBkcml2ZXIgdGhhbiB0aGUgRG9ja2VyIGRhZW1vbiBieSBzcGVjaWZ5aW5nIGEgbG9nIGRyaXZlciB3aXRoIHRoaXMgcGFyYW1ldGVyIGluIHRoZSBjb250YWluZXIgZGVmaW5pdGlvbi4gVG8gdXNlIGEgZGlmZmVyZW50IGxvZ2dpbmcgZHJpdmVyIGZvciBhIGNvbnRhaW5lciwgdGhlIGxvZyBzeXN0ZW0gbXVzdCBiZSBjb25maWd1cmVkIHByb3Blcmx5IG9uIHRoZSBjb250YWluZXIgaW5zdGFuY2UgKG9yIG9uIGEgZGlmZmVyZW50IGxvZyBzZXJ2ZXIgZm9yIHJlbW90ZSBsb2dnaW5nIG9wdGlvbnMpLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgb3B0aW9ucyBmb3IgZGlmZmVyZW50IHN1cHBvcnRlZCBsb2cgZHJpdmVycywgc2VlIFtDb25maWd1cmUgbG9nZ2luZyBkcml2ZXJzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaHR0cHM6Ly9kb2NzLmRvY2tlci5jb20vZW5naW5lL2FkbWluL2xvZ2dpbmcvb3ZlcnZpZXcvKSBpbiB0aGUgRG9ja2VyIGRvY3VtZW50YXRpb24uXG4gKiAgIEFtYXpvbiBFQ1MgY3VycmVudGx5IHN1cHBvcnRzIGEgc3Vic2V0IG9mIHRoZSBsb2dnaW5nIGRyaXZlcnMgYXZhaWxhYmxlIHRvIHRoZSBEb2NrZXIgZGFlbW9uIChzaG93biBpbiB0aGUgW0xvZ0NvbmZpZ3VyYXRpb25dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTG9nQ29uZmlndXJhdGlvbi5odG1sKSBkYXRhIHR5cGUpLiBBZGRpdGlvbmFsIGxvZyBkcml2ZXJzIG1heSBiZSBhdmFpbGFibGUgaW4gZnV0dXJlIHJlbGVhc2VzIG9mIHRoZSBBbWF6b24gRUNTIGNvbnRhaW5lciBhZ2VudC5cbiAqICAgVGhpcyBwYXJhbWV0ZXIgcmVxdWlyZXMgdmVyc2lvbiAxLjE4IG9mIHRoZSBEb2NrZXIgUmVtb3RlIEFQSSBvciBncmVhdGVyIG9uIHlvdXIgY29udGFpbmVyIGluc3RhbmNlLiBUbyBjaGVjayB0aGUgRG9ja2VyIFJlbW90ZSBBUEkgdmVyc2lvbiBvbiB5b3VyIGNvbnRhaW5lciBpbnN0YW5jZSwgbG9nIGluIHRvIHlvdXIgY29udGFpbmVyIGluc3RhbmNlIGFuZCBydW4gdGhlIGZvbGxvd2luZyBjb21tYW5kOiBgYHN1ZG8gZG9ja2VyIHZlcnNpb24gLS1mb3JtYXQgJ3t7LlNlcnZlci5BUElWZXJzaW9ufX0nYGAgXG4gKiAgIFRoZSBBbWF6b24gRUNTIGNvbnRhaW5lciBhZ2VudCBydW5uaW5nIG9uIGEgY29udGFpbmVyIGluc3RhbmNlIG11c3QgcmVnaXN0ZXIgdGhlIGxvZ2dpbmcgZHJpdmVycyBhdmFpbGFibGUgb24gdGhhdCBpbnN0YW5jZSB3aXRoIHRoZSBgYEVDU19BVkFJTEFCTEVfTE9HR0lOR19EUklWRVJTYGAgZW52aXJvbm1lbnQgdmFyaWFibGUgYmVmb3JlIGNvbnRhaW5lcnMgcGxhY2VkIG9uIHRoYXQgaW5zdGFuY2UgY2FuIHVzZSB0aGVzZSBsb2cgY29uZmlndXJhdGlvbiBvcHRpb25zLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtDb250YWluZXIgQWdlbnQgQ29uZmlndXJhdGlvbl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvZWNzLWFnZW50LWNvbmZpZy5odG1sKSBpbiB0aGUgKkRldmVsb3BlciBHdWlkZSouXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9nQ29uZmlndXJhdGlvbiB7XG4vKipcbiAqIFRoZSBzZWNyZXRzIHRvIHBhc3MgdG8gdGhlIGxvZyBjb25maWd1cmF0aW9uLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtTcGVjaWZ5aW5nIHNlbnNpdGl2ZSBkYXRhXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9zcGVjaWZ5aW5nLXNlbnNpdGl2ZS1kYXRhLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuU2VjcmV0T3B0aW9ucz86IFNlY3JldFtdXG4vKipcbiAqIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gc2VuZCB0byB0aGUgbG9nIGRyaXZlci5cbiAqICBUaGUgb3B0aW9ucyB5b3UgY2FuIHNwZWNpZnkgZGVwZW5kIG9uIHRoZSBsb2cgZHJpdmVyLiBTb21lIG9mIHRoZSBvcHRpb25zIHlvdSBjYW4gc3BlY2lmeSB3aGVuIHlvdSB1c2UgdGhlIGBgYXdzbG9nc2BgIGxvZyBkcml2ZXIgdG8gcm91dGUgbG9ncyB0byBBbWF6b24gQ2xvdWRXYXRjaCBpbmNsdWRlIHRoZSBmb2xsb3dpbmc6XG4gKiAgICsgYXdzbG9ncy1jcmVhdGUtZ3JvdXAgUmVxdWlyZWQ6IE5vIFNwZWNpZnkgd2hldGhlciB5b3Ugd2FudCB0aGUgbG9nIGdyb3VwIHRvIGJlIGNyZWF0ZWQgYXV0b21hdGljYWxseS4gSWYgdGhpcyBvcHRpb24gaXNuJ3Qgc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byBmYWxzZS4gWW91ciBJQU0gcG9saWN5IG11c3QgaW5jbHVkZSB0aGUgbG9nczpDcmVhdGVMb2dHcm91cCBwZXJtaXNzaW9uIGJlZm9yZSB5b3UgYXR0ZW1wdCB0byB1c2UgYXdzbG9ncy1jcmVhdGUtZ3JvdXAuICsgYXdzbG9ncy1yZWdpb24gUmVxdWlyZWQ6IFllcyBTcGVjaWZ5IHRoZSBSZWdpb24gdGhhdCB0aGUgYXdzbG9ncyBsb2cgZHJpdmVyIGlzIHRvIHNlbmQgeW91ciBEb2NrZXIgbG9ncyB0by4gWW91IGNhbiBjaG9vc2UgdG8gc2VuZCBhbGwgb2YgeW91ciBsb2dzIGZyb20gY2x1c3RlcnMgaW4gZGlmZmVyZW50IFJlZ2lvbnMgdG8gYSBzaW5nbGUgcmVnaW9uIGluIENsb3VkV2F0Y2ggTG9ncy4gVGhpcyBpcyBzbyB0aGF0IHRoZXkncmUgYWxsIHZpc2libGUgaW4gb25lIGxvY2F0aW9uLiBPdGhlcndpc2UsIHlvdSBjYW4gc2VwYXJhdGUgdGhlbSBieSBSZWdpb24gZm9yIG1vcmUgZ3JhbnVsYXJpdHkuIE1ha2Ugc3VyZSB0aGF0IHRoZSBzcGVjaWZpZWQgbG9nIGdyb3VwIGV4aXN0cyBpbiB0aGUgUmVnaW9uIHRoYXQgeW91IHNwZWNpZnkgd2l0aCB0aGlzIG9wdGlvbi4gKyBhd3Nsb2dzLWdyb3VwIFJlcXVpcmVkOiBZZXMgTWFrZSBzdXJlIHRvIHNwZWNpZnkgYSBsb2cgZ3JvdXAgdGhhdCB0aGUgYXdzbG9ncyBsb2cgZHJpdmVyIHNlbmRzIGl0cyBsb2cgc3RyZWFtcyB0by4gKyBhd3Nsb2dzLXN0cmVhbS1wcmVmaXggUmVxdWlyZWQ6IFllcywgd2hlbiB1c2luZyB0aGUgRmFyZ2F0ZSBsYXVuY2ggdHlwZS5PcHRpb25hbCBmb3IgdGhlIEVDMiBsYXVuY2ggdHlwZSwgcmVxdWlyZWQgZm9yIHRoZSBGYXJnYXRlIGxhdW5jaCB0eXBlLiBVc2UgdGhlIGF3c2xvZ3Mtc3RyZWFtLXByZWZpeCBvcHRpb24gdG8gYXNzb2NpYXRlIGEgbG9nIHN0cmVhbSB3aXRoIHRoZSBzcGVjaWZpZWQgcHJlZml4LCB0aGUgY29udGFpbmVyIG5hbWUsIGFuZCB0aGUgSUQgb2YgdGhlIEFtYXpvbiBFQ1MgdGFzayB0aGF0IHRoZSBjb250YWluZXIgYmVsb25ncyB0by4gSWYgeW91IHNwZWNpZnkgYSBwcmVmaXggd2l0aCB0aGlzIG9wdGlvbiwgdGhlbiB0aGUgbG9nIHN0cmVhbSB0YWtlcyB0aGUgZm9ybWF0IHByZWZpeC1uYW1lL2NvbnRhaW5lci1uYW1lL2Vjcy10YXNrLWlkLiBJZiB5b3UgZG9uJ3Qgc3BlY2lmeSBhIHByZWZpeCB3aXRoIHRoaXMgb3B0aW9uLCB0aGVuIHRoZSBsb2cgc3RyZWFtIGlzIG5hbWVkIGFmdGVyIHRoZSBjb250YWluZXIgSUQgdGhhdCdzIGFzc2lnbmVkIGJ5IHRoZSBEb2NrZXIgZGFlbW9uIG9uIHRoZSBjb250YWluZXIgaW5zdGFuY2UuIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gdHJhY2UgbG9ncyBiYWNrIHRvIHRoZSBjb250YWluZXIgdGhhdCBzZW50IHRoZW0gd2l0aCBqdXN0IHRoZSBEb2NrZXIgY29udGFpbmVyIElEICh3aGljaCBpcyBvbmx5IGF2YWlsYWJsZSBvbiB0aGUgY29udGFpbmVyIGluc3RhbmNlKSwgd2UgcmVjb21tZW5kIHRoYXQgeW91IHNwZWNpZnkgYSBwcmVmaXggd2l0aCB0aGlzIG9wdGlvbi4gRm9yIEFtYXpvbiBFQ1Mgc2VydmljZXMsIHlvdSBjYW4gdXNlIHRoZSBzZXJ2aWNlIG5hbWUgYXMgdGhlIHByZWZpeC4gRG9pbmcgc28sIHlvdSBjYW4gdHJhY2UgbG9nIHN0cmVhbXMgdG8gdGhlIHNlcnZpY2UgdGhhdCB0aGUgY29udGFpbmVyIGJlbG9uZ3MgdG8sIHRoZSBuYW1lIG9mIHRoZSBjb250YWluZXIgdGhhdCBzZW50IHRoZW0sIGFuZCB0aGUgSUQgb2YgdGhlIHRhc2sgdGhhdCB0aGUgY29udGFpbmVyIGJlbG9uZ3MgdG8uIFlvdSBtdXN0IHNwZWNpZnkgYSBzdHJlYW0tcHJlZml4IGZvciB5b3VyIGxvZ3MgdG8gaGF2ZSB5b3VyIGxvZ3MgYXBwZWFyIGluIHRoZSBMb2cgcGFuZSB3aGVuIHVzaW5nIHRoZSBBbWF6b24gRUNTIGNvbnNvbGUuICsgYXdzbG9ncy1kYXRldGltZS1mb3JtYXQgUmVxdWlyZWQ6IE5vIFRoaXMgb3B0aW9uIGRlZmluZXMgYSBtdWx0aWxpbmUgc3RhcnQgcGF0dGVybiBpbiBQeXRob24gc3RyZnRpbWUgZm9ybWF0LiBBIGxvZyBtZXNzYWdlIGNvbnNpc3RzIG9mIGEgbGluZSB0aGF0IG1hdGNoZXMgdGhlIHBhdHRlcm4gYW5kIGFueSBmb2xsb3dpbmcgbGluZXMgdGhhdCBkb27igJl0IG1hdGNoIHRoZSBwYXR0ZXJuLiBUaGUgbWF0Y2hlZCBsaW5lIGlzIHRoZSBkZWxpbWl0ZXIgYmV0d2VlbiBsb2cgbWVzc2FnZXMuIE9uZSBleGFtcGxlIG9mIGEgdXNlIGNhc2UgZm9yIHVzaW5nIHRoaXMgZm9ybWF0IGlzIGZvciBwYXJzaW5nIG91dHB1dCBzdWNoIGFzIGEgc3RhY2sgZHVtcCwgd2hpY2ggbWlnaHQgb3RoZXJ3aXNlIGJlIGxvZ2dlZCBpbiBtdWx0aXBsZSBlbnRyaWVzLiBUaGUgY29ycmVjdCBwYXR0ZXJuIGFsbG93cyBpdCB0byBiZSBjYXB0dXJlZCBpbiBhIHNpbmdsZSBlbnRyeS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBhd3Nsb2dzLWRhdGV0aW1lLWZvcm1hdC4gWW91IGNhbm5vdCBjb25maWd1cmUgYm90aCB0aGUgYXdzbG9ncy1kYXRldGltZS1mb3JtYXQgYW5kIGF3c2xvZ3MtbXVsdGlsaW5lLXBhdHRlcm4gb3B0aW9ucy4gTXVsdGlsaW5lIGxvZ2dpbmcgcGVyZm9ybXMgcmVndWxhciBleHByZXNzaW9uIHBhcnNpbmcgYW5kIG1hdGNoaW5nIG9mIGFsbCBsb2cgbWVzc2FnZXMuIFRoaXMgbWlnaHQgaGF2ZSBhIG5lZ2F0aXZlIGltcGFjdCBvbiBsb2dnaW5nIHBlcmZvcm1hbmNlLiArIGF3c2xvZ3MtbXVsdGlsaW5lLXBhdHRlcm4gUmVxdWlyZWQ6IE5vIFRoaXMgb3B0aW9uIGRlZmluZXMgYSBtdWx0aWxpbmUgc3RhcnQgcGF0dGVybiB0aGF0IHVzZXMgYSByZWd1bGFyIGV4cHJlc3Npb24uIEEgbG9nIG1lc3NhZ2UgY29uc2lzdHMgb2YgYSBsaW5lIHRoYXQgbWF0Y2hlcyB0aGUgcGF0dGVybiBhbmQgYW55IGZvbGxvd2luZyBsaW5lcyB0aGF0IGRvbuKAmXQgbWF0Y2ggdGhlIHBhdHRlcm4uIFRoZSBtYXRjaGVkIGxpbmUgaXMgdGhlIGRlbGltaXRlciBiZXR3ZWVuIGxvZyBtZXNzYWdlcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBhd3Nsb2dzLW11bHRpbGluZS1wYXR0ZXJuLiBUaGlzIG9wdGlvbiBpcyBpZ25vcmVkIGlmIGF3c2xvZ3MtZGF0ZXRpbWUtZm9ybWF0IGlzIGFsc28gY29uZmlndXJlZC4gWW91IGNhbm5vdCBjb25maWd1cmUgYm90aCB0aGUgYXdzbG9ncy1kYXRldGltZS1mb3JtYXQgYW5kIGF3c2xvZ3MtbXVsdGlsaW5lLXBhdHRlcm4gb3B0aW9ucy4gTXVsdGlsaW5lIGxvZ2dpbmcgcGVyZm9ybXMgcmVndWxhciBleHByZXNzaW9uIHBhcnNpbmcgYW5kIG1hdGNoaW5nIG9mIGFsbCBsb2cgbWVzc2FnZXMuIFRoaXMgbWlnaHQgaGF2ZSBhIG5lZ2F0aXZlIGltcGFjdCBvbiBsb2dnaW5nIHBlcmZvcm1hbmNlLiArIG1vZGUgUmVxdWlyZWQ6IE5vIFZhbGlkIHZhbHVlczogbm9uLWJsb2NraW5nIHwgYmxvY2tpbmcgVGhpcyBvcHRpb24gZGVmaW5lcyB0aGUgZGVsaXZlcnkgbW9kZSBvZiBsb2cgbWVzc2FnZXMgZnJvbSB0aGUgY29udGFpbmVyIHRvIENsb3VkV2F0Y2ggTG9ncy4gVGhlIGRlbGl2ZXJ5IG1vZGUgeW91IGNob29zZSBhZmZlY3RzIGFwcGxpY2F0aW9uIGF2YWlsYWJpbGl0eSB3aGVuIHRoZSBmbG93IG9mIGxvZ3MgZnJvbSBjb250YWluZXIgdG8gQ2xvdWRXYXRjaCBpcyBpbnRlcnJ1cHRlZC4gSWYgeW91IHVzZSB0aGUgYmxvY2tpbmcgbW9kZSBhbmQgdGhlIGZsb3cgb2YgbG9ncyB0byBDbG91ZFdhdGNoIGlzIGludGVycnVwdGVkLCBjYWxscyBmcm9tIGNvbnRhaW5lciBjb2RlIHRvIHdyaXRlIHRvIHRoZSBzdGRvdXQgYW5kIHN0ZGVyciBzdHJlYW1zIHdpbGwgYmxvY2suIFRoZSBsb2dnaW5nIHRocmVhZCBvZiB0aGUgYXBwbGljYXRpb24gd2lsbCBibG9jayBhcyBhIHJlc3VsdC4gVGhpcyBtYXkgY2F1c2UgdGhlIGFwcGxpY2F0aW9uIHRvIGJlY29tZSB1bnJlc3BvbnNpdmUgYW5kIGxlYWQgdG8gY29udGFpbmVyIGhlYWx0aGNoZWNrIGZhaWx1cmUuIElmIHlvdSB1c2UgdGhlIG5vbi1ibG9ja2luZyBtb2RlLCB0aGUgY29udGFpbmVyJ3MgbG9ncyBhcmUgaW5zdGVhZCBzdG9yZWQgaW4gYW4gaW4tbWVtb3J5IGludGVybWVkaWF0ZSBidWZmZXIgY29uZmlndXJlZCB3aXRoIHRoZSBtYXgtYnVmZmVyLXNpemUgb3B0aW9uLiBUaGlzIHByZXZlbnRzIHRoZSBhcHBsaWNhdGlvbiBmcm9tIGJlY29taW5nIHVucmVzcG9uc2l2ZSB3aGVuIGxvZ3MgY2Fubm90IGJlIHNlbnQgdG8gQ2xvdWRXYXRjaC4gV2UgcmVjb21tZW5kIHVzaW5nIHRoaXMgbW9kZSBpZiB5b3Ugd2FudCB0byBlbnN1cmUgc2VydmljZSBhdmFpbGFiaWxpdHkgYW5kIGFyZSBva2F5IHdpdGggc29tZSBsb2cgbG9zcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBQcmV2ZW50aW5nIGxvZyBsb3NzIHdpdGggbm9uLWJsb2NraW5nIG1vZGUgaW4gdGhlIGF3c2xvZ3MgY29udGFpbmVyIGxvZyBkcml2ZXIuICsgbWF4LWJ1ZmZlci1zaXplIFJlcXVpcmVkOiBObyBEZWZhdWx0IHZhbHVlOiAxbSBXaGVuIG5vbi1ibG9ja2luZyBtb2RlIGlzIHVzZWQsIHRoZSBtYXgtYnVmZmVyLXNpemUgbG9nIG9wdGlvbiBjb250cm9scyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIHRoYXQncyB1c2VkIGZvciBpbnRlcm1lZGlhdGUgbWVzc2FnZSBzdG9yYWdlLiBNYWtlIHN1cmUgdG8gc3BlY2lmeSBhbiBhZGVxdWF0ZSBidWZmZXIgc2l6ZSBiYXNlZCBvbiB5b3VyIGFwcGxpY2F0aW9uLiBXaGVuIHRoZSBidWZmZXIgZmlsbHMgdXAsIGZ1cnRoZXIgbG9ncyBjYW5ub3QgYmUgc3RvcmVkLiBMb2dzIHRoYXQgY2Fubm90IGJlIHN0b3JlZCBhcmUgbG9zdC4gXG4gKiAgVG8gcm91dGUgbG9ncyB1c2luZyB0aGUgYGBzcGx1bmtgYCBsb2cgcm91dGVyLCB5b3UgbmVlZCB0byBzcGVjaWZ5IGEgYGBzcGx1bmstdG9rZW5gYCBhbmQgYSBgYHNwbHVuay11cmxgYC5cbiAqICBXaGVuIHlvdSB1c2UgdGhlIGBgYXdzZmlyZWxlbnNgYCBsb2cgcm91dGVyIHRvIHJvdXRlIGxvZ3MgdG8gYW4gQVdTIFNlcnZpY2Ugb3IgQVdTIFBhcnRuZXIgTmV0d29yayBkZXN0aW5hdGlvbiBmb3IgbG9nIHN0b3JhZ2UgYW5kIGFuYWx5dGljcywgeW91IGNhbiBzZXQgdGhlIGBgbG9nLWRyaXZlci1idWZmZXItbGltaXRgYCBvcHRpb24gdG8gbGltaXQgdGhlIG51bWJlciBvZiBldmVudHMgdGhhdCBhcmUgYnVmZmVyZWQgaW4gbWVtb3J5LCBiZWZvcmUgYmVpbmcgc2VudCB0byB0aGUgbG9nIHJvdXRlciBjb250YWluZXIuIEl0IGNhbiBoZWxwIHRvIHJlc29sdmUgcG90ZW50aWFsIGxvZyBsb3NzIGlzc3VlIGJlY2F1c2UgaGlnaCB0aHJvdWdocHV0IG1pZ2h0IHJlc3VsdCBpbiBtZW1vcnkgcnVubmluZyBvdXQgZm9yIHRoZSBidWZmZXIgaW5zaWRlIG9mIERvY2tlci5cbiAqICBPdGhlciBvcHRpb25zIHlvdSBjYW4gc3BlY2lmeSB3aGVuIHVzaW5nIGBgYXdzZmlyZWxlbnNgYCB0byByb3V0ZSBsb2dzIGRlcGVuZCBvbiB0aGUgZGVzdGluYXRpb24uIFdoZW4geW91IGV4cG9ydCBsb2dzIHRvIEFtYXpvbiBEYXRhIEZpcmVob3NlLCB5b3UgY2FuIHNwZWNpZnkgdGhlIEFXUyBSZWdpb24gd2l0aCBgYHJlZ2lvbmBgIGFuZCBhIG5hbWUgZm9yIHRoZSBsb2cgc3RyZWFtIHdpdGggYGBkZWxpdmVyeV9zdHJlYW1gYC5cbiAqICBXaGVuIHlvdSBleHBvcnQgbG9ncyB0byBBbWF6b24gS2luZXNpcyBEYXRhIFN0cmVhbXMsIHlvdSBjYW4gc3BlY2lmeSBhbiBBV1MgUmVnaW9uIHdpdGggYGByZWdpb25gYCBhbmQgYSBkYXRhIHN0cmVhbSBuYW1lIHdpdGggYGBzdHJlYW1gYC5cbiAqICAgV2hlbiB5b3UgZXhwb3J0IGxvZ3MgdG8gQW1hem9uIE9wZW5TZWFyY2ggU2VydmljZSwgeW91IGNhbiBzcGVjaWZ5IG9wdGlvbnMgbGlrZSBgYE5hbWVgYCwgYGBIb3N0YGAgKE9wZW5TZWFyY2ggU2VydmljZSBlbmRwb2ludCB3aXRob3V0IHByb3RvY29sKSwgYGBQb3J0YGAsIGBgSW5kZXhgYCwgYGBUeXBlYGAsIGBgQXdzX2F1dGhgYCwgYGBBd3NfcmVnaW9uYGAsIGBgU3VwcHJlc3NfVHlwZV9OYW1lYGAsIGFuZCBgYHRsc2BgLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtVbmRlciB0aGUgaG9vZDogRmlyZUxlbnMgZm9yIEFtYXpvbiBFQ1MgVGFza3NdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jb250YWluZXJzL3VuZGVyLXRoZS1ob29kLWZpcmVsZW5zLWZvci1hbWF6b24tZWNzLXRhc2tzLykuXG4gKiAgV2hlbiB5b3UgZXhwb3J0IGxvZ3MgdG8gQW1hem9uIFMzLCB5b3UgY2FuIHNwZWNpZnkgdGhlIGJ1Y2tldCB1c2luZyB0aGUgYGBidWNrZXRgYCBvcHRpb24uIFlvdSBjYW4gYWxzbyBzcGVjaWZ5IGBgcmVnaW9uYGAsIGBgdG90YWxfZmlsZV9zaXplYGAsIGBgdXBsb2FkX3RpbWVvdXRgYCwgYW5kIGBgdXNlX3B1dF9vYmplY3RgYCBhcyBvcHRpb25zLlxuICogIFRoaXMgcGFyYW1ldGVyIHJlcXVpcmVzIHZlcnNpb24gMS4xOSBvZiB0aGUgRG9ja2VyIFJlbW90ZSBBUEkgb3IgZ3JlYXRlciBvbiB5b3VyIGNvbnRhaW5lciBpbnN0YW5jZS4gVG8gY2hlY2sgdGhlIERvY2tlciBSZW1vdGUgQVBJIHZlcnNpb24gb24geW91ciBjb250YWluZXIgaW5zdGFuY2UsIGxvZyBpbiB0byB5b3VyIGNvbnRhaW5lciBpbnN0YW5jZSBhbmQgcnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZDogYGBzdWRvIGRvY2tlciB2ZXJzaW9uIC0tZm9ybWF0ICd7ey5TZXJ2ZXIuQVBJVmVyc2lvbn19J2BgXG4gKi9cbk9wdGlvbnM/OiB7XG4vKipcbiAqIFRoaXMgaW50ZXJmYWNlIHdhcyByZWZlcmVuY2VkIGJ5IGB1bmRlZmluZWRgJ3MgSlNPTi1TY2hlbWEgZGVmaW5pdGlvblxuICogdmlhIHRoZSBgcGF0dGVyblByb3BlcnR5YCBcIi57MSx9XCIuXG4gKi9cbltrOiBzdHJpbmddOiBzdHJpbmdcbn1cbi8qKlxuICogVGhlIGxvZyBkcml2ZXIgdG8gdXNlIGZvciB0aGUgY29udGFpbmVyLlxuICogIEZvciB0YXNrcyBvbiBGQVJHQVRFbG9uZywgdGhlIHN1cHBvcnRlZCBsb2cgZHJpdmVycyBhcmUgYGBhd3Nsb2dzYGAsIGBgc3BsdW5rYGAsIGFuZCBgYGF3c2ZpcmVsZW5zYGAuXG4gKiAgRm9yIHRhc2tzIGhvc3RlZCBvbiBBbWF6b24gRUMyIGluc3RhbmNlcywgdGhlIHN1cHBvcnRlZCBsb2cgZHJpdmVycyBhcmUgYGBhd3Nsb2dzYGAsIGBgZmx1ZW50ZGBgLCBgYGdlbGZgYCwgYGBqc29uLWZpbGVgYCwgYGBqb3VybmFsZGBgLCBgYHN5c2xvZ2BgLCBgYHNwbHVua2BgLCBhbmQgYGBhd3NmaXJlbGVuc2BgLlxuICogIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHVzaW5nIHRoZSBgYGF3c2xvZ3NgYCBsb2cgZHJpdmVyLCBzZWUgW1NlbmQgQW1hem9uIEVDUyBsb2dzIHRvIENsb3VkV2F0Y2hdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3VzaW5nX2F3c2xvZ3MuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICogIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHVzaW5nIHRoZSBgYGF3c2ZpcmVsZW5zYGAgbG9nIGRyaXZlciwgc2VlIFtTZW5kIEFtYXpvbiBFQ1MgbG9ncyB0byBhbiBzZXJ2aWNlIG9yIFBhcnRuZXJdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3VzaW5nX2ZpcmVsZW5zLmh0bWwpLlxuICogICBJZiB5b3UgaGF2ZSBhIGN1c3RvbSBkcml2ZXIgdGhhdCBpc24ndCBsaXN0ZWQsIHlvdSBjYW4gZm9yayB0aGUgQW1hem9uIEVDUyBjb250YWluZXIgYWdlbnQgcHJvamVjdCB0aGF0J3MgW2F2YWlsYWJsZSBvbiBHaXRIdWJdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9odHRwczovL2dpdGh1Yi5jb20vYXdzL2FtYXpvbi1lY3MtYWdlbnQpIGFuZCBjdXN0b21pemUgaXQgdG8gd29yayB3aXRoIHRoYXQgZHJpdmVyLiBXZSBlbmNvdXJhZ2UgeW91IHRvIHN1Ym1pdCBwdWxsIHJlcXVlc3RzIGZvciBjaGFuZ2VzIHRoYXQgeW91IHdvdWxkIGxpa2UgdG8gaGF2ZSBpbmNsdWRlZC4gSG93ZXZlciwgd2UgZG9uJ3QgY3VycmVudGx5IHByb3ZpZGUgc3VwcG9ydCBmb3IgcnVubmluZyBtb2RpZmllZCBjb3BpZXMgb2YgdGhpcyBzb2Z0d2FyZS5cbiAqL1xuTG9nRHJpdmVyOiBzdHJpbmdcbn1cbi8qKlxuICogVGhlIHR5cGUgYW5kIGFtb3VudCBvZiBhIHJlc291cmNlIHRvIGFzc2lnbiB0byBhIGNvbnRhaW5lci4gVGhlIHN1cHBvcnRlZCByZXNvdXJjZSB0eXBlcyBhcmUgR1BVcyBhbmQgRWxhc3RpYyBJbmZlcmVuY2UgYWNjZWxlcmF0b3JzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtXb3JraW5nIHdpdGggR1BVcyBvbiBBbWF6b24gRUNTXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9lY3MtZ3B1Lmh0bWwpIG9yIFtXb3JraW5nIHdpdGggQW1hem9uIEVsYXN0aWMgSW5mZXJlbmNlIG9uIEFtYXpvbiBFQ1NdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2Vjcy1pbmZlcmVuY2UuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2VSZXF1aXJlbWVudCB7XG4vKipcbiAqIFRoZSB0eXBlIG9mIHJlc291cmNlIHRvIGFzc2lnbiB0byBhIGNvbnRhaW5lci5cbiAqL1xuVHlwZTogc3RyaW5nXG4vKipcbiAqIFRoZSB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCByZXNvdXJjZSB0eXBlLlxuICogIFdoZW4gdGhlIHR5cGUgaXMgYGBHUFVgYCwgdGhlIHZhbHVlIGlzIHRoZSBudW1iZXIgb2YgcGh5c2ljYWwgYGBHUFVzYGAgdGhlIEFtYXpvbiBFQ1MgY29udGFpbmVyIGFnZW50IHJlc2VydmVzIGZvciB0aGUgY29udGFpbmVyLiBUaGUgbnVtYmVyIG9mIEdQVXMgdGhhdCdzIHJlc2VydmVkIGZvciBhbGwgY29udGFpbmVycyBpbiBhIHRhc2sgY2FuJ3QgZXhjZWVkIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIEdQVXMgb24gdGhlIGNvbnRhaW5lciBpbnN0YW5jZSB0aGF0IHRoZSB0YXNrIGlzIGxhdW5jaGVkIG9uLlxuICogIFdoZW4gdGhlIHR5cGUgaXMgYGBJbmZlcmVuY2VBY2NlbGVyYXRvcmBgLCB0aGUgYGB2YWx1ZWBgIG1hdGNoZXMgdGhlIGBgZGV2aWNlTmFtZWBgIGZvciBhbiBbSW5mZXJlbmNlQWNjZWxlcmF0b3JdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfSW5mZXJlbmNlQWNjZWxlcmF0b3IuaHRtbCkgc3BlY2lmaWVkIGluIGEgdGFzayBkZWZpbml0aW9uLlxuICovXG5WYWx1ZTogc3RyaW5nXG59XG4vKipcbiAqIEEgbGlzdCBvZiBmaWxlcyBjb250YWluaW5nIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gcGFzcyB0byBhIGNvbnRhaW5lci4gWW91IGNhbiBzcGVjaWZ5IHVwIHRvIHRlbiBlbnZpcm9ubWVudCBmaWxlcy4gVGhlIGZpbGUgbXVzdCBoYXZlIGEgYGAuZW52YGAgZmlsZSBleHRlbnNpb24uIEVhY2ggbGluZSBpbiBhbiBlbnZpcm9ubWVudCBmaWxlIHNob3VsZCBjb250YWluIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIGluIGBgVkFSSUFCTEU9VkFMVUVgYCBmb3JtYXQuIExpbmVzIGJlZ2lubmluZyB3aXRoIGBgI2BgIGFyZSB0cmVhdGVkIGFzIGNvbW1lbnRzIGFuZCBhcmUgaWdub3JlZC5cbiAqICBJZiB0aGVyZSBhcmUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHNwZWNpZmllZCB1c2luZyB0aGUgYGBlbnZpcm9ubWVudGBgIHBhcmFtZXRlciBpbiBhIGNvbnRhaW5lciBkZWZpbml0aW9uLCB0aGV5IHRha2UgcHJlY2VkZW5jZSBvdmVyIHRoZSB2YXJpYWJsZXMgY29udGFpbmVkIHdpdGhpbiBhbiBlbnZpcm9ubWVudCBmaWxlLiBJZiBtdWx0aXBsZSBlbnZpcm9ubWVudCBmaWxlcyBhcmUgc3BlY2lmaWVkIHRoYXQgY29udGFpbiB0aGUgc2FtZSB2YXJpYWJsZSwgdGhleSdyZSBwcm9jZXNzZWQgZnJvbSB0aGUgdG9wIGRvd24uIFdlIHJlY29tbWVuZCB0aGF0IHlvdSB1c2UgdW5pcXVlIHZhcmlhYmxlIG5hbWVzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtVc2UgYSBmaWxlIHRvIHBhc3MgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIGEgY29udGFpbmVyXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS91c2UtZW52aXJvbm1lbnQtZmlsZS5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKiAgRW52aXJvbm1lbnQgdmFyaWFibGUgZmlsZXMgYXJlIG9iamVjdHMgaW4gQW1hem9uIFMzIGFuZCBhbGwgQW1hem9uIFMzIHNlY3VyaXR5IGNvbnNpZGVyYXRpb25zIGFwcGx5LiBcbiAqICBZb3UgbXVzdCB1c2UgdGhlIGZvbGxvd2luZyBwbGF0Zm9ybXMgZm9yIHRoZSBGYXJnYXRlIGxhdW5jaCB0eXBlOlxuICogICArICBMaW51eCBwbGF0Zm9ybSB2ZXJzaW9uIGBgMS40LjBgYCBvciBsYXRlci5cbiAqICAgKyAgV2luZG93cyBwbGF0Zm9ybSB2ZXJzaW9uIGBgMS4wLjBgYCBvciBsYXRlci5cbiAqICAgXG4gKiAgQ29uc2lkZXIgdGhlIGZvbGxvd2luZyB3aGVuIHVzaW5nIHRoZSBGYXJnYXRlIGxhdW5jaCB0eXBlOlxuICogICArICBUaGUgZmlsZSBpcyBoYW5kbGVkIGxpa2UgYSBuYXRpdmUgRG9ja2VyIGVudi1maWxlLlxuICogICArICBUaGVyZSBpcyBubyBzdXBwb3J0IGZvciBzaGVsbCBlc2NhcGUgaGFuZGxpbmcuXG4gKiAgICsgIFRoZSBjb250YWluZXIgZW50cnkgcG9pbnQgaW50ZXJwZXJ0cyB0aGUgYGBWQVJJQUJMRWBgIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnZpcm9ubWVudEZpbGUge1xuLyoqXG4gKiBUaGUgZmlsZSB0eXBlIHRvIHVzZS4gRW52aXJvbm1lbnQgZmlsZXMgYXJlIG9iamVjdHMgaW4gQW1hem9uIFMzLiBUaGUgb25seSBzdXBwb3J0ZWQgdmFsdWUgaXMgYGBzM2BgLlxuICovXG5UeXBlPzogc3RyaW5nXG4vKipcbiAqIFRoZSBBbWF6b24gUmVzb3VyY2UgTmFtZSAoQVJOKSBvZiB0aGUgQW1hem9uIFMzIG9iamVjdCBjb250YWluaW5nIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBmaWxlLlxuICovXG5WYWx1ZT86IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgRmlyZUxlbnMgY29uZmlndXJhdGlvbiBmb3IgdGhlIGNvbnRhaW5lci4gVGhpcyBpcyB1c2VkIHRvIHNwZWNpZnkgYW5kIGNvbmZpZ3VyZSBhIGxvZyByb3V0ZXIgZm9yIGNvbnRhaW5lciBsb2dzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtDdXN0b20gTG9nIFJvdXRpbmddKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3VzaW5nX2ZpcmVsZW5zLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaXJlbGVuc0NvbmZpZ3VyYXRpb24ge1xuLyoqXG4gKiBUaGUgb3B0aW9ucyB0byB1c2Ugd2hlbiBjb25maWd1cmluZyB0aGUgbG9nIHJvdXRlci4gVGhpcyBmaWVsZCBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIHVzZWQgdG8gYWRkIGFkZGl0aW9uYWwgbWV0YWRhdGEsIHN1Y2ggYXMgdGhlIHRhc2ssIHRhc2sgZGVmaW5pdGlvbiwgY2x1c3RlciwgYW5kIGNvbnRhaW5lciBpbnN0YW5jZSBkZXRhaWxzIHRvIHRoZSBsb2cgZXZlbnQuXG4gKiAgIElmIHNwZWNpZmllZCwgdmFsaWQgb3B0aW9uIGtleXMgYXJlOlxuICogICArICAgYGBlbmFibGUtZWNzLWxvZy1tZXRhZGF0YWBgLCB3aGljaCBjYW4gYmUgYGB0cnVlYGAgb3IgYGBmYWxzZWBgIFxuICogICArICAgYGBjb25maWctZmlsZS10eXBlYGAsIHdoaWNoIGNhbiBiZSBgYHMzYGAgb3IgYGBmaWxlYGAgXG4gKiAgICsgICBgYGNvbmZpZy1maWxlLXZhbHVlYGAsIHdoaWNoIGlzIGVpdGhlciBhbiBTMyBBUk4gb3IgYSBmaWxlIHBhdGhcbiAqL1xuT3B0aW9ucz86IHtcbi8qKlxuICogVGhpcyBpbnRlcmZhY2Ugd2FzIHJlZmVyZW5jZWQgYnkgYHVuZGVmaW5lZGAncyBKU09OLVNjaGVtYSBkZWZpbml0aW9uXG4gKiB2aWEgdGhlIGBwYXR0ZXJuUHJvcGVydHlgIFwiLnsxLH1cIi5cbiAqL1xuW2s6IHN0cmluZ106IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgbG9nIHJvdXRlciB0byB1c2UuIFRoZSB2YWxpZCB2YWx1ZXMgYXJlIGBgZmx1ZW50ZGBgIG9yIGBgZmx1ZW50Yml0YGAuXG4gKi9cblR5cGU/OiBzdHJpbmdcbn1cbi8qKlxuICogQSBsaXN0IG9mIG5hbWVzcGFjZWQga2VybmVsIHBhcmFtZXRlcnMgdG8gc2V0IGluIHRoZSBjb250YWluZXIuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBTeXNjdGxzYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYC0tc3lzY3RsYGAgb3B0aW9uIHRvIGRvY2tlciBydW4uIEZvciBleGFtcGxlLCB5b3UgY2FuIGNvbmZpZ3VyZSBgYG5ldC5pcHY0LnRjcF9rZWVwYWxpdmVfdGltZWBgIHNldHRpbmcgdG8gbWFpbnRhaW4gbG9uZ2VyIGxpdmVkIGNvbm5lY3Rpb25zLlxuICogIFdlIGRvbid0IHJlY29tbWVuZCB0aGF0IHlvdSBzcGVjaWZ5IG5ldHdvcmstcmVsYXRlZCBgYHN5c3RlbUNvbnRyb2xzYGAgcGFyYW1ldGVycyBmb3IgbXVsdGlwbGUgY29udGFpbmVycyBpbiBhIHNpbmdsZSB0YXNrIHRoYXQgYWxzbyB1c2VzIGVpdGhlciB0aGUgYGBhd3N2cGNgYCBvciBgYGhvc3RgYCBuZXR3b3JrIG1vZGUuIERvaW5nIHRoaXMgaGFzIHRoZSBmb2xsb3dpbmcgZGlzYWR2YW50YWdlczpcbiAqICAgKyAgRm9yIHRhc2tzIHRoYXQgdXNlIHRoZSBgYGF3c3ZwY2BgIG5ldHdvcmsgbW9kZSBpbmNsdWRpbmcgRmFyZ2F0ZSwgaWYgeW91IHNldCBgYHN5c3RlbUNvbnRyb2xzYGAgZm9yIGFueSBjb250YWluZXIsIGl0IGFwcGxpZXMgdG8gYWxsIGNvbnRhaW5lcnMgaW4gdGhlIHRhc2suIElmIHlvdSBzZXQgZGlmZmVyZW50IGBgc3lzdGVtQ29udHJvbHNgYCBmb3IgbXVsdGlwbGUgY29udGFpbmVycyBpbiBhIHNpbmdsZSB0YXNrLCB0aGUgY29udGFpbmVyIHRoYXQncyBzdGFydGVkIGxhc3QgZGV0ZXJtaW5lcyB3aGljaCBgYHN5c3RlbUNvbnRyb2xzYGAgdGFrZSBlZmZlY3QuXG4gKiAgICsgIEZvciB0YXNrcyB0aGF0IHVzZSB0aGUgYGBob3N0YGAgbmV0d29yayBtb2RlLCB0aGUgbmV0d29yayBuYW1lc3BhY2UgYGBzeXN0ZW1Db250cm9sc2BgIGFyZW4ndCBzdXBwb3J0ZWQuXG4gKiAgIFxuICogIElmIHlvdSdyZSBzZXR0aW5nIGFuIElQQyByZXNvdXJjZSBuYW1lc3BhY2UgdG8gdXNlIGZvciB0aGUgY29udGFpbmVycyBpbiB0aGUgdGFzaywgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFwcGx5IHRvIHlvdXIgc3lzdGVtIGNvbnRyb2xzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtJUEMgbW9kZV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvdGFza19kZWZpbml0aW9uX3BhcmFtZXRlcnMuaHRtbCN0YXNrX2RlZmluaXRpb25faXBjbW9kZSkuXG4gKiAgICsgIEZvciB0YXNrcyB0aGF0IHVzZSB0aGUgYGBob3N0YGAgSVBDIG1vZGUsIElQQyBuYW1lc3BhY2UgYGBzeXN0ZW1Db250cm9sc2BgIGFyZW4ndCBzdXBwb3J0ZWQuXG4gKiAgICsgIEZvciB0YXNrcyB0aGF0IHVzZSB0aGUgYGB0YXNrYGAgSVBDIG1vZGUsIElQQyBuYW1lc3BhY2UgYGBzeXN0ZW1Db250cm9sc2BgIHZhbHVlcyBhcHBseSB0byBhbGwgY29udGFpbmVycyB3aXRoaW4gYSB0YXNrLlxuICogICBcbiAqICAgVGhpcyBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZCBmb3IgV2luZG93cyBjb250YWluZXJzLlxuICogICAgVGhpcyBwYXJhbWV0ZXIgaXMgb25seSBzdXBwb3J0ZWQgZm9yIHRhc2tzIHRoYXQgYXJlIGhvc3RlZCBvbiBGQVJHQVRFbG9uZyBpZiB0aGUgdGFza3MgYXJlIHVzaW5nIHBsYXRmb3JtIHZlcnNpb24gYGAxLjQuMGBgIG9yIGxhdGVyIChMaW51eCkuIFRoaXMgaXNuJ3Qgc3VwcG9ydGVkIGZvciBXaW5kb3dzIGNvbnRhaW5lcnMgb24gRmFyZ2F0ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTeXN0ZW1Db250cm9sIHtcbi8qKlxuICogVGhlIG5hbWVzcGFjZWQga2VybmVsIHBhcmFtZXRlciB0byBzZXQgYSBgYHZhbHVlYGAgZm9yLlxuICogIFZhbGlkIElQQyBuYW1lc3BhY2UgdmFsdWVzOiBgYFwia2VybmVsLm1zZ21heFwiIHwgXCJrZXJuZWwubXNnbW5iXCIgfCBcImtlcm5lbC5tc2dtbmlcIiB8IFwia2VybmVsLnNlbVwiIHwgXCJrZXJuZWwuc2htYWxsXCIgfCBcImtlcm5lbC5zaG1tYXhcIiB8IFwia2VybmVsLnNobW1uaVwiIHwgXCJrZXJuZWwuc2htX3JtaWRfZm9yY2VkXCJgYCwgYW5kIGBgU3lzY3Rsc2BgIHRoYXQgc3RhcnQgd2l0aCBgYFwiZnMubXF1ZXVlLipcImBgIFxuICogIFZhbGlkIG5ldHdvcmsgbmFtZXNwYWNlIHZhbHVlczogYGBTeXNjdGxzYGAgdGhhdCBzdGFydCB3aXRoIGBgXCJuZXQuKlwiYGAgXG4gKiAgQWxsIG9mIHRoZXNlIHZhbHVlcyBhcmUgc3VwcG9ydGVkIGJ5IEZhcmdhdGUuXG4gKi9cblZhbHVlPzogc3RyaW5nXG4vKipcbiAqIFRoZSBuYW1lc3BhY2VkIGtlcm5lbCBwYXJhbWV0ZXIgdG8gc2V0IGEgYGB2YWx1ZWBgIGZvci5cbiAqL1xuTmFtZXNwYWNlPzogc3RyaW5nXG59XG4vKipcbiAqIFRoZSBgYHVsaW1pdGBgIHNldHRpbmdzIHRvIHBhc3MgdG8gdGhlIGNvbnRhaW5lci5cbiAqICBBbWF6b24gRUNTIHRhc2tzIGhvc3RlZCBvbiBGQVJHQVRFbG9uZyB1c2UgdGhlIGRlZmF1bHQgcmVzb3VyY2UgbGltaXQgdmFsdWVzIHNldCBieSB0aGUgb3BlcmF0aW5nIHN5c3RlbSB3aXRoIHRoZSBleGNlcHRpb24gb2YgdGhlIGBgbm9maWxlYGAgcmVzb3VyY2UgbGltaXQgcGFyYW1ldGVyIHdoaWNoIEZBUkdBVEVsb25nIG92ZXJyaWRlcy4gVGhlIGBgbm9maWxlYGAgcmVzb3VyY2UgbGltaXQgc2V0cyBhIHJlc3RyaWN0aW9uIG9uIHRoZSBudW1iZXIgb2Ygb3BlbiBmaWxlcyB0aGF0IGEgY29udGFpbmVyIGNhbiB1c2UuIFRoZSBkZWZhdWx0IGBgbm9maWxlYGAgc29mdCBsaW1pdCBpcyBgYDY1NTM1YGAgYW5kIHRoZSBkZWZhdWx0IGhhcmQgbGltaXQgaXMgYGA2NTUzNWBgLlxuICogIFlvdSBjYW4gc3BlY2lmeSB0aGUgYGB1bGltaXRgYCBzZXR0aW5ncyBmb3IgYSBjb250YWluZXIgaW4gYSB0YXNrIGRlZmluaXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVWxpbWl0IHtcbi8qKlxuICogVGhlIHNvZnQgbGltaXQgZm9yIHRoZSBgYHVsaW1pdGBgIHR5cGUuIFRoZSB2YWx1ZSBjYW4gYmUgc3BlY2lmaWVkIGluIGJ5dGVzLCBzZWNvbmRzLCBvciBhcyBhIGNvdW50LCBkZXBlbmRpbmcgb24gdGhlIGBgdHlwZWBgIG9mIHRoZSBgYHVsaW1pdGBgLlxuICovXG5Tb2Z0TGltaXQ6IG51bWJlclxuLyoqXG4gKiBUaGUgaGFyZCBsaW1pdCBmb3IgdGhlIGBgdWxpbWl0YGAgdHlwZS4gVGhlIHZhbHVlIGNhbiBiZSBzcGVjaWZpZWQgaW4gYnl0ZXMsIHNlY29uZHMsIG9yIGFzIGEgY291bnQsIGRlcGVuZGluZyBvbiB0aGUgYGB0eXBlYGAgb2YgdGhlIGBgdWxpbWl0YGAuXG4gKi9cbkhhcmRMaW1pdDogbnVtYmVyXG4vKipcbiAqIFRoZSBgYHR5cGVgYCBvZiB0aGUgYGB1bGltaXRgYC5cbiAqL1xuTmFtZTogc3RyaW5nXG59XG4vKipcbiAqIFRoZSBwcml2YXRlIHJlcG9zaXRvcnkgYXV0aGVudGljYXRpb24gY3JlZGVudGlhbHMgdG8gdXNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9zaXRvcnlDcmVkZW50aWFscyB7XG4vKipcbiAqIFRoZSBBbWF6b24gUmVzb3VyY2UgTmFtZSAoQVJOKSBvZiB0aGUgc2VjcmV0IGNvbnRhaW5pbmcgdGhlIHByaXZhdGUgcmVwb3NpdG9yeSBjcmVkZW50aWFscy5cbiAqICAgV2hlbiB5b3UgdXNlIHRoZSBBbWF6b24gRUNTIEFQSSwgQ0xJLCBvciBBV1MgU0RLLCBpZiB0aGUgc2VjcmV0IGV4aXN0cyBpbiB0aGUgc2FtZSBSZWdpb24gYXMgdGhlIHRhc2sgdGhhdCB5b3UncmUgbGF1bmNoaW5nIHRoZW4geW91IGNhbiB1c2UgZWl0aGVyIHRoZSBmdWxsIEFSTiBvciB0aGUgbmFtZSBvZiB0aGUgc2VjcmV0LiBXaGVuIHlvdSB1c2UgdGhlIEFXUyBNYW5hZ2VtZW50IENvbnNvbGUsIHlvdSBtdXN0IHNwZWNpZnkgdGhlIGZ1bGwgQVJOIG9mIHRoZSBzZWNyZXQuXG4gKi9cbkNyZWRlbnRpYWxzUGFyYW1ldGVyPzogc3RyaW5nXG59XG4vKipcbiAqIFRoZSBgYEhvc3RFbnRyeWBgIHByb3BlcnR5IHNwZWNpZmllcyBhIGhvc3RuYW1lIGFuZCBhbiBJUCBhZGRyZXNzIHRoYXQgYXJlIGFkZGVkIHRvIHRoZSBgYC9ldGMvaG9zdHNgYCBmaWxlIG9mIGEgY29udGFpbmVyIHRocm91Z2ggdGhlIGBgZXh0cmFIb3N0c2BgIHBhcmFtZXRlciBvZiBpdHMgYGBDb250YWluZXJEZWZpbml0aW9uYGAgcmVzb3VyY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSG9zdEVudHJ5IHtcbi8qKlxuICogVGhlIGhvc3RuYW1lIHRvIHVzZSBpbiB0aGUgYGAvZXRjL2hvc3RzYGAgZW50cnkuXG4gKi9cbkhvc3RuYW1lPzogc3RyaW5nXG4vKipcbiAqIFRoZSBJUCBhZGRyZXNzIHRvIHVzZSBpbiB0aGUgYGAvZXRjL2hvc3RzYGAgZW50cnkuXG4gKi9cbklwQWRkcmVzcz86IHN0cmluZ1xufVxuLyoqXG4gKiBMaW51eC1zcGVjaWZpYyBtb2RpZmljYXRpb25zIHRoYXQgYXJlIGFwcGxpZWQgdG8gdGhlIGNvbnRhaW5lciwgc3VjaCBhcyBMaW51eCBrZXJuZWwgY2FwYWJpbGl0aWVzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgW0tlcm5lbENhcGFiaWxpdGllc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9LZXJuZWxDYXBhYmlsaXRpZXMuaHRtbCkuXG4gKiAgIFRoaXMgcGFyYW1ldGVyIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIFdpbmRvd3MgY29udGFpbmVycy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW51eFBhcmFtZXRlcnMge1xuQ2FwYWJpbGl0aWVzPzogS2VybmVsQ2FwYWJpbGl0aWVzXG4vKipcbiAqIFRoaXMgYWxsb3dzIHlvdSB0byB0dW5lIGEgY29udGFpbmVyJ3MgbWVtb3J5IHN3YXBwaW5lc3MgYmVoYXZpb3IuIEEgYGBzd2FwcGluZXNzYGAgdmFsdWUgb2YgYGAwYGAgd2lsbCBjYXVzZSBzd2FwcGluZyB0byBub3QgaGFwcGVuIHVubGVzcyBhYnNvbHV0ZWx5IG5lY2Vzc2FyeS4gQSBgYHN3YXBwaW5lc3NgYCB2YWx1ZSBvZiBgYDEwMGBgIHdpbGwgY2F1c2UgcGFnZXMgdG8gYmUgc3dhcHBlZCB2ZXJ5IGFnZ3Jlc3NpdmVseS4gQWNjZXB0ZWQgdmFsdWVzIGFyZSB3aG9sZSBudW1iZXJzIGJldHdlZW4gYGAwYGAgYW5kIGBgMTAwYGAuIElmIHRoZSBgYHN3YXBwaW5lc3NgYCBwYXJhbWV0ZXIgaXMgbm90IHNwZWNpZmllZCwgYSBkZWZhdWx0IHZhbHVlIG9mIGBgNjBgYCBpcyB1c2VkLiBJZiBhIHZhbHVlIGlzIG5vdCBzcGVjaWZpZWQgZm9yIGBgbWF4U3dhcGBgIHRoZW4gdGhpcyBwYXJhbWV0ZXIgaXMgaWdub3JlZC4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byB0aGUgYGAtLW1lbW9yeS1zd2FwcGluZXNzYGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKiAgIElmIHlvdSdyZSB1c2luZyB0YXNrcyB0aGF0IHVzZSB0aGUgRmFyZ2F0ZSBsYXVuY2ggdHlwZSwgdGhlIGBgc3dhcHBpbmVzc2BgIHBhcmFtZXRlciBpc24ndCBzdXBwb3J0ZWQuXG4gKiAgSWYgeW91J3JlIHVzaW5nIHRhc2tzIG9uIEFtYXpvbiBMaW51eCAyMDIzIHRoZSBgYHN3YXBwaW5lc3NgYCBwYXJhbWV0ZXIgaXNuJ3Qgc3VwcG9ydGVkLlxuICovXG5Td2FwcGluZXNzPzogbnVtYmVyXG4vKipcbiAqIFRoZSBjb250YWluZXIgcGF0aCwgbW91bnQgb3B0aW9ucywgYW5kIHNpemUgKGluIE1pQikgb2YgdGhlIHRtcGZzIG1vdW50LiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIHRoZSBgYC0tdG1wZnNgYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi5cbiAqICAgSWYgeW91J3JlIHVzaW5nIHRhc2tzIHRoYXQgdXNlIHRoZSBGYXJnYXRlIGxhdW5jaCB0eXBlLCB0aGUgYGB0bXBmc2BgIHBhcmFtZXRlciBpc24ndCBzdXBwb3J0ZWQuXG4gKi9cblRtcGZzPzogVG1wZnNbXVxuLyoqXG4gKiBUaGUgdmFsdWUgZm9yIHRoZSBzaXplIChpbiBNaUIpIG9mIHRoZSBgYC9kZXYvc2htYGAgdm9sdW1lLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIHRoZSBgYC0tc2htLXNpemVgYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi5cbiAqICAgSWYgeW91IGFyZSB1c2luZyB0YXNrcyB0aGF0IHVzZSB0aGUgRmFyZ2F0ZSBsYXVuY2ggdHlwZSwgdGhlIGBgc2hhcmVkTWVtb3J5U2l6ZWBgIHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkLlxuICovXG5TaGFyZWRNZW1vcnlTaXplPzogbnVtYmVyXG4vKipcbiAqIEFueSBob3N0IGRldmljZXMgdG8gZXhwb3NlIHRvIHRoZSBjb250YWluZXIuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBEZXZpY2VzYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYC0tZGV2aWNlYGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKiAgIElmIHlvdSdyZSB1c2luZyB0YXNrcyB0aGF0IHVzZSB0aGUgRmFyZ2F0ZSBsYXVuY2ggdHlwZSwgdGhlIGBgZGV2aWNlc2BgIHBhcmFtZXRlciBpc24ndCBzdXBwb3J0ZWQuXG4gKi9cbkRldmljZXM/OiBEZXZpY2VbXVxuLyoqXG4gKiBSdW4gYW4gYGBpbml0YGAgcHJvY2VzcyBpbnNpZGUgdGhlIGNvbnRhaW5lciB0aGF0IGZvcndhcmRzIHNpZ25hbHMgYW5kIHJlYXBzIHByb2Nlc3Nlcy4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byB0aGUgYGAtLWluaXRgYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi4gVGhpcyBwYXJhbWV0ZXIgcmVxdWlyZXMgdmVyc2lvbiAxLjI1IG9mIHRoZSBEb2NrZXIgUmVtb3RlIEFQSSBvciBncmVhdGVyIG9uIHlvdXIgY29udGFpbmVyIGluc3RhbmNlLiBUbyBjaGVjayB0aGUgRG9ja2VyIFJlbW90ZSBBUEkgdmVyc2lvbiBvbiB5b3VyIGNvbnRhaW5lciBpbnN0YW5jZSwgbG9nIGluIHRvIHlvdXIgY29udGFpbmVyIGluc3RhbmNlIGFuZCBydW4gdGhlIGZvbGxvd2luZyBjb21tYW5kOiBgYHN1ZG8gZG9ja2VyIHZlcnNpb24gLS1mb3JtYXQgJ3t7LlNlcnZlci5BUElWZXJzaW9ufX0nYGBcbiAqL1xuSW5pdFByb2Nlc3NFbmFibGVkPzogYm9vbGVhblxuLyoqXG4gKiBUaGUgdG90YWwgYW1vdW50IG9mIHN3YXAgbWVtb3J5IChpbiBNaUIpIGEgY29udGFpbmVyIGNhbiB1c2UuIFRoaXMgcGFyYW1ldGVyIHdpbGwgYmUgdHJhbnNsYXRlZCB0byB0aGUgYGAtLW1lbW9yeS1zd2FwYGAgb3B0aW9uIHRvIGRvY2tlciBydW4gd2hlcmUgdGhlIHZhbHVlIHdvdWxkIGJlIHRoZSBzdW0gb2YgdGhlIGNvbnRhaW5lciBtZW1vcnkgcGx1cyB0aGUgYGBtYXhTd2FwYGAgdmFsdWUuXG4gKiAgSWYgYSBgYG1heFN3YXBgYCB2YWx1ZSBvZiBgYDBgYCBpcyBzcGVjaWZpZWQsIHRoZSBjb250YWluZXIgd2lsbCBub3QgdXNlIHN3YXAuIEFjY2VwdGVkIHZhbHVlcyBhcmUgYGAwYGAgb3IgYW55IHBvc2l0aXZlIGludGVnZXIuIElmIHRoZSBgYG1heFN3YXBgYCBwYXJhbWV0ZXIgaXMgb21pdHRlZCwgdGhlIGNvbnRhaW5lciB3aWxsIHVzZSB0aGUgc3dhcCBjb25maWd1cmF0aW9uIGZvciB0aGUgY29udGFpbmVyIGluc3RhbmNlIGl0IGlzIHJ1bm5pbmcgb24uIEEgYGBtYXhTd2FwYGAgdmFsdWUgbXVzdCBiZSBzZXQgZm9yIHRoZSBgYHN3YXBwaW5lc3NgYCBwYXJhbWV0ZXIgdG8gYmUgdXNlZC5cbiAqICAgSWYgeW91J3JlIHVzaW5nIHRhc2tzIHRoYXQgdXNlIHRoZSBGYXJnYXRlIGxhdW5jaCB0eXBlLCB0aGUgYGBtYXhTd2FwYGAgcGFyYW1ldGVyIGlzbid0IHN1cHBvcnRlZC5cbiAqICBJZiB5b3UncmUgdXNpbmcgdGFza3Mgb24gQW1hem9uIExpbnV4IDIwMjMgdGhlIGBgc3dhcHBpbmVzc2BgIHBhcmFtZXRlciBpc24ndCBzdXBwb3J0ZWQuXG4gKi9cbk1heFN3YXA/OiBudW1iZXJcbn1cbi8qKlxuICogVGhlIExpbnV4IGNhcGFiaWxpdGllcyBmb3IgdGhlIGNvbnRhaW5lciB0aGF0IGFyZSBhZGRlZCB0byBvciBkcm9wcGVkIGZyb20gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBwcm92aWRlZCBieSBEb2NrZXIuXG4gKiAgIEZvciB0YXNrcyB0aGF0IHVzZSB0aGUgRmFyZ2F0ZSBsYXVuY2ggdHlwZSwgYGBjYXBhYmlsaXRpZXNgYCBpcyBzdXBwb3J0ZWQgZm9yIGFsbCBwbGF0Zm9ybSB2ZXJzaW9ucyBidXQgdGhlIGBgYWRkYGAgcGFyYW1ldGVyIGlzIG9ubHkgc3VwcG9ydGVkIGlmIHVzaW5nIHBsYXRmb3JtIHZlcnNpb24gMS40LjAgb3IgbGF0ZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgS2VybmVsQ2FwYWJpbGl0aWVzIHtcbi8qKlxuICogVGhlIExpbnV4IGNhcGFiaWxpdGllcyBmb3IgdGhlIGNvbnRhaW5lciB0aGF0IGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIHByb3ZpZGVkIGJ5IERvY2tlci4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYENhcEFkZGBgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kIGFuZCB0aGUgYGAtLWNhcC1hZGRgYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi5cbiAqICAgVGFza3MgbGF1bmNoZWQgb24gRkFSR0FURWxvbmcgb25seSBzdXBwb3J0IGFkZGluZyB0aGUgYGBTWVNfUFRSQUNFYGAga2VybmVsIGNhcGFiaWxpdHkuXG4gKiAgIFZhbGlkIHZhbHVlczogYGBcIkFMTFwiIHwgXCJBVURJVF9DT05UUk9MXCIgfCBcIkFVRElUX1dSSVRFXCIgfCBcIkJMT0NLX1NVU1BFTkRcIiB8IFwiQ0hPV05cIiB8IFwiREFDX09WRVJSSURFXCIgfCBcIkRBQ19SRUFEX1NFQVJDSFwiIHwgXCJGT1dORVJcIiB8IFwiRlNFVElEXCIgfCBcIklQQ19MT0NLXCIgfCBcIklQQ19PV05FUlwiIHwgXCJLSUxMXCIgfCBcIkxFQVNFXCIgfCBcIkxJTlVYX0lNTVVUQUJMRVwiIHwgXCJNQUNfQURNSU5cIiB8IFwiTUFDX09WRVJSSURFXCIgfCBcIk1LTk9EXCIgfCBcIk5FVF9BRE1JTlwiIHwgXCJORVRfQklORF9TRVJWSUNFXCIgfCBcIk5FVF9CUk9BRENBU1RcIiB8IFwiTkVUX1JBV1wiIHwgXCJTRVRGQ0FQXCIgfCBcIlNFVEdJRFwiIHwgXCJTRVRQQ0FQXCIgfCBcIlNFVFVJRFwiIHwgXCJTWVNfQURNSU5cIiB8IFwiU1lTX0JPT1RcIiB8IFwiU1lTX0NIUk9PVFwiIHwgXCJTWVNfTU9EVUxFXCIgfCBcIlNZU19OSUNFXCIgfCBcIlNZU19QQUNDVFwiIHwgXCJTWVNfUFRSQUNFXCIgfCBcIlNZU19SQVdJT1wiIHwgXCJTWVNfUkVTT1VSQ0VcIiB8IFwiU1lTX1RJTUVcIiB8IFwiU1lTX1RUWV9DT05GSUdcIiB8IFwiU1lTTE9HXCIgfCBcIldBS0VfQUxBUk1cImBgXG4gKi9cbkFkZD86IHN0cmluZ1tdXG4vKipcbiAqIFRoZSBMaW51eCBjYXBhYmlsaXRpZXMgZm9yIHRoZSBjb250YWluZXIgdGhhdCBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gcHJvdmlkZWQgYnkgRG9ja2VyLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgQ2FwRHJvcGBgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kIGFuZCB0aGUgYGAtLWNhcC1kcm9wYGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKiAgVmFsaWQgdmFsdWVzOiBgYFwiQUxMXCIgfCBcIkFVRElUX0NPTlRST0xcIiB8IFwiQVVESVRfV1JJVEVcIiB8IFwiQkxPQ0tfU1VTUEVORFwiIHwgXCJDSE9XTlwiIHwgXCJEQUNfT1ZFUlJJREVcIiB8IFwiREFDX1JFQURfU0VBUkNIXCIgfCBcIkZPV05FUlwiIHwgXCJGU0VUSURcIiB8IFwiSVBDX0xPQ0tcIiB8IFwiSVBDX09XTkVSXCIgfCBcIktJTExcIiB8IFwiTEVBU0VcIiB8IFwiTElOVVhfSU1NVVRBQkxFXCIgfCBcIk1BQ19BRE1JTlwiIHwgXCJNQUNfT1ZFUlJJREVcIiB8IFwiTUtOT0RcIiB8IFwiTkVUX0FETUlOXCIgfCBcIk5FVF9CSU5EX1NFUlZJQ0VcIiB8IFwiTkVUX0JST0FEQ0FTVFwiIHwgXCJORVRfUkFXXCIgfCBcIlNFVEZDQVBcIiB8IFwiU0VUR0lEXCIgfCBcIlNFVFBDQVBcIiB8IFwiU0VUVUlEXCIgfCBcIlNZU19BRE1JTlwiIHwgXCJTWVNfQk9PVFwiIHwgXCJTWVNfQ0hST09UXCIgfCBcIlNZU19NT0RVTEVcIiB8IFwiU1lTX05JQ0VcIiB8IFwiU1lTX1BBQ0NUXCIgfCBcIlNZU19QVFJBQ0VcIiB8IFwiU1lTX1JBV0lPXCIgfCBcIlNZU19SRVNPVVJDRVwiIHwgXCJTWVNfVElNRVwiIHwgXCJTWVNfVFRZX0NPTkZJR1wiIHwgXCJTWVNMT0dcIiB8IFwiV0FLRV9BTEFSTVwiYGBcbiAqL1xuRHJvcD86IHN0cmluZ1tdXG59XG4vKipcbiAqIFRoZSBjb250YWluZXIgcGF0aCwgbW91bnQgb3B0aW9ucywgYW5kIHNpemUgb2YgdGhlIHRtcGZzIG1vdW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRtcGZzIHtcbi8qKlxuICogVGhlIG1heGltdW0gc2l6ZSAoaW4gTWlCKSBvZiB0aGUgdG1wZnMgdm9sdW1lLlxuICovXG5TaXplOiBudW1iZXJcbi8qKlxuICogVGhlIGFic29sdXRlIGZpbGUgcGF0aCB3aGVyZSB0aGUgdG1wZnMgdm9sdW1lIGlzIHRvIGJlIG1vdW50ZWQuXG4gKi9cbkNvbnRhaW5lclBhdGg/OiBzdHJpbmdcbi8qKlxuICogVGhlIGxpc3Qgb2YgdG1wZnMgdm9sdW1lIG1vdW50IG9wdGlvbnMuXG4gKiAgVmFsaWQgdmFsdWVzOiBgYFwiZGVmYXVsdHNcIiB8IFwicm9cIiB8IFwicndcIiB8IFwic3VpZFwiIHwgXCJub3N1aWRcIiB8IFwiZGV2XCIgfCBcIm5vZGV2XCIgfCBcImV4ZWNcIiB8IFwibm9leGVjXCIgfCBcInN5bmNcIiB8IFwiYXN5bmNcIiB8IFwiZGlyc3luY1wiIHwgXCJyZW1vdW50XCIgfCBcIm1hbmRcIiB8IFwibm9tYW5kXCIgfCBcImF0aW1lXCIgfCBcIm5vYXRpbWVcIiB8IFwiZGlyYXRpbWVcIiB8IFwibm9kaXJhdGltZVwiIHwgXCJiaW5kXCIgfCBcInJiaW5kXCIgfCBcInVuYmluZGFibGVcIiB8IFwicnVuYmluZGFibGVcIiB8IFwicHJpdmF0ZVwiIHwgXCJycHJpdmF0ZVwiIHwgXCJzaGFyZWRcIiB8IFwicnNoYXJlZFwiIHwgXCJzbGF2ZVwiIHwgXCJyc2xhdmVcIiB8IFwicmVsYXRpbWVcIiB8IFwibm9yZWxhdGltZVwiIHwgXCJzdHJpY3RhdGltZVwiIHwgXCJub3N0cmljdGF0aW1lXCIgfCBcIm1vZGVcIiB8IFwidWlkXCIgfCBcImdpZFwiIHwgXCJucl9pbm9kZXNcIiB8IFwibnJfYmxvY2tzXCIgfCBcIm1wb2xcImBgXG4gKi9cbk1vdW50T3B0aW9ucz86IHN0cmluZ1tdXG59XG4vKipcbiAqIFRoZSBgYERldmljZWBgIHByb3BlcnR5IHNwZWNpZmllcyBhbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgY29udGFpbmVyIGluc3RhbmNlIGhvc3QgZGV2aWNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERldmljZSB7XG4vKipcbiAqIFRoZSBwYXRoIGZvciB0aGUgZGV2aWNlIG9uIHRoZSBob3N0IGNvbnRhaW5lciBpbnN0YW5jZS5cbiAqL1xuSG9zdFBhdGg/OiBzdHJpbmdcbi8qKlxuICogVGhlIGV4cGxpY2l0IHBlcm1pc3Npb25zIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnRhaW5lciBmb3IgdGhlIGRldmljZS4gQnkgZGVmYXVsdCwgdGhlIGNvbnRhaW5lciBoYXMgcGVybWlzc2lvbnMgZm9yIGBgcmVhZGBgLCBgYHdyaXRlYGAsIGFuZCBgYG1rbm9kYGAgZm9yIHRoZSBkZXZpY2UuXG4gKi9cblBlcm1pc3Npb25zPzogc3RyaW5nW11cbi8qKlxuICogVGhlIHBhdGggaW5zaWRlIHRoZSBjb250YWluZXIgYXQgd2hpY2ggdG8gZXhwb3NlIHRoZSBob3N0IGRldmljZS5cbiAqL1xuQ29udGFpbmVyUGF0aD86IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgcmVzdGFydCBwb2xpY3kgZm9yIGEgY29udGFpbmVyLiBXaGVuIHlvdSBzZXQgdXAgYSByZXN0YXJ0IHBvbGljeSwgQW1hem9uIEVDUyBjYW4gcmVzdGFydCB0aGUgY29udGFpbmVyIHdpdGhvdXQgbmVlZGluZyB0byByZXBsYWNlIHRoZSB0YXNrLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtSZXN0YXJ0IGluZGl2aWR1YWwgY29udGFpbmVycyBpbiBBbWF6b24gRUNTIHRhc2tzIHdpdGggY29udGFpbmVyIHJlc3RhcnQgcG9saWNpZXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2NvbnRhaW5lci1yZXN0YXJ0LXBvbGljeS5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzdGFydFBvbGljeSB7XG4vKipcbiAqIEEgbGlzdCBvZiBleGl0IGNvZGVzIHRoYXQgQW1hem9uIEVDUyB3aWxsIGlnbm9yZSBhbmQgbm90IGF0dGVtcHQgYSByZXN0YXJ0IG9uLiBZb3UgY2FuIHNwZWNpZnkgYSBtYXhpbXVtIG9mIDUwIGNvbnRhaW5lciBleGl0IGNvZGVzLiBCeSBkZWZhdWx0LCBBbWF6b24gRUNTIGRvZXMgbm90IGlnbm9yZSBhbnkgZXhpdCBjb2Rlcy5cbiAqL1xuSWdub3JlZEV4aXRDb2Rlcz86IG51bWJlcltdXG4vKipcbiAqIEEgcGVyaW9kIG9mIHRpbWUgKGluIHNlY29uZHMpIHRoYXQgdGhlIGNvbnRhaW5lciBtdXN0IHJ1biBmb3IgYmVmb3JlIGEgcmVzdGFydCBjYW4gYmUgYXR0ZW1wdGVkLiBBIGNvbnRhaW5lciBjYW4gYmUgcmVzdGFydGVkIG9ubHkgb25jZSBldmVyeSBgYHJlc3RhcnRBdHRlbXB0UGVyaW9kYGAgc2Vjb25kcy4gSWYgYSBjb250YWluZXIgaXNuJ3QgYWJsZSB0byBydW4gZm9yIHRoaXMgdGltZSBwZXJpb2QgYW5kIGV4aXRzIGVhcmx5LCBpdCB3aWxsIG5vdCBiZSByZXN0YXJ0ZWQuIFlvdSBjYW4gc2V0IGEgbWluaW11bSBgYHJlc3RhcnRBdHRlbXB0UGVyaW9kYGAgb2YgNjAgc2Vjb25kcyBhbmQgYSBtYXhpbXVtIGBgcmVzdGFydEF0dGVtcHRQZXJpb2RgYCBvZiAxODAwIHNlY29uZHMuIEJ5IGRlZmF1bHQsIGEgY29udGFpbmVyIG11c3QgcnVuIGZvciAzMDAgc2Vjb25kcyBiZWZvcmUgaXQgY2FuIGJlIHJlc3RhcnRlZC5cbiAqL1xuUmVzdGFydEF0dGVtcHRQZXJpb2Q/OiBudW1iZXJcbi8qKlxuICogU3BlY2lmaWVzIHdoZXRoZXIgYSByZXN0YXJ0IHBvbGljeSBpcyBlbmFibGVkIGZvciB0aGUgY29udGFpbmVyLlxuICovXG5FbmFibGVkPzogYm9vbGVhblxufVxuLyoqXG4gKiBUaGUgZGV0YWlscyBmb3IgYSB2b2x1bWUgbW91bnQgcG9pbnQgdGhhdCdzIHVzZWQgaW4gYSBjb250YWluZXIgZGVmaW5pdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb3VudFBvaW50IHtcbi8qKlxuICogSWYgdGhpcyB2YWx1ZSBpcyBgYHRydWVgYCwgdGhlIGNvbnRhaW5lciBoYXMgcmVhZC1vbmx5IGFjY2VzcyB0byB0aGUgdm9sdW1lLiBJZiB0aGlzIHZhbHVlIGlzIGBgZmFsc2VgYCwgdGhlbiB0aGUgY29udGFpbmVyIGNhbiB3cml0ZSB0byB0aGUgdm9sdW1lLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgYGZhbHNlYGAuXG4gKi9cblJlYWRPbmx5PzogYm9vbGVhblxuLyoqXG4gKiBUaGUgbmFtZSBvZiB0aGUgdm9sdW1lIHRvIG1vdW50LiBNdXN0IGJlIGEgdm9sdW1lIG5hbWUgcmVmZXJlbmNlZCBpbiB0aGUgYGBuYW1lYGAgcGFyYW1ldGVyIG9mIHRhc2sgZGVmaW5pdGlvbiBgYHZvbHVtZWBgLlxuICovXG5Tb3VyY2VWb2x1bWU/OiBzdHJpbmdcbi8qKlxuICogVGhlIHBhdGggb24gdGhlIGNvbnRhaW5lciB0byBtb3VudCB0aGUgaG9zdCB2b2x1bWUgYXQuXG4gKi9cbkNvbnRhaW5lclBhdGg/OiBzdHJpbmdcbn1cbi8qKlxuICogVGhlIGBgQ29udGFpbmVyRGVwZW5kZW5jeWBgIHByb3BlcnR5IHNwZWNpZmllcyB0aGUgZGVwZW5kZW5jaWVzIGRlZmluZWQgZm9yIGNvbnRhaW5lciBzdGFydHVwIGFuZCBzaHV0ZG93bi4gQSBjb250YWluZXIgY2FuIGNvbnRhaW4gbXVsdGlwbGUgZGVwZW5kZW5jaWVzLiBXaGVuIGEgZGVwZW5kZW5jeSBpcyBkZWZpbmVkIGZvciBjb250YWluZXIgc3RhcnR1cCwgZm9yIGNvbnRhaW5lciBzaHV0ZG93biBpdCBpcyByZXZlcnNlZC5cbiAqICBZb3VyIEFtYXpvbiBFQ1MgY29udGFpbmVyIGluc3RhbmNlcyByZXF1aXJlIGF0IGxlYXN0IHZlcnNpb24gMS4yNi4wIG9mIHRoZSBjb250YWluZXIgYWdlbnQgdG8gZW5hYmxlIGNvbnRhaW5lciBkZXBlbmRlbmNpZXMuIEhvd2V2ZXIsIHdlIHJlY29tbWVuZCB1c2luZyB0aGUgbGF0ZXN0IGNvbnRhaW5lciBhZ2VudCB2ZXJzaW9uLiBGb3IgaW5mb3JtYXRpb24gYWJvdXQgY2hlY2tpbmcgeW91ciBhZ2VudCB2ZXJzaW9uIGFuZCB1cGRhdGluZyB0byB0aGUgbGF0ZXN0IHZlcnNpb24sIHNlZSBbVXBkYXRpbmcgdGhlIEFtYXpvbiBFQ1MgQ29udGFpbmVyIEFnZW50XShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9lY3MtYWdlbnQtdXBkYXRlLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi4gSWYgeW91IGFyZSB1c2luZyBhbiBBbWF6b24gRUNTLW9wdGltaXplZCBMaW51eCBBTUksIHlvdXIgaW5zdGFuY2UgbmVlZHMgYXQgbGVhc3QgdmVyc2lvbiAxLjI2LjAtMSBvZiB0aGUgYGBlY3MtaW5pdGBgIHBhY2thZ2UuIElmIHlvdXIgY29udGFpbmVyIGluc3RhbmNlcyBhcmUgbGF1bmNoZWQgZnJvbSB2ZXJzaW9uIGBgMjAxOTAzMDFgYCBvciBsYXRlciwgdGhlbiB0aGV5IGNvbnRhaW4gdGhlIHJlcXVpcmVkIHZlcnNpb25zIG9mIHRoZSBjb250YWluZXIgYWdlbnQgYW5kIGBgZWNzLWluaXRgYC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQW1hem9uIEVDUy1vcHRpbWl6ZWQgTGludXggQU1JXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9lY3Mtb3B0aW1pemVkX0FNSS5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKiAgIEZvciB0YXNrcyB1c2luZyB0aGUgRmFyZ2F0ZSBsYXVuY2ggdHlwZSwgdGhpcyBwYXJhbWV0ZXIgcmVxdWlyZXMgdGhhdCB0aGUgdGFzayBvciBzZXJ2aWNlIHVzZXMgcGxhdGZvcm0gdmVyc2lvbiAxLjMuMCBvciBsYXRlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250YWluZXJEZXBlbmRlbmN5IHtcbi8qKlxuICogVGhlIGRlcGVuZGVuY3kgY29uZGl0aW9uIG9mIHRoZSBjb250YWluZXIuIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSBhdmFpbGFibGUgY29uZGl0aW9ucyBhbmQgdGhlaXIgYmVoYXZpb3I6XG4gKiAgICsgICBgYFNUQVJUYGAgLSBUaGlzIGNvbmRpdGlvbiBlbXVsYXRlcyB0aGUgYmVoYXZpb3Igb2YgbGlua3MgYW5kIHZvbHVtZXMgdG9kYXkuIEl0IHZhbGlkYXRlcyB0aGF0IGEgZGVwZW5kZW50IGNvbnRhaW5lciBpcyBzdGFydGVkIGJlZm9yZSBwZXJtaXR0aW5nIG90aGVyIGNvbnRhaW5lcnMgdG8gc3RhcnQuXG4gKiAgICsgICBgYENPTVBMRVRFYGAgLSBUaGlzIGNvbmRpdGlvbiB2YWxpZGF0ZXMgdGhhdCBhIGRlcGVuZGVudCBjb250YWluZXIgcnVucyB0byBjb21wbGV0aW9uIChleGl0cykgYmVmb3JlIHBlcm1pdHRpbmcgb3RoZXIgY29udGFpbmVycyB0byBzdGFydC4gVGhpcyBjYW4gYmUgdXNlZnVsIGZvciBub25lc3NlbnRpYWwgY29udGFpbmVycyB0aGF0IHJ1biBhIHNjcmlwdCBhbmQgdGhlbiBleGl0LiBUaGlzIGNvbmRpdGlvbiBjYW4ndCBiZSBzZXQgb24gYW4gZXNzZW50aWFsIGNvbnRhaW5lci5cbiAqICAgKyAgIGBgU1VDQ0VTU2BgIC0gVGhpcyBjb25kaXRpb24gaXMgdGhlIHNhbWUgYXMgYGBDT01QTEVURWBgLCBidXQgaXQgYWxzbyByZXF1aXJlcyB0aGF0IHRoZSBjb250YWluZXIgZXhpdHMgd2l0aCBhIGBgemVyb2BgIHN0YXR1cy4gVGhpcyBjb25kaXRpb24gY2FuJ3QgYmUgc2V0IG9uIGFuIGVzc2VudGlhbCBjb250YWluZXIuXG4gKiAgICsgICBgYEhFQUxUSFlgYCAtIFRoaXMgY29uZGl0aW9uIHZhbGlkYXRlcyB0aGF0IHRoZSBkZXBlbmRlbnQgY29udGFpbmVyIHBhc3NlcyBpdHMgRG9ja2VyIGhlYWx0aCBjaGVjayBiZWZvcmUgcGVybWl0dGluZyBvdGhlciBjb250YWluZXJzIHRvIHN0YXJ0LiBUaGlzIHJlcXVpcmVzIHRoYXQgdGhlIGRlcGVuZGVudCBjb250YWluZXIgaGFzIGhlYWx0aCBjaGVja3MgY29uZmlndXJlZC4gVGhpcyBjb25kaXRpb24gaXMgY29uZmlybWVkIG9ubHkgYXQgdGFzayBzdGFydHVwLlxuICovXG5Db25kaXRpb24/OiBzdHJpbmdcbi8qKlxuICogVGhlIG5hbWUgb2YgYSBjb250YWluZXIuXG4gKi9cbkNvbnRhaW5lck5hbWU/OiBzdHJpbmdcbn1cbi8qKlxuICogVGhlIGBgUG9ydE1hcHBpbmdgYCBwcm9wZXJ0eSBzcGVjaWZpZXMgYSBwb3J0IG1hcHBpbmcuIFBvcnQgbWFwcGluZ3MgYWxsb3cgY29udGFpbmVycyB0byBhY2Nlc3MgcG9ydHMgb24gdGhlIGhvc3QgY29udGFpbmVyIGluc3RhbmNlIHRvIHNlbmQgb3IgcmVjZWl2ZSB0cmFmZmljLiBQb3J0IG1hcHBpbmdzIGFyZSBzcGVjaWZpZWQgYXMgcGFydCBvZiB0aGUgY29udGFpbmVyIGRlZmluaXRpb24uXG4gKiAgSWYgeW91IGFyZSB1c2luZyBjb250YWluZXJzIGluIGEgdGFzayB3aXRoIHRoZSBgYGF3c3ZwY2BgIG9yIGBgaG9zdGBgIG5ldHdvcmsgbW9kZSwgZXhwb3NlZCBwb3J0cyBzaG91bGQgYmUgc3BlY2lmaWVkIHVzaW5nIGBgY29udGFpbmVyUG9ydGBgLiBUaGUgYGBob3N0UG9ydGBgIGNhbiBiZSBsZWZ0IGJsYW5rIG9yIGl0IG11c3QgYmUgdGhlIHNhbWUgdmFsdWUgYXMgdGhlIGBgY29udGFpbmVyUG9ydGBgLlxuICogIEFmdGVyIGEgdGFzayByZWFjaGVzIHRoZSBgYFJVTk5JTkdgYCBzdGF0dXMsIG1hbnVhbCBhbmQgYXV0b21hdGljIGhvc3QgYW5kIGNvbnRhaW5lciBwb3J0IGFzc2lnbm1lbnRzIGFyZSB2aXNpYmxlIGluIHRoZSBgYG5ldHdvcmtCaW5kaW5nc2BgIHNlY3Rpb24gb2YgW0Rlc2NyaWJlVGFza3NdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVUYXNrcy5odG1sKSBBUEkgcmVzcG9uc2VzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBvcnRNYXBwaW5nIHtcbi8qKlxuICogVGhlIGFwcGxpY2F0aW9uIHByb3RvY29sIHRoYXQncyB1c2VkIGZvciB0aGUgcG9ydCBtYXBwaW5nLiBUaGlzIHBhcmFtZXRlciBvbmx5IGFwcGxpZXMgdG8gU2VydmljZSBDb25uZWN0LiBXZSByZWNvbW1lbmQgdGhhdCB5b3Ugc2V0IHRoaXMgcGFyYW1ldGVyIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgcHJvdG9jb2wgdGhhdCB5b3VyIGFwcGxpY2F0aW9uIHVzZXMuIElmIHlvdSBzZXQgdGhpcyBwYXJhbWV0ZXIsIEFtYXpvbiBFQ1MgYWRkcyBwcm90b2NvbC1zcGVjaWZpYyBjb25uZWN0aW9uIGhhbmRsaW5nIHRvIHRoZSBTZXJ2aWNlIENvbm5lY3QgcHJveHkuIElmIHlvdSBzZXQgdGhpcyBwYXJhbWV0ZXIsIEFtYXpvbiBFQ1MgYWRkcyBwcm90b2NvbC1zcGVjaWZpYyB0ZWxlbWV0cnkgaW4gdGhlIEFtYXpvbiBFQ1MgY29uc29sZSBhbmQgQ2xvdWRXYXRjaC5cbiAqICBJZiB5b3UgZG9uJ3Qgc2V0IGEgdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyLCB0aGVuIFRDUCBpcyB1c2VkLiBIb3dldmVyLCBBbWF6b24gRUNTIGRvZXNuJ3QgYWRkIHByb3RvY29sLXNwZWNpZmljIHRlbGVtZXRyeSBmb3IgVENQLlxuICogICBgYGFwcFByb3RvY29sYGAgaXMgaW1tdXRhYmxlIGluIGEgU2VydmljZSBDb25uZWN0IHNlcnZpY2UuIFVwZGF0aW5nIHRoaXMgZmllbGQgcmVxdWlyZXMgYSBzZXJ2aWNlIGRlbGV0aW9uIGFuZCByZWRlcGxveW1lbnQuXG4gKiAgVGFza3MgdGhhdCBydW4gaW4gYSBuYW1lc3BhY2UgY2FuIHVzZSBzaG9ydCBuYW1lcyB0byBjb25uZWN0IHRvIHNlcnZpY2VzIGluIHRoZSBuYW1lc3BhY2UuIFRhc2tzIGNhbiBjb25uZWN0IHRvIHNlcnZpY2VzIGFjcm9zcyBhbGwgb2YgdGhlIGNsdXN0ZXJzIGluIHRoZSBuYW1lc3BhY2UuIFRhc2tzIGNvbm5lY3QgdGhyb3VnaCBhIG1hbmFnZWQgcHJveHkgY29udGFpbmVyIHRoYXQgY29sbGVjdHMgbG9ncyBhbmQgbWV0cmljcyBmb3IgaW5jcmVhc2VkIHZpc2liaWxpdHkuIE9ubHkgdGhlIHRhc2tzIHRoYXQgQW1hem9uIEVDUyBzZXJ2aWNlcyBjcmVhdGUgYXJlIHN1cHBvcnRlZCB3aXRoIFNlcnZpY2UgQ29ubmVjdC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbU2VydmljZSBDb25uZWN0XShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9zZXJ2aWNlLWNvbm5lY3QuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5BcHBQcm90b2NvbD86IChcImh0dHBcIiB8IFwiaHR0cDJcIiB8IFwiZ3JwY1wiKVxuLyoqXG4gKiBUaGUgcG9ydCBudW1iZXIgcmFuZ2Ugb24gdGhlIGNvbnRhaW5lciB0aGF0J3MgYm91bmQgdG8gdGhlIGR5bmFtaWNhbGx5IG1hcHBlZCBob3N0IHBvcnQgcmFuZ2UuIFxuICogIFRoZSBmb2xsb3dpbmcgcnVsZXMgYXBwbHkgd2hlbiB5b3Ugc3BlY2lmeSBhIGBgY29udGFpbmVyUG9ydFJhbmdlYGA6XG4gKiAgICsgIFlvdSBtdXN0IHVzZSBlaXRoZXIgdGhlIGBgYnJpZGdlYGAgbmV0d29yayBtb2RlIG9yIHRoZSBgYGF3c3ZwY2BgIG5ldHdvcmsgbW9kZS5cbiAqICAgKyAgVGhpcyBwYXJhbWV0ZXIgaXMgYXZhaWxhYmxlIGZvciBib3RoIHRoZSBFQzIgYW5kIEZBUkdBVEVsb25nIGxhdW5jaCB0eXBlcy5cbiAqICAgKyAgVGhpcyBwYXJhbWV0ZXIgaXMgYXZhaWxhYmxlIGZvciBib3RoIHRoZSBMaW51eCBhbmQgV2luZG93cyBvcGVyYXRpbmcgc3lzdGVtcy5cbiAqICAgKyAgVGhlIGNvbnRhaW5lciBpbnN0YW5jZSBtdXN0IGhhdmUgYXQgbGVhc3QgdmVyc2lvbiAxLjY3LjAgb2YgdGhlIGNvbnRhaW5lciBhZ2VudCBhbmQgYXQgbGVhc3QgdmVyc2lvbiAxLjY3LjAtMSBvZiB0aGUgYGBlY3MtaW5pdGBgIHBhY2thZ2UgXG4gKiAgICsgIFlvdSBjYW4gc3BlY2lmeSBhIG1heGltdW0gb2YgMTAwIHBvcnQgcmFuZ2VzIHBlciBjb250YWluZXIuXG4gKiAgICsgIFlvdSBkbyBub3Qgc3BlY2lmeSBhIGBgaG9zdFBvcnRSYW5nZWBgLiBUaGUgdmFsdWUgb2YgdGhlIGBgaG9zdFBvcnRSYW5nZWBgIGlzIHNldCBhcyBmb2xsb3dzOlxuICogICArICBGb3IgY29udGFpbmVycyBpbiBhIHRhc2sgd2l0aCB0aGUgYGBhd3N2cGNgYCBuZXR3b3JrIG1vZGUsIHRoZSBgYGhvc3RQb3J0UmFuZ2VgYCBpcyBzZXQgdG8gdGhlIHNhbWUgdmFsdWUgYXMgdGhlIGBgY29udGFpbmVyUG9ydFJhbmdlYGAuIFRoaXMgaXMgYSBzdGF0aWMgbWFwcGluZyBzdHJhdGVneS5cbiAqICAgKyAgRm9yIGNvbnRhaW5lcnMgaW4gYSB0YXNrIHdpdGggdGhlIGBgYnJpZGdlYGAgbmV0d29yayBtb2RlLCB0aGUgQW1hem9uIEVDUyBhZ2VudCBmaW5kcyBvcGVuIGhvc3QgcG9ydHMgZnJvbSB0aGUgZGVmYXVsdCBlcGhlbWVyYWwgcmFuZ2UgYW5kIHBhc3NlcyBpdCB0byBkb2NrZXIgdG8gYmluZCB0aGVtIHRvIHRoZSBjb250YWluZXIgcG9ydHMuXG4gKiAgIFxuICogICArICBUaGUgYGBjb250YWluZXJQb3J0UmFuZ2VgYCB2YWxpZCB2YWx1ZXMgYXJlIGJldHdlZW4gMSBhbmQgNjU1MzUuXG4gKiAgICsgIEEgcG9ydCBjYW4gb25seSBiZSBpbmNsdWRlZCBpbiBvbmUgcG9ydCBtYXBwaW5nIHBlciBjb250YWluZXIuXG4gKiAgICsgIFlvdSBjYW5ub3Qgc3BlY2lmeSBvdmVybGFwcGluZyBwb3J0IHJhbmdlcy5cbiAqICAgKyAgVGhlIGZpcnN0IHBvcnQgaW4gdGhlIHJhbmdlIG11c3QgYmUgbGVzcyB0aGFuIGxhc3QgcG9ydCBpbiB0aGUgcmFuZ2UuXG4gKiAgICsgIERvY2tlciByZWNvbW1lbmRzIHRoYXQgeW91IHR1cm4gb2ZmIHRoZSBkb2NrZXItcHJveHkgaW4gdGhlIERvY2tlciBkYWVtb24gY29uZmlnIGZpbGUgd2hlbiB5b3UgaGF2ZSBhIGxhcmdlIG51bWJlciBvZiBwb3J0cy5cbiAqICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtJc3N1ZSAjMTExODVdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9odHRwczovL2dpdGh1Yi5jb20vbW9ieS9tb2J5L2lzc3Vlcy8xMTE4NSkgb24gdGhlIEdpdGh1YiB3ZWJzaXRlLlxuICogIEZvciBpbmZvcm1hdGlvbiBhYm91dCBob3cgdG8gdHVybiBvZmYgdGhlIGRvY2tlci1wcm94eSBpbiB0aGUgRG9ja2VyIGRhZW1vbiBjb25maWcgZmlsZSwgc2VlIFtEb2NrZXIgZGFlbW9uXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9ib290c3RyYXBfY29udGFpbmVyX2luc3RhbmNlLmh0bWwjYm9vdHN0cmFwX2RvY2tlcl9kYWVtb24pIGluIHRoZSAqQW1hem9uIEVDUyBEZXZlbG9wZXIgR3VpZGUqLlxuICogICBcbiAqICBZb3UgY2FuIGNhbGwgW0Rlc2NyaWJlVGFza3NdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVUYXNrcy5odG1sKSB0byB2aWV3IHRoZSBgYGhvc3RQb3J0UmFuZ2VgYCB3aGljaCBhcmUgdGhlIGhvc3QgcG9ydHMgdGhhdCBhcmUgYm91bmQgdG8gdGhlIGNvbnRhaW5lciBwb3J0cy5cbiAqL1xuQ29udGFpbmVyUG9ydFJhbmdlPzogc3RyaW5nXG4vKipcbiAqIFRoZSBwb3J0IG51bWJlciBvbiB0aGUgY29udGFpbmVyIGluc3RhbmNlIHRvIHJlc2VydmUgZm9yIHlvdXIgY29udGFpbmVyLlxuICogIElmIHlvdSBzcGVjaWZ5IGEgYGBjb250YWluZXJQb3J0UmFuZ2VgYCwgbGVhdmUgdGhpcyBmaWVsZCBlbXB0eSBhbmQgdGhlIHZhbHVlIG9mIHRoZSBgYGhvc3RQb3J0YGAgaXMgc2V0IGFzIGZvbGxvd3M6XG4gKiAgICsgIEZvciBjb250YWluZXJzIGluIGEgdGFzayB3aXRoIHRoZSBgYGF3c3ZwY2BgIG5ldHdvcmsgbW9kZSwgdGhlIGBgaG9zdFBvcnRgYCBpcyBzZXQgdG8gdGhlIHNhbWUgdmFsdWUgYXMgdGhlIGBgY29udGFpbmVyUG9ydGBgLiBUaGlzIGlzIGEgc3RhdGljIG1hcHBpbmcgc3RyYXRlZ3kuXG4gKiAgICsgIEZvciBjb250YWluZXJzIGluIGEgdGFzayB3aXRoIHRoZSBgYGJyaWRnZWBgIG5ldHdvcmsgbW9kZSwgdGhlIEFtYXpvbiBFQ1MgYWdlbnQgZmluZHMgb3BlbiBwb3J0cyBvbiB0aGUgaG9zdCBhbmQgYXV0b21hdGljYWxseSBiaW5kcyB0aGVtIHRvIHRoZSBjb250YWluZXIgcG9ydHMuIFRoaXMgaXMgYSBkeW5hbWljIG1hcHBpbmcgc3RyYXRlZ3kuXG4gKiAgIFxuICogIElmIHlvdSB1c2UgY29udGFpbmVycyBpbiBhIHRhc2sgd2l0aCB0aGUgYGBhd3N2cGNgYCBvciBgYGhvc3RgYCBuZXR3b3JrIG1vZGUsIHRoZSBgYGhvc3RQb3J0YGAgY2FuIGVpdGhlciBiZSBsZWZ0IGJsYW5rIG9yIHNldCB0byB0aGUgc2FtZSB2YWx1ZSBhcyB0aGUgYGBjb250YWluZXJQb3J0YGAuXG4gKiAgSWYgeW91IHVzZSBjb250YWluZXJzIGluIGEgdGFzayB3aXRoIHRoZSBgYGJyaWRnZWBgIG5ldHdvcmsgbW9kZSwgeW91IGNhbiBzcGVjaWZ5IGEgbm9uLXJlc2VydmVkIGhvc3QgcG9ydCBmb3IgeW91ciBjb250YWluZXIgcG9ydCBtYXBwaW5nLCBvciB5b3UgY2FuIG9taXQgdGhlIGBgaG9zdFBvcnRgYCAob3Igc2V0IGl0IHRvIGBgMGBgKSB3aGlsZSBzcGVjaWZ5aW5nIGEgYGBjb250YWluZXJQb3J0YGAgYW5kIHlvdXIgY29udGFpbmVyIGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBwb3J0IGluIHRoZSBlcGhlbWVyYWwgcG9ydCByYW5nZSBmb3IgeW91ciBjb250YWluZXIgaW5zdGFuY2Ugb3BlcmF0aW5nIHN5c3RlbSBhbmQgRG9ja2VyIHZlcnNpb24uXG4gKiAgVGhlIGRlZmF1bHQgZXBoZW1lcmFsIHBvcnQgcmFuZ2UgZm9yIERvY2tlciB2ZXJzaW9uIDEuNi4wIGFuZCBsYXRlciBpcyBsaXN0ZWQgb24gdGhlIGluc3RhbmNlIHVuZGVyIGBgL3Byb2Mvc3lzL25ldC9pcHY0L2lwX2xvY2FsX3BvcnRfcmFuZ2VgYC4gSWYgdGhpcyBrZXJuZWwgcGFyYW1ldGVyIGlzIHVuYXZhaWxhYmxlLCB0aGUgZGVmYXVsdCBlcGhlbWVyYWwgcG9ydCByYW5nZSBmcm9tIDQ5MTUzIHRocm91Z2ggNjU1MzUgKExpbnV4KSBvciA0OTE1MiB0aHJvdWdoIDY1NTM1IChXaW5kb3dzKSBpcyB1c2VkLiBEbyBub3QgYXR0ZW1wdCB0byBzcGVjaWZ5IGEgaG9zdCBwb3J0IGluIHRoZSBlcGhlbWVyYWwgcG9ydCByYW5nZSBhcyB0aGVzZSBhcmUgcmVzZXJ2ZWQgZm9yIGF1dG9tYXRpYyBhc3NpZ25tZW50LiBJbiBnZW5lcmFsLCBwb3J0cyBiZWxvdyAzMjc2OCBhcmUgb3V0c2lkZSBvZiB0aGUgZXBoZW1lcmFsIHBvcnQgcmFuZ2UuXG4gKiAgVGhlIGRlZmF1bHQgcmVzZXJ2ZWQgcG9ydHMgYXJlIDIyIGZvciBTU0gsIHRoZSBEb2NrZXIgcG9ydHMgMjM3NSBhbmQgMjM3NiwgYW5kIHRoZSBBbWF6b24gRUNTIGNvbnRhaW5lciBhZ2VudCBwb3J0cyA1MTY3OC01MTY4MC4gQW55IGhvc3QgcG9ydCB0aGF0IHdhcyBwcmV2aW91c2x5IHNwZWNpZmllZCBpbiBhIHJ1bm5pbmcgdGFzayBpcyBhbHNvIHJlc2VydmVkIHdoaWxlIHRoZSB0YXNrIGlzIHJ1bm5pbmcuIFRoYXQgaXMsIGFmdGVyIGEgdGFzayBzdG9wcywgdGhlIGhvc3QgcG9ydCBpcyByZWxlYXNlZC4gVGhlIGN1cnJlbnQgcmVzZXJ2ZWQgcG9ydHMgYXJlIGRpc3BsYXllZCBpbiB0aGUgYGByZW1haW5pbmdSZXNvdXJjZXNgYCBvZiBbRGVzY3JpYmVDb250YWluZXJJbnN0YW5jZXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVDb250YWluZXJJbnN0YW5jZXMuaHRtbCkgb3V0cHV0LiBBIGNvbnRhaW5lciBpbnN0YW5jZSBjYW4gaGF2ZSB1cCB0byAxMDAgcmVzZXJ2ZWQgcG9ydHMgYXQgYSB0aW1lLiBUaGlzIG51bWJlciBpbmNsdWRlcyB0aGUgZGVmYXVsdCByZXNlcnZlZCBwb3J0cy4gQXV0b21hdGljYWxseSBhc3NpZ25lZCBwb3J0cyBhcmVuJ3QgaW5jbHVkZWQgaW4gdGhlIDEwMCByZXNlcnZlZCBwb3J0cyBxdW90YS5cbiAqL1xuSG9zdFBvcnQ/OiBudW1iZXJcbi8qKlxuICogVGhlIHBvcnQgbnVtYmVyIG9uIHRoZSBjb250YWluZXIgdGhhdCdzIGJvdW5kIHRvIHRoZSB1c2VyLXNwZWNpZmllZCBvciBhdXRvbWF0aWNhbGx5IGFzc2lnbmVkIGhvc3QgcG9ydC5cbiAqICBJZiB5b3UgdXNlIGNvbnRhaW5lcnMgaW4gYSB0YXNrIHdpdGggdGhlIGBgYXdzdnBjYGAgb3IgYGBob3N0YGAgbmV0d29yayBtb2RlLCBzcGVjaWZ5IHRoZSBleHBvc2VkIHBvcnRzIHVzaW5nIGBgY29udGFpbmVyUG9ydGBgLlxuICogIElmIHlvdSB1c2UgY29udGFpbmVycyBpbiBhIHRhc2sgd2l0aCB0aGUgYGBicmlkZ2VgYCBuZXR3b3JrIG1vZGUgYW5kIHlvdSBzcGVjaWZ5IGEgY29udGFpbmVyIHBvcnQgYW5kIG5vdCBhIGhvc3QgcG9ydCwgeW91ciBjb250YWluZXIgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGhvc3QgcG9ydCBpbiB0aGUgZXBoZW1lcmFsIHBvcnQgcmFuZ2UuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgYGBob3N0UG9ydGBgLiBQb3J0IG1hcHBpbmdzIHRoYXQgYXJlIGF1dG9tYXRpY2FsbHkgYXNzaWduZWQgaW4gdGhpcyB3YXkgZG8gbm90IGNvdW50IHRvd2FyZCB0aGUgMTAwIHJlc2VydmVkIHBvcnRzIGxpbWl0IG9mIGEgY29udGFpbmVyIGluc3RhbmNlLlxuICovXG5Db250YWluZXJQb3J0PzogbnVtYmVyXG4vKipcbiAqIFRoZSBwcm90b2NvbCB1c2VkIGZvciB0aGUgcG9ydCBtYXBwaW5nLiBWYWxpZCB2YWx1ZXMgYXJlIGBgdGNwYGAgYW5kIGBgdWRwYGAuIFRoZSBkZWZhdWx0IGlzIGBgdGNwYGAuIGBgcHJvdG9jb2xgYCBpcyBpbW11dGFibGUgaW4gYSBTZXJ2aWNlIENvbm5lY3Qgc2VydmljZS4gVXBkYXRpbmcgdGhpcyBmaWVsZCByZXF1aXJlcyBhIHNlcnZpY2UgZGVsZXRpb24gYW5kIHJlZGVwbG95bWVudC5cbiAqL1xuUHJvdG9jb2w/OiBzdHJpbmdcbi8qKlxuICogVGhlIG5hbWUgdGhhdCdzIHVzZWQgZm9yIHRoZSBwb3J0IG1hcHBpbmcuIFRoaXMgcGFyYW1ldGVyIGlzIHRoZSBuYW1lIHRoYXQgeW91IHVzZSBpbiB0aGUgYGBzZXJ2aWNlQ29ubmVjdENvbmZpZ3VyYXRpb25gYCBhbmQgdGhlIGBgdnBjTGF0dGljZUNvbmZpZ3VyYXRpb25zYGAgb2YgYSBzZXJ2aWNlLiBUaGUgbmFtZSBjYW4gaW5jbHVkZSB1cCB0byA2NCBjaGFyYWN0ZXJzLiBUaGUgY2hhcmFjdGVycyBjYW4gaW5jbHVkZSBsb3dlcmNhc2UgbGV0dGVycywgbnVtYmVycywgdW5kZXJzY29yZXMgKF8pLCBhbmQgaHlwaGVucyAoLSkuIFRoZSBuYW1lIGNhbid0IHN0YXJ0IHdpdGggYSBoeXBoZW4uXG4gKi9cbk5hbWU/OiBzdHJpbmdcbn1cbi8qKlxuICogVGhlIGVwaGVtZXJhbCBzdG9yYWdlIHNldHRpbmdzIHRvIHVzZSBmb3IgdGFza3MgcnVuIHdpdGggdGhlIHRhc2sgZGVmaW5pdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFcGhlbWVyYWxTdG9yYWdlIHtcbi8qKlxuICogVGhlIHRvdGFsIGFtb3VudCwgaW4gR2lCLCBvZiBlcGhlbWVyYWwgc3RvcmFnZSB0byBzZXQgZm9yIHRoZSB0YXNrLiBUaGUgbWluaW11bSBzdXBwb3J0ZWQgdmFsdWUgaXMgYGAyMWBgIEdpQiBhbmQgdGhlIG1heGltdW0gc3VwcG9ydGVkIHZhbHVlIGlzIGBgMjAwYGAgR2lCLlxuICovXG5TaXplSW5HaUI/OiBudW1iZXJcbn1cbi8qKlxuICogVGhlIG1ldGFkYXRhIHRoYXQgeW91IGFwcGx5IHRvIGEgcmVzb3VyY2UgdG8gaGVscCB5b3UgY2F0ZWdvcml6ZSBhbmQgb3JnYW5pemUgdGhlbS4gRWFjaCB0YWcgY29uc2lzdHMgb2YgYSBrZXkgYW5kIGFuIG9wdGlvbmFsIHZhbHVlLiBZb3UgZGVmaW5lIHRoZW0uXG4gKiAgVGhlIGZvbGxvd2luZyBiYXNpYyByZXN0cmljdGlvbnMgYXBwbHkgdG8gdGFnczpcbiAqICAgKyAgTWF4aW11bSBudW1iZXIgb2YgdGFncyBwZXIgcmVzb3VyY2UgLSA1MFxuICogICArICBGb3IgZWFjaCByZXNvdXJjZSwgZWFjaCB0YWcga2V5IG11c3QgYmUgdW5pcXVlLCBhbmQgZWFjaCB0YWcga2V5IGNhbiBoYXZlIG9ubHkgb25lIHZhbHVlLlxuICogICArICBNYXhpbXVtIGtleSBsZW5ndGggLSAxMjggVW5pY29kZSBjaGFyYWN0ZXJzIGluIFVURi04XG4gKiAgICsgIE1heGltdW0gdmFsdWUgbGVuZ3RoIC0gMjU2IFVuaWNvZGUgY2hhcmFjdGVycyBpbiBVVEYtOFxuICogICArICBJZiB5b3VyIHRhZ2dpbmcgc2NoZW1hIGlzIHVzZWQgYWNyb3NzIG11bHRpcGxlIHNlcnZpY2VzIGFuZCByZXNvdXJjZXMsIHJlbWVtYmVyIHRoYXQgb3RoZXIgc2VydmljZXMgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIGFsbG93ZWQgY2hhcmFjdGVycy4gR2VuZXJhbGx5IGFsbG93ZWQgY2hhcmFjdGVycyBhcmU6IGxldHRlcnMsIG51bWJlcnMsIGFuZCBzcGFjZXMgcmVwcmVzZW50YWJsZSBpbiBVVEYtOCwgYW5kIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyczogKyAtID0gLiBfIDogLyBALlxuICogICArICBUYWcga2V5cyBhbmQgdmFsdWVzIGFyZSBjYXNlLXNlbnNpdGl2ZS5cbiAqICAgKyAgRG8gbm90IHVzZSBgYGF3czpgYCwgYGBBV1M6YGAsIG9yIGFueSB1cHBlciBvciBsb3dlcmNhc2UgY29tYmluYXRpb24gb2Ygc3VjaCBhcyBhIHByZWZpeCBmb3IgZWl0aGVyIGtleXMgb3IgdmFsdWVzIGFzIGl0IGlzIHJlc2VydmVkIGZvciBBV1MgdXNlLiBZb3UgY2Fubm90IGVkaXQgb3IgZGVsZXRlIHRhZyBrZXlzIG9yIHZhbHVlcyB3aXRoIHRoaXMgcHJlZml4LiBUYWdzIHdpdGggdGhpcyBwcmVmaXggZG8gbm90IGNvdW50IGFnYWluc3QgeW91ciB0YWdzIHBlciByZXNvdXJjZSBsaW1pdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYWcge1xuLyoqXG4gKiBUaGUgb3B0aW9uYWwgcGFydCBvZiBhIGtleS12YWx1ZSBwYWlyIHRoYXQgbWFrZSB1cCBhIHRhZy4gQSBgYHZhbHVlYGAgYWN0cyBhcyBhIGRlc2NyaXB0b3Igd2l0aGluIGEgdGFnIGNhdGVnb3J5IChrZXkpLlxuICovXG5WYWx1ZT86IHN0cmluZ1xuLyoqXG4gKiBPbmUgcGFydCBvZiBhIGtleS12YWx1ZSBwYWlyIHRoYXQgbWFrZSB1cCBhIHRhZy4gQSBgYGtleWBgIGlzIGEgZ2VuZXJhbCBsYWJlbCB0aGF0IGFjdHMgbGlrZSBhIGNhdGVnb3J5IGZvciBtb3JlIHNwZWNpZmljIHRhZyB2YWx1ZXMuXG4gKi9cbktleT86IHN0cmluZ1xufVxuIl19
|