@horietakehiro/aws-cdk-utul 0.40.3 → 0.41.0
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/lib/types/cfn-resource-types/aws-bedrock-guardrail.d.ts +20 -0
- package/lib/types/cfn-resource-types/aws-bedrock-guardrail.js +1 -1
- package/lib/types/cfn-resource-types/aws-cassandra-table.d.ts +16 -0
- package/lib/types/cfn-resource-types/aws-cassandra-table.js +1 -1
- package/lib/types/cfn-resource-types/aws-connect-rule.d.ts +4 -4
- package/lib/types/cfn-resource-types/aws-connect-rule.js +1 -1
- package/lib/types/cfn-resource-types/aws-dynamodb-globaltable.d.ts +108 -99
- package/lib/types/cfn-resource-types/aws-dynamodb-globaltable.js +1 -1
- package/lib/types/cfn-resource-types/aws-ec2-trafficmirrortarget.d.ts +16 -1
- package/lib/types/cfn-resource-types/aws-ec2-trafficmirrortarget.js +1 -1
- package/lib/types/cfn-resource-types/aws-ec2-vpcendpoint.d.ts +3 -0
- package/lib/types/cfn-resource-types/aws-ec2-vpcendpoint.js +1 -1
- package/lib/types/cfn-resource-types/aws-ecs-service.d.ts +1 -1
- package/lib/types/cfn-resource-types/aws-ecs-service.js +1 -1
- package/lib/types/cfn-resource-types/aws-ecs-taskdefinition.d.ts +1 -13
- package/lib/types/cfn-resource-types/aws-ecs-taskdefinition.js +1 -1
- package/lib/types/cfn-resource-types/aws-events-eventbus.d.ts +19 -19
- package/lib/types/cfn-resource-types/aws-events-eventbus.js +1 -1
- package/lib/types/cfn-resource-types/aws-imagebuilder-component.d.ts +2 -4
- package/lib/types/cfn-resource-types/aws-imagebuilder-component.js +1 -1
- package/lib/types/cfn-resource-types/aws-imagebuilder-workflow.d.ts +2 -4
- package/lib/types/cfn-resource-types/aws-imagebuilder-workflow.js +1 -1
- package/lib/types/cfn-resource-types/aws-kinesis-streamconsumer.d.ts +34 -1
- package/lib/types/cfn-resource-types/aws-kinesis-streamconsumer.js +1 -1
- package/lib/types/cfn-resource-types/aws-odb-cloudautonomousvmcluster.d.ts +220 -0
- package/lib/types/cfn-resource-types/aws-odb-cloudautonomousvmcluster.js +3 -0
- package/lib/types/cfn-resource-types/aws-odb-cloudexadatainfrastructure.d.ts +151 -0
- package/lib/types/cfn-resource-types/aws-odb-cloudexadatainfrastructure.js +3 -0
- package/lib/types/cfn-resource-types/aws-odb-cloudvmcluster.d.ts +172 -0
- package/lib/types/cfn-resource-types/aws-odb-cloudvmcluster.js +3 -0
- package/lib/types/cfn-resource-types/aws-odb-odbnetwork.d.ts +70 -0
- package/lib/types/cfn-resource-types/aws-odb-odbnetwork.js +3 -0
- package/lib/types/cfn-resource-types/aws-pcs-cluster.d.ts +32 -32
- package/lib/types/cfn-resource-types/aws-pcs-cluster.js +1 -1
- package/lib/types/cfn-resource-types/aws-qbusiness-dataaccessor.d.ts +18 -0
- package/lib/types/cfn-resource-types/aws-qbusiness-dataaccessor.js +1 -1
- package/lib/types/cfn-resource-types/aws-qbusiness-permission.d.ts +14 -0
- package/lib/types/cfn-resource-types/aws-qbusiness-permission.js +1 -1
- package/lib/types/cfn-resource-types/aws-quicksight-custompermissions.d.ts +24 -18
- package/lib/types/cfn-resource-types/aws-quicksight-custompermissions.js +1 -1
- package/lib/types/cfn-resource-types/aws-rds-dbinstance.d.ts +558 -557
- package/lib/types/cfn-resource-types/aws-rds-dbinstance.js +1 -1
- package/lib/types/cfn-resource-types/aws-redshiftserverless-snapshot.d.ts +49 -0
- package/lib/types/cfn-resource-types/aws-redshiftserverless-snapshot.js +3 -0
- package/lib/types/cfn-resource-types/aws-s3tables-table.d.ts +111 -0
- package/lib/types/cfn-resource-types/aws-s3tables-table.js +3 -0
- package/lib/types/cfn-resource-types.d.ts +12 -0
- package/lib/types/cfn-resource-types.js +23 -11
- package/package.json +2 -5
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzLWVjcy10YXNrZGVmaW5pdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImF3cy1lY3MtdGFza2RlZmluaXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUmVnaXN0ZXJzIGEgbmV3IHRhc2sgZGVmaW5pdGlvbiBmcm9tIHRoZSBzdXBwbGllZCBgYGZhbWlseWBgIGFuZCBgYGNvbnRhaW5lckRlZmluaXRpb25zYGAuIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGRhdGEgdm9sdW1lcyB0byB5b3VyIGNvbnRhaW5lcnMgd2l0aCB0aGUgYGB2b2x1bWVzYGAgcGFyYW1ldGVyLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0YXNrIGRlZmluaXRpb24gcGFyYW1ldGVycyBhbmQgZGVmYXVsdHMsIHNlZSBbQW1hem9uIEVDUyBUYXNrIERlZmluaXRpb25zXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS90YXNrX2RlZmludGlvbnMuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICogIFlvdSBjYW4gc3BlY2lmeSBhIHJvbGUgZm9yIHlvdXIgdGFzayB3aXRoIHRoZSBgYHRhc2tSb2xlQXJuYGAgcGFyYW1ldGVyLiBXaGVuIHlvdSBzcGVjaWZ5IGEgcm9sZSBmb3IgYSB0YXNrLCBpdHMgY29udGFpbmVycyBjYW4gdGhlbiB1c2UgdGhlIGxhdGVzdCB2ZXJzaW9ucyBvZiB0aGUgQ0xJIG9yIFNES3MgdG8gbWFrZSBBUEkgcmVxdWVzdHMgdG8gdGhlIEFXUyBzZXJ2aWNlcyB0aGF0IGFyZSBzcGVjaWZpZWQgaW4gdGhlIHBvbGljeSB0aGF0J3MgYXNzb2NpYXRlZCB3aXRoIHRoZSByb2xlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtJQU0gUm9sZXMgZm9yIFRhc2tzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS90YXNrLWlhbS1yb2xlcy5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKiAgWW91IGNhbiBzcGVjaWZ5IGEgRG9ja2VyIG5ldHdvcmtpbmcgbW9kZSBmb3IgdGhlIGNvbnRhaW5lcnMgaW4geW91ciB0YXNrIGRlZmluaXRpb24gd2l0aCB0aGUgYGBuZXR3b3JrTW9kZWBgIHBhcmFtZXRlci4gSWYgeW91IHNwZWNpZnkgdGhlIGBgYXdzdnBjYGAgbmV0d29yayBtb2RlLCB0aGUgdGFzayBpcyBhbGxvY2F0ZWQgYW4gZWxhc3RpYyBuZXR3b3JrIGludGVyZmFjZSwgYW5kIHlvdSBtdXN0IHNwZWNpZnkgYSBbTmV0d29ya0NvbmZpZ3VyYXRpb25dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTmV0d29ya0NvbmZpZ3VyYXRpb24uaHRtbCkgd2hlbiB5b3UgY3JlYXRlIGEgc2VydmljZSBvciBydW4gYSB0YXNrIHdpdGggdGhlIHRhc2sgZGVmaW5pdGlvbi4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbVGFzayBOZXR3b3JraW5nXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS90YXNrLW5ldHdvcmtpbmcuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICogICBJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUgb3IgZXhhbXBsZXMsIHRoZSBBdXRob3JpemF0aW9uIGhlYWRlciBjb250ZW50cyAoYGBBVVRIUEFSQU1TYGApIG11c3QgYmUgcmVwbGFjZWQgd2l0aCBhbiBBV1MgU2lnbmF0dXJlIFZlcnNpb24gNCBzaWduYXR1cmUuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1NpZ25hdHVyZSBWZXJzaW9uIDQgU2lnbmluZyBQcm9jZXNzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2VuZXJhbC9sYXRlc3QvZ3Ivc2lnbmF0dXJlLXZlcnNpb24tNC5odG1sKSBpbiB0aGUgKkdlbmVyYWwgUmVmZXJlbmNlKi5cbiAqICBZb3Ugb25seSBuZWVkIHRvIGxlYXJuIGhvdyB0byBzaWduIEhUVFAgcmVxdWVzdHMgaWYgeW91IGludGVuZCB0byBjcmVhdGUgdGhlbSBtYW51YWxseS4gV2hlbiB5b3UgdXNlIHRoZSBbXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xpLykgb3Igb25lIG9mIHRoZSBbU0RLc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3Rvb2xzLykgdG8gbWFrZSByZXF1ZXN0cyB0byBBV1MsIHRoZXNlIHRvb2xzIGF1dG9tYXRpY2FsbHkgc2lnbiB0aGUgcmVxdWVzdHMgZm9yIHlvdSwgd2l0aCB0aGUgYWNjZXNzIGtleSB0aGF0IHlvdSBzcGVjaWZ5IHdoZW4geW91IGNvbmZpZ3VyZSB0aGUgdG9vbHMuIFdoZW4geW91IHVzZSB0aGVzZSB0b29scywgeW91IGRvbid0IGhhdmUgdG8gc2lnbiByZXF1ZXN0cyB5b3Vyc2VsZi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBfQVdTX0VDU19UQVNLREVGSU5JVElPTiB7XG4vKipcbiAqIFRoZSBzaG9ydCBuYW1lIG9yIGZ1bGwgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIElBTWxvbmcgcm9sZSB0aGF0IGdyYW50cyBjb250YWluZXJzIGluIHRoZSB0YXNrIHBlcm1pc3Npb24gdG8gY2FsbCBBV1MgQVBJcyBvbiB5b3VyIGJlaGFsZi4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQW1hem9uIEVDUyBUYXNrIFJvbGVdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3Rhc2staWFtLXJvbGVzLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICBJQU0gcm9sZXMgZm9yIHRhc2tzIG9uIFdpbmRvd3MgcmVxdWlyZSB0aGF0IHRoZSBgYC1FbmFibGVUYXNrSUFNUm9sZWBgIG9wdGlvbiBpcyBzZXQgd2hlbiB5b3UgbGF1bmNoIHRoZSBBbWF6b24gRUNTLW9wdGltaXplZCBXaW5kb3dzIEFNSS4gWW91ciBjb250YWluZXJzIG11c3QgYWxzbyBydW4gc29tZSBjb25maWd1cmF0aW9uIGNvZGUgdG8gdXNlIHRoZSBmZWF0dXJlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtXaW5kb3dzIElBTSByb2xlcyBmb3IgdGFza3NdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3dpbmRvd3NfdGFza19JQU1fcm9sZXMuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICogICBTdHJpbmcgdmFsaWRhdGlvbiBpcyBkb25lIG9uIHRoZSBFQ1Mgc2lkZS4gSWYgYW4gaW52YWxpZCBzdHJpbmcgdmFsdWUgaXMgZ2l2ZW4gZm9yIGBgVGFza1JvbGVBcm5gYCwgaXQgbWF5IGNhdXNlIHRoZSBDbG91ZGZvcm1hdGlvbiBqb2IgdG8gaGFuZy5cbiAqL1xuVGFza1JvbGVBcm4/OiBzdHJpbmdcbi8qKlxuICogVGhlIElQQyByZXNvdXJjZSBuYW1lc3BhY2UgdG8gdXNlIGZvciB0aGUgY29udGFpbmVycyBpbiB0aGUgdGFzay4gVGhlIHZhbGlkIHZhbHVlcyBhcmUgYGBob3N0YGAsIGBgdGFza2BgLCBvciBgYG5vbmVgYC4gSWYgYGBob3N0YGAgaXMgc3BlY2lmaWVkLCB0aGVuIGFsbCBjb250YWluZXJzIHdpdGhpbiB0aGUgdGFza3MgdGhhdCBzcGVjaWZpZWQgdGhlIGBgaG9zdGBgIElQQyBtb2RlIG9uIHRoZSBzYW1lIGNvbnRhaW5lciBpbnN0YW5jZSBzaGFyZSB0aGUgc2FtZSBJUEMgcmVzb3VyY2VzIHdpdGggdGhlIGhvc3QgQW1hem9uIEVDMiBpbnN0YW5jZS4gSWYgYGB0YXNrYGAgaXMgc3BlY2lmaWVkLCBhbGwgY29udGFpbmVycyB3aXRoaW4gdGhlIHNwZWNpZmllZCB0YXNrIHNoYXJlIHRoZSBzYW1lIElQQyByZXNvdXJjZXMuIElmIGBgbm9uZWBgIGlzIHNwZWNpZmllZCwgdGhlbiBJUEMgcmVzb3VyY2VzIHdpdGhpbiB0aGUgY29udGFpbmVycyBvZiBhIHRhc2sgYXJlIHByaXZhdGUgYW5kIG5vdCBzaGFyZWQgd2l0aCBvdGhlciBjb250YWluZXJzIGluIGEgdGFzayBvciBvbiB0aGUgY29udGFpbmVyIGluc3RhbmNlLiBJZiBubyB2YWx1ZSBpcyBzcGVjaWZpZWQsIHRoZW4gdGhlIElQQyByZXNvdXJjZSBuYW1lc3BhY2Ugc2hhcmluZyBkZXBlbmRzIG9uIHRoZSBEb2NrZXIgZGFlbW9uIHNldHRpbmcgb24gdGhlIGNvbnRhaW5lciBpbnN0YW5jZS5cbiAqICBJZiB0aGUgYGBob3N0YGAgSVBDIG1vZGUgaXMgdXNlZCwgYmUgYXdhcmUgdGhhdCB0aGVyZSBpcyBhIGhlaWdodGVuZWQgcmlzayBvZiB1bmRlc2lyZWQgSVBDIG5hbWVzcGFjZSBleHBvc2UuXG4gKiAgSWYgeW91IGFyZSBzZXR0aW5nIG5hbWVzcGFjZWQga2VybmVsIHBhcmFtZXRlcnMgdXNpbmcgYGBzeXN0ZW1Db250cm9sc2BgIGZvciB0aGUgY29udGFpbmVycyBpbiB0aGUgdGFzaywgdGhlIGZvbGxvd2luZyB3aWxsIGFwcGx5IHRvIHlvdXIgSVBDIHJlc291cmNlIG5hbWVzcGFjZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbU3lzdGVtIENvbnRyb2xzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS90YXNrX2RlZmluaXRpb25fcGFyYW1ldGVycy5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKiAgICsgIEZvciB0YXNrcyB0aGF0IHVzZSB0aGUgYGBob3N0YGAgSVBDIG1vZGUsIElQQyBuYW1lc3BhY2UgcmVsYXRlZCBgYHN5c3RlbUNvbnRyb2xzYGAgYXJlIG5vdCBzdXBwb3J0ZWQuXG4gKiAgICsgIEZvciB0YXNrcyB0aGF0IHVzZSB0aGUgYGB0YXNrYGAgSVBDIG1vZGUsIElQQyBuYW1lc3BhY2UgcmVsYXRlZCBgYHN5c3RlbUNvbnRyb2xzYGAgd2lsbCBhcHBseSB0byBhbGwgY29udGFpbmVycyB3aXRoaW4gYSB0YXNrLlxuICogICBcbiAqICAgVGhpcyBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZCBmb3IgV2luZG93cyBjb250YWluZXJzIG9yIHRhc2tzIHJ1biBvbiBGQVJHQVRFbG9uZy5cbiAqL1xuSXBjTW9kZT86IHN0cmluZ1xuLyoqXG4gKiBUaGUgRWxhc3RpYyBJbmZlcmVuY2UgYWNjZWxlcmF0b3JzIHRvIHVzZSBmb3IgdGhlIGNvbnRhaW5lcnMgaW4gdGhlIHRhc2suXG4gKi9cbkluZmVyZW5jZUFjY2VsZXJhdG9ycz86IEluZmVyZW5jZUFjY2VsZXJhdG9yW11cbi8qKlxuICogVGhlIGFtb3VudCAoaW4gTWlCKSBvZiBtZW1vcnkgdXNlZCBieSB0aGUgdGFzay5cbiAqICBJZiB5b3VyIHRhc2tzIHJ1bnMgb24gQW1hem9uIEVDMiBpbnN0YW5jZXMsIHlvdSBtdXN0IHNwZWNpZnkgZWl0aGVyIGEgdGFzay1sZXZlbCBtZW1vcnkgdmFsdWUgb3IgYSBjb250YWluZXItbGV2ZWwgbWVtb3J5IHZhbHVlLiBUaGlzIGZpZWxkIGlzIG9wdGlvbmFsIGFuZCBhbnkgdmFsdWUgY2FuIGJlIHVzZWQuIElmIGEgdGFzay1sZXZlbCBtZW1vcnkgdmFsdWUgaXMgc3BlY2lmaWVkLCB0aGUgY29udGFpbmVyLWxldmVsIG1lbW9yeSB2YWx1ZSBpcyBvcHRpb25hbC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvbnRhaW5lci1sZXZlbCBtZW1vcnkgYW5kIG1lbW9yeSByZXNlcnZhdGlvbiwgc2VlIFtDb250YWluZXJEZWZpbml0aW9uXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NvbnRhaW5lckRlZmluaXRpb24uaHRtbCkuXG4gKiAgSWYgeW91ciB0YXNrcyBydW5zIG9uIEZBUkdBVEVsb25nLCB0aGlzIGZpZWxkIGlzIHJlcXVpcmVkLiBZb3UgbXVzdCB1c2Ugb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzLiBUaGUgdmFsdWUgeW91IGNob29zZSBkZXRlcm1pbmVzIHlvdXIgcmFuZ2Ugb2YgdmFsaWQgdmFsdWVzIGZvciB0aGUgYGBjcHVgYCBwYXJhbWV0ZXIuXG4gKiAgICsgIDUxMiAoMC41IEdCKSwgMTAyNCAoMSBHQiksIDIwNDggKDIgR0IpIC0gQXZhaWxhYmxlIGBgY3B1YGAgdmFsdWVzOiAyNTYgKC4yNSB2Q1BVKVxuICogICArICAxMDI0ICgxIEdCKSwgMjA0OCAoMiBHQiksIDMwNzIgKDMgR0IpLCA0MDk2ICg0IEdCKSAtIEF2YWlsYWJsZSBgYGNwdWBgIHZhbHVlczogNTEyICguNSB2Q1BVKVxuICogICArICAyMDQ4ICgyIEdCKSwgMzA3MiAoMyBHQiksIDQwOTYgKDQgR0IpLCA1MTIwICg1IEdCKSwgNjE0NCAoNiBHQiksIDcxNjggKDcgR0IpLCA4MTkyICg4IEdCKSAtIEF2YWlsYWJsZSBgYGNwdWBgIHZhbHVlczogMTAyNCAoMSB2Q1BVKVxuICogICArICBCZXR3ZWVuIDQwOTYgKDQgR0IpIGFuZCAxNjM4NCAoMTYgR0IpIGluIGluY3JlbWVudHMgb2YgMTAyNCAoMSBHQikgLSBBdmFpbGFibGUgYGBjcHVgYCB2YWx1ZXM6IDIwNDggKDIgdkNQVSlcbiAqICAgKyAgQmV0d2VlbiA4MTkyICg4IEdCKSBhbmQgMzA3MjAgKDMwIEdCKSBpbiBpbmNyZW1lbnRzIG9mIDEwMjQgKDEgR0IpIC0gQXZhaWxhYmxlIGBgY3B1YGAgdmFsdWVzOiA0MDk2ICg0IHZDUFUpXG4gKiAgICsgIEJldHdlZW4gMTYgR0IgYW5kIDYwIEdCIGluIDQgR0IgaW5jcmVtZW50cyAtIEF2YWlsYWJsZSBgYGNwdWBgIHZhbHVlczogODE5MiAoOCB2Q1BVKVxuICogIFRoaXMgb3B0aW9uIHJlcXVpcmVzIExpbnV4IHBsYXRmb3JtIGBgMS40LjBgYCBvciBsYXRlci5cbiAqICAgKyAgQmV0d2VlbiAzMkdCIGFuZCAxMjAgR0IgaW4gOCBHQiBpbmNyZW1lbnRzIC0gQXZhaWxhYmxlIGBgY3B1YGAgdmFsdWVzOiAxNjM4NCAoMTYgdkNQVSlcbiAqICBUaGlzIG9wdGlvbiByZXF1aXJlcyBMaW51eCBwbGF0Zm9ybSBgYDEuNC4wYGAgb3IgbGF0ZXIuXG4gKi9cbk1lbW9yeT86IHN0cmluZ1xuLyoqXG4gKiBBbiBhcnJheSBvZiBwbGFjZW1lbnQgY29uc3RyYWludCBvYmplY3RzIHRvIHVzZSBmb3IgdGFza3MuXG4gKiAgIFRoaXMgcGFyYW1ldGVyIGlzbid0IHN1cHBvcnRlZCBmb3IgdGFza3MgcnVuIG9uIEZBUkdBVEVsb25nLlxuICovXG5QbGFjZW1lbnRDb25zdHJhaW50cz86IFRhc2tEZWZpbml0aW9uUGxhY2VtZW50Q29uc3RyYWludFtdXG4vKipcbiAqIFRoZSBudW1iZXIgb2YgYGBjcHVgYCB1bml0cyB1c2VkIGJ5IHRoZSB0YXNrLiBJZiB5b3UgdXNlIHRoZSBFQzIgbGF1bmNoIHR5cGUsIHRoaXMgZmllbGQgaXMgb3B0aW9uYWwuIEFueSB2YWx1ZSBjYW4gYmUgdXNlZC4gSWYgeW91IHVzZSB0aGUgRmFyZ2F0ZSBsYXVuY2ggdHlwZSwgdGhpcyBmaWVsZCBpcyByZXF1aXJlZC4gWW91IG11c3QgdXNlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcy4gVGhlIHZhbHVlIHRoYXQgeW91IGNob29zZSBkZXRlcm1pbmVzIHlvdXIgcmFuZ2Ugb2YgdmFsaWQgdmFsdWVzIGZvciB0aGUgYGBtZW1vcnlgYCBwYXJhbWV0ZXIuXG4gKiAgSWYgeW91J3JlIHVzaW5nIHRoZSBFQzIgbGF1bmNoIHR5cGUgb3IgdGhlIGV4dGVybmFsIGxhdW5jaCB0eXBlLCB0aGlzIGZpZWxkIGlzIG9wdGlvbmFsLiBTdXBwb3J0ZWQgdmFsdWVzIGFyZSBiZXR3ZWVuIGBgMTI4YGAgQ1BVIHVuaXRzIChgYDAuMTI1YGAgdkNQVXMpIGFuZCBgYDE5NjYwOGBgIENQVSB1bml0cyAoYGAxOTJgYCB2Q1BVcykuIFxuICogIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgZm9yIEZhcmdhdGUuIEZvciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmFsaWQgdmFsdWVzLCBzZWUgW1Rhc2sgc2l6ZV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvdGFza19kZWZpbml0aW9uX3BhcmFtZXRlcnMuaHRtbCN0YXNrX3NpemUpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuQ3B1Pzogc3RyaW5nXG4vKipcbiAqIFRoZSB0YXNrIGxhdW5jaCB0eXBlcyB0aGUgdGFzayBkZWZpbml0aW9uIHdhcyB2YWxpZGF0ZWQgYWdhaW5zdC4gVGhlIHZhbGlkIHZhbHVlcyBhcmUgYGBFQzJgYCwgYGBGQVJHQVRFYGAsIGFuZCBgYEVYVEVSTkFMYGAuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0FtYXpvbiBFQ1MgbGF1bmNoIHR5cGVzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9sYXVuY2hfdHlwZXMuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5SZXF1aXJlc0NvbXBhdGliaWxpdGllcz86IHN0cmluZ1tdXG4vKipcbiAqIFRoZSBEb2NrZXIgbmV0d29ya2luZyBtb2RlIHRvIHVzZSBmb3IgdGhlIGNvbnRhaW5lcnMgaW4gdGhlIHRhc2suIFRoZSB2YWxpZCB2YWx1ZXMgYXJlIGBgbm9uZWBgLCBgYGJyaWRnZWBgLCBgYGF3c3ZwY2BgLCBhbmQgYGBob3N0YGAuIElmIG5vIG5ldHdvcmsgbW9kZSBpcyBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IGlzIGBgYnJpZGdlYGAuXG4gKiAgRm9yIEFtYXpvbiBFQ1MgdGFza3Mgb24gRmFyZ2F0ZSwgdGhlIGBgYXdzdnBjYGAgbmV0d29yayBtb2RlIGlzIHJlcXVpcmVkLiBGb3IgQW1hem9uIEVDUyB0YXNrcyBvbiBBbWF6b24gRUMyIExpbnV4IGluc3RhbmNlcywgYW55IG5ldHdvcmsgbW9kZSBjYW4gYmUgdXNlZC4gRm9yIEFtYXpvbiBFQ1MgdGFza3Mgb24gQW1hem9uIEVDMiBXaW5kb3dzIGluc3RhbmNlcywgYGA8ZGVmYXVsdD5gYCBvciBgYGF3c3ZwY2BgIGNhbiBiZSB1c2VkLiBJZiB0aGUgbmV0d29yayBtb2RlIGlzIHNldCB0byBgYG5vbmVgYCwgeW91IGNhbm5vdCBzcGVjaWZ5IHBvcnQgbWFwcGluZ3MgaW4geW91ciBjb250YWluZXIgZGVmaW5pdGlvbnMsIGFuZCB0aGUgdGFza3MgY29udGFpbmVycyBkbyBub3QgaGF2ZSBleHRlcm5hbCBjb25uZWN0aXZpdHkuIFRoZSBgYGhvc3RgYCBhbmQgYGBhd3N2cGNgYCBuZXR3b3JrIG1vZGVzIG9mZmVyIHRoZSBoaWdoZXN0IG5ldHdvcmtpbmcgcGVyZm9ybWFuY2UgZm9yIGNvbnRhaW5lcnMgYmVjYXVzZSB0aGV5IHVzZSB0aGUgRUMyIG5ldHdvcmsgc3RhY2sgaW5zdGVhZCBvZiB0aGUgdmlydHVhbGl6ZWQgbmV0d29yayBzdGFjayBwcm92aWRlZCBieSB0aGUgYGBicmlkZ2VgYCBtb2RlLlxuICogIFdpdGggdGhlIGBgaG9zdGBgIGFuZCBgYGF3c3ZwY2BgIG5ldHdvcmsgbW9kZXMsIGV4cG9zZWQgY29udGFpbmVyIHBvcnRzIGFyZSBtYXBwZWQgZGlyZWN0bHkgdG8gdGhlIGNvcnJlc3BvbmRpbmcgaG9zdCBwb3J0IChmb3IgdGhlIGBgaG9zdGBgIG5ldHdvcmsgbW9kZSkgb3IgdGhlIGF0dGFjaGVkIGVsYXN0aWMgbmV0d29yayBpbnRlcmZhY2UgcG9ydCAoZm9yIHRoZSBgYGF3c3ZwY2BgIG5ldHdvcmsgbW9kZSksIHNvIHlvdSBjYW5ub3QgdGFrZSBhZHZhbnRhZ2Ugb2YgZHluYW1pYyBob3N0IHBvcnQgbWFwcGluZ3MuIFxuICogICBXaGVuIHVzaW5nIHRoZSBgYGhvc3RgYCBuZXR3b3JrIG1vZGUsIHlvdSBzaG91bGQgbm90IHJ1biBjb250YWluZXJzIHVzaW5nIHRoZSByb290IHVzZXIgKFVJRCAwKS4gSXQgaXMgY29uc2lkZXJlZCBiZXN0IHByYWN0aWNlIHRvIHVzZSBhIG5vbi1yb290IHVzZXIuXG4gKiAgIElmIHRoZSBuZXR3b3JrIG1vZGUgaXMgYGBhd3N2cGNgYCwgdGhlIHRhc2sgaXMgYWxsb2NhdGVkIGFuIGVsYXN0aWMgbmV0d29yayBpbnRlcmZhY2UsIGFuZCB5b3UgbXVzdCBzcGVjaWZ5IGEgW05ldHdvcmtDb25maWd1cmF0aW9uXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX05ldHdvcmtDb25maWd1cmF0aW9uLmh0bWwpIHZhbHVlIHdoZW4geW91IGNyZWF0ZSBhIHNlcnZpY2Ugb3IgcnVuIGEgdGFzayB3aXRoIHRoZSB0YXNrIGRlZmluaXRpb24uIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1Rhc2sgTmV0d29ya2luZ10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvdGFzay1uZXR3b3JraW5nLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICBJZiB0aGUgbmV0d29yayBtb2RlIGlzIGBgaG9zdGBgLCB5b3UgY2Fubm90IHJ1biBtdWx0aXBsZSBpbnN0YW50aWF0aW9ucyBvZiB0aGUgc2FtZSB0YXNrIG9uIGEgc2luZ2xlIGNvbnRhaW5lciBpbnN0YW5jZSB3aGVuIHBvcnQgbWFwcGluZ3MgYXJlIHVzZWQuXG4gKi9cbk5ldHdvcmtNb2RlPzogc3RyaW5nXG4vKipcbiAqIFRoZSBwcm9jZXNzIG5hbWVzcGFjZSB0byB1c2UgZm9yIHRoZSBjb250YWluZXJzIGluIHRoZSB0YXNrLiBUaGUgdmFsaWQgdmFsdWVzIGFyZSBgYGhvc3RgYCBvciBgYHRhc2tgYC4gT24gRmFyZ2F0ZSBmb3IgTGludXggY29udGFpbmVycywgdGhlIG9ubHkgdmFsaWQgdmFsdWUgaXMgYGB0YXNrYGAuIEZvciBleGFtcGxlLCBtb25pdG9yaW5nIHNpZGVjYXJzIG1pZ2h0IG5lZWQgYGBwaWRNb2RlYGAgdG8gYWNjZXNzIGluZm9ybWF0aW9uIGFib3V0IG90aGVyIGNvbnRhaW5lcnMgcnVubmluZyBpbiB0aGUgc2FtZSB0YXNrLlxuICogIElmIGBgaG9zdGBgIGlzIHNwZWNpZmllZCwgYWxsIGNvbnRhaW5lcnMgd2l0aGluIHRoZSB0YXNrcyB0aGF0IHNwZWNpZmllZCB0aGUgYGBob3N0YGAgUElEIG1vZGUgb24gdGhlIHNhbWUgY29udGFpbmVyIGluc3RhbmNlIHNoYXJlIHRoZSBzYW1lIHByb2Nlc3MgbmFtZXNwYWNlIHdpdGggdGhlIGhvc3QgQW1hem9uIEVDMiBpbnN0YW5jZS5cbiAqICBJZiBgYHRhc2tgYCBpcyBzcGVjaWZpZWQsIGFsbCBjb250YWluZXJzIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHRhc2sgc2hhcmUgdGhlIHNhbWUgcHJvY2VzcyBuYW1lc3BhY2UuXG4gKiAgSWYgbm8gdmFsdWUgaXMgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCBpcyBhIHByaXZhdGUgbmFtZXNwYWNlIGZvciBlYWNoIGNvbnRhaW5lci5cbiAqICBJZiB0aGUgYGBob3N0YGAgUElEIG1vZGUgaXMgdXNlZCwgdGhlcmUncyBhIGhlaWdodGVuZWQgcmlzayBvZiB1bmRlc2lyZWQgcHJvY2VzcyBuYW1lc3BhY2UgZXhwb3N1cmUuXG4gKiAgIFRoaXMgcGFyYW1ldGVyIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIFdpbmRvd3MgY29udGFpbmVycy5cbiAqICAgIFRoaXMgcGFyYW1ldGVyIGlzIG9ubHkgc3VwcG9ydGVkIGZvciB0YXNrcyB0aGF0IGFyZSBob3N0ZWQgb24gRkFSR0FURWxvbmcgaWYgdGhlIHRhc2tzIGFyZSB1c2luZyBwbGF0Zm9ybSB2ZXJzaW9uIGBgMS40LjBgYCBvciBsYXRlciAoTGludXgpLiBUaGlzIGlzbid0IHN1cHBvcnRlZCBmb3IgV2luZG93cyBjb250YWluZXJzIG9uIEZhcmdhdGUuXG4gKi9cblBpZE1vZGU/OiBzdHJpbmdcbi8qKlxuICogRW5hYmxlcyBmYXVsdCBpbmplY3Rpb24gYW5kIGFsbG93cyBmb3IgZmF1bHQgaW5qZWN0aW9uIHJlcXVlc3RzIHRvIGJlIGFjY2VwdGVkIGZyb20gdGhlIHRhc2sncyBjb250YWluZXJzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgYGZhbHNlYGAuXG4gKi9cbkVuYWJsZUZhdWx0SW5qZWN0aW9uPzogYm9vbGVhblxuLyoqXG4gKiBUaGUgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIHRhc2sgZXhlY3V0aW9uIHJvbGUgdGhhdCBncmFudHMgdGhlIEFtYXpvbiBFQ1MgY29udGFpbmVyIGFnZW50IHBlcm1pc3Npb24gdG8gbWFrZSBBV1MgQVBJIGNhbGxzIG9uIHlvdXIgYmVoYWxmLiBGb3IgaW5mb3JtYXRpb25hYm91dCB0aGUgcmVxdWlyZWQgSUFNIHJvbGVzIGZvciBBbWF6b24gRUNTLCBzZWUgW0lBTSByb2xlcyBmb3IgQW1hem9uIEVDU10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvc2VjdXJpdHktZWNzLWlhbS1yb2xlLW92ZXJ2aWV3Lmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuRXhlY3V0aW9uUm9sZUFybj86IHN0cmluZ1xuUnVudGltZVBsYXRmb3JtPzogUnVudGltZVBsYXRmb3JtXG5Qcm94eUNvbmZpZ3VyYXRpb24/OiBQcm94eUNvbmZpZ3VyYXRpb25cbi8qKlxuICogVGhlIGxpc3Qgb2YgZGF0YSB2b2x1bWUgZGVmaW5pdGlvbnMgZm9yIHRoZSB0YXNrLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtVc2luZyBkYXRhIHZvbHVtZXMgaW4gdGFza3NdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3VzaW5nX2RhdGFfdm9sdW1lcy5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKiAgIFRoZSBgYGhvc3RgYCBhbmQgYGBzb3VyY2VQYXRoYGAgcGFyYW1ldGVycyBhcmVuJ3Qgc3VwcG9ydGVkIGZvciB0YXNrcyBydW4gb24gRkFSR0FURWxvbmcuXG4gKi9cblZvbHVtZXM/OiBWb2x1bWVbXVxuLyoqXG4gKiBBIGxpc3Qgb2YgY29udGFpbmVyIGRlZmluaXRpb25zIGluIEpTT04gZm9ybWF0IHRoYXQgZGVzY3JpYmUgdGhlIGRpZmZlcmVudCBjb250YWluZXJzIHRoYXQgbWFrZSB1cCB5b3VyIHRhc2suIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGNvbnRhaW5lciBkZWZpbml0aW9uIHBhcmFtZXRlcnMgYW5kIGRlZmF1bHRzLCBzZWUgW0FtYXpvbiBFQ1MgVGFzayBEZWZpbml0aW9uc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvdGFza19kZWZpbnRpb25zLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuQ29udGFpbmVyRGVmaW5pdGlvbnM/OiBDb250YWluZXJEZWZpbml0aW9uW11cbi8qKlxuICogVGhlIG5hbWUgb2YgYSBmYW1pbHkgdGhhdCB0aGlzIHRhc2sgZGVmaW5pdGlvbiBpcyByZWdpc3RlcmVkIHRvLiBVcCB0byAyNTUgbGV0dGVycyAodXBwZXJjYXNlIGFuZCBsb3dlcmNhc2UpLCBudW1iZXJzLCBoeXBoZW5zLCBhbmQgdW5kZXJzY29yZXMgYXJlIGFsbG93ZWQuXG4gKiAgQSBmYW1pbHkgZ3JvdXBzIG11bHRpcGxlIHZlcnNpb25zIG9mIGEgdGFzayBkZWZpbml0aW9uLiBBbWF6b24gRUNTIGdpdmVzIHRoZSBmaXJzdCB0YXNrIGRlZmluaXRpb24gdGhhdCB5b3UgcmVnaXN0ZXJlZCB0byBhIGZhbWlseSBhIHJldmlzaW9uIG51bWJlciBvZiAxLiBBbWF6b24gRUNTIGdpdmVzIHNlcXVlbnRpYWwgcmV2aXNpb24gbnVtYmVycyB0byBlYWNoIHRhc2sgZGVmaW5pdGlvbiB0aGF0IHlvdSBhZGQuXG4gKiAgIFRvIHVzZSByZXZpc2lvbiBudW1iZXJzIHdoZW4geW91IHVwZGF0ZSBhIHRhc2sgZGVmaW5pdGlvbiwgc3BlY2lmeSB0aGlzIHByb3BlcnR5LiBJZiB5b3UgZG9uJ3Qgc3BlY2lmeSBhIHZhbHVlLCBDRk5sb25nIGdlbmVyYXRlcyBhIG5ldyB0YXNrIGRlZmluaXRpb24gZWFjaCB0aW1lIHRoYXQgeW91IHVwZGF0ZSBpdC5cbiAqL1xuRmFtaWx5Pzogc3RyaW5nXG5FcGhlbWVyYWxTdG9yYWdlPzogRXBoZW1lcmFsU3RvcmFnZVxuLyoqXG4gKiBUaGUgbWV0YWRhdGEgdGhhdCB5b3UgYXBwbHkgdG8gdGhlIHRhc2sgZGVmaW5pdGlvbiB0byBoZWxwIHlvdSBjYXRlZ29yaXplIGFuZCBvcmdhbml6ZSB0aGVtLiBFYWNoIHRhZyBjb25zaXN0cyBvZiBhIGtleSBhbmQgYW4gb3B0aW9uYWwgdmFsdWUuIFlvdSBkZWZpbmUgYm90aCBvZiB0aGVtLlxuICogIFRoZSBmb2xsb3dpbmcgYmFzaWMgcmVzdHJpY3Rpb25zIGFwcGx5IHRvIHRhZ3M6XG4gKiAgICsgIE1heGltdW0gbnVtYmVyIG9mIHRhZ3MgcGVyIHJlc291cmNlIC0gNTBcbiAqICAgKyAgRm9yIGVhY2ggcmVzb3VyY2UsIGVhY2ggdGFnIGtleSBtdXN0IGJlIHVuaXF1ZSwgYW5kIGVhY2ggdGFnIGtleSBjYW4gaGF2ZSBvbmx5IG9uZSB2YWx1ZS5cbiAqICAgKyAgTWF4aW11bSBrZXkgbGVuZ3RoIC0gMTI4IFVuaWNvZGUgY2hhcmFjdGVycyBpbiBVVEYtOFxuICogICArICBNYXhpbXVtIHZhbHVlIGxlbmd0aCAtIDI1NiBVbmljb2RlIGNoYXJhY3RlcnMgaW4gVVRGLThcbiAqICAgKyAgSWYgeW91ciB0YWdnaW5nIHNjaGVtYSBpcyB1c2VkIGFjcm9zcyBtdWx0aXBsZSBzZXJ2aWNlcyBhbmQgcmVzb3VyY2VzLCByZW1lbWJlciB0aGF0IG90aGVyIHNlcnZpY2VzIG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiBhbGxvd2VkIGNoYXJhY3RlcnMuIEdlbmVyYWxseSBhbGxvd2VkIGNoYXJhY3RlcnMgYXJlOiBsZXR0ZXJzLCBudW1iZXJzLCBhbmQgc3BhY2VzIHJlcHJlc2VudGFibGUgaW4gVVRGLTgsIGFuZCB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcnM6ICsgLSA9IC4gXyA6IC8gQC5cbiAqICAgKyAgVGFnIGtleXMgYW5kIHZhbHVlcyBhcmUgY2FzZS1zZW5zaXRpdmUuXG4gKiAgICsgIERvIG5vdCB1c2UgYGBhd3M6YGAsIGBgQVdTOmBgLCBvciBhbnkgdXBwZXIgb3IgbG93ZXJjYXNlIGNvbWJpbmF0aW9uIG9mIHN1Y2ggYXMgYSBwcmVmaXggZm9yIGVpdGhlciBrZXlzIG9yIHZhbHVlcyBhcyBpdCBpcyByZXNlcnZlZCBmb3IgQVdTIHVzZS4gWW91IGNhbm5vdCBlZGl0IG9yIGRlbGV0ZSB0YWcga2V5cyBvciB2YWx1ZXMgd2l0aCB0aGlzIHByZWZpeC4gVGFncyB3aXRoIHRoaXMgcHJlZml4IGRvIG5vdCBjb3VudCBhZ2FpbnN0IHlvdXIgdGFncyBwZXIgcmVzb3VyY2UgbGltaXQuXG4gKi9cblRhZ3M/OiBUYWdbXVxuVGFza0RlZmluaXRpb25Bcm4/OiBzdHJpbmdcbn1cbi8qKlxuICogRGV0YWlscyBvbiBhbiBFbGFzdGljIEluZmVyZW5jZSBhY2NlbGVyYXRvci4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbV29ya2luZyB3aXRoIEFtYXpvbiBFbGFzdGljIEluZmVyZW5jZSBvbiBBbWF6b24gRUNTXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9lY3MtaW5mZXJlbmNlLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmZlcmVuY2VBY2NlbGVyYXRvciB7XG4vKipcbiAqIFRoZSBFbGFzdGljIEluZmVyZW5jZSBhY2NlbGVyYXRvciB0eXBlIHRvIHVzZS5cbiAqL1xuRGV2aWNlVHlwZT86IHN0cmluZ1xuLyoqXG4gKiBUaGUgRWxhc3RpYyBJbmZlcmVuY2UgYWNjZWxlcmF0b3IgZGV2aWNlIG5hbWUuIFRoZSBgYGRldmljZU5hbWVgYCBtdXN0IGFsc28gYmUgcmVmZXJlbmNlZCBpbiBhIGNvbnRhaW5lciBkZWZpbml0aW9uIGFzIGEgW1Jlc291cmNlUmVxdWlyZW1lbnRdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfUmVzb3VyY2VSZXF1aXJlbWVudC5odG1sKS5cbiAqL1xuRGV2aWNlTmFtZT86IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgY29uc3RyYWludCBvbiB0YXNrIHBsYWNlbWVudCBpbiB0aGUgdGFzayBkZWZpbml0aW9uLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtUYXNrIHBsYWNlbWVudCBjb25zdHJhaW50c10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvdGFzay1wbGFjZW1lbnQtY29uc3RyYWludHMuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICogICBUYXNrIHBsYWNlbWVudCBjb25zdHJhaW50cyBhcmVuJ3Qgc3VwcG9ydGVkIGZvciB0YXNrcyBydW4gb24gRkFSR0FURWxvbmcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGFza0RlZmluaXRpb25QbGFjZW1lbnRDb25zdHJhaW50IHtcbi8qKlxuICogVGhlIHR5cGUgb2YgY29uc3RyYWludC4gVGhlIGBgTWVtYmVyT2ZgYCBjb25zdHJhaW50IHJlc3RyaWN0cyBzZWxlY3Rpb24gdG8gYmUgZnJvbSBhIGdyb3VwIG9mIHZhbGlkIGNhbmRpZGF0ZXMuXG4gKi9cblR5cGU6IHN0cmluZ1xuLyoqXG4gKiBBIGNsdXN0ZXIgcXVlcnkgbGFuZ3VhZ2UgZXhwcmVzc2lvbiB0byBhcHBseSB0byB0aGUgY29uc3RyYWludC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQ2x1c3RlciBxdWVyeSBsYW5ndWFnZV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvY2x1c3Rlci1xdWVyeS1sYW5ndWFnZS5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKi9cbkV4cHJlc3Npb24/OiBzdHJpbmdcbn1cbi8qKlxuICogVGhlIG9wZXJhdGluZyBzeXN0ZW0gdGhhdCB5b3VyIHRhc2tzIGRlZmluaXRpb25zIHJ1biBvbi4gQSBwbGF0Zm9ybSBmYW1pbHkgaXMgc3BlY2lmaWVkIG9ubHkgZm9yIHRhc2tzIHVzaW5nIHRoZSBGYXJnYXRlIGxhdW5jaCB0eXBlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1bnRpbWVQbGF0Zm9ybSB7XG4vKipcbiAqIFRoZSBvcGVyYXRpbmcgc3lzdGVtLlxuICovXG5PcGVyYXRpbmdTeXN0ZW1GYW1pbHk/OiBzdHJpbmdcbi8qKlxuICogVGhlIENQVSBhcmNoaXRlY3R1cmUuXG4gKiAgWW91IGNhbiBydW4geW91ciBMaW51eCB0YXNrcyBvbiBhbiBBUk0tYmFzZWQgcGxhdGZvcm0gYnkgc2V0dGluZyB0aGUgdmFsdWUgdG8gYGBBUk02NGBgLiBUaGlzIG9wdGlvbiBpcyBhdmFpbGFibGUgZm9yIHRhc2tzIHRoYXQgcnVuIG9uIExpbnV4IEFtYXpvbiBFQzIgaW5zdGFuY2Ugb3IgTGludXggY29udGFpbmVycyBvbiBGYXJnYXRlLlxuICovXG5DcHVBcmNoaXRlY3R1cmU/OiBzdHJpbmdcbn1cbi8qKlxuICogVGhlIGNvbmZpZ3VyYXRpb24gZGV0YWlscyBmb3IgdGhlIEFwcCBNZXNoIHByb3h5LlxuICogIFlvdXIgQW1hem9uIEVDUyBjb250YWluZXIgaW5zdGFuY2VzIHJlcXVpcmUgYXQgbGVhc3QgdmVyc2lvbiAxLjI2LjAgb2YgdGhlIGNvbnRhaW5lciBhZ2VudCBhbmQgYXQgbGVhc3QgdmVyc2lvbiAxLjI2LjAtMSBvZiB0aGUgYGBlY3MtaW5pdGBgIHBhY2thZ2UgdG8gdXNlIGEgcHJveHkgY29uZmlndXJhdGlvbi4gSWYgeW91ciBjb250YWluZXIgaW5zdGFuY2VzIGFyZSBsYXVuY2hlZCBmcm9tIHRoZSBBbWF6b24gRUNTIG9wdGltaXplZCBBTUkgdmVyc2lvbiBgYDIwMTkwMzAxYGAgb3IgbGF0ZXIsIHRoZXkgY29udGFpbiB0aGUgcmVxdWlyZWQgdmVyc2lvbnMgb2YgdGhlIGNvbnRhaW5lciBhZ2VudCBhbmQgYGBlY3MtaW5pdGBgLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtBbWF6b24gRUNTLW9wdGltaXplZCBMaW51eCBBTUldKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2Vjcy1vcHRpbWl6ZWRfQU1JLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm94eUNvbmZpZ3VyYXRpb24ge1xuLyoqXG4gKiBUaGUgc2V0IG9mIG5ldHdvcmsgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIHRvIHByb3ZpZGUgdGhlIENvbnRhaW5lciBOZXR3b3JrIEludGVyZmFjZSAoQ05JKSBwbHVnaW4sIHNwZWNpZmllZCBhcyBrZXktdmFsdWUgcGFpcnMuXG4gKiAgICsgIGBgSWdub3JlZFVJRGBgIC0gKFJlcXVpcmVkKSBUaGUgdXNlciBJRCAoVUlEKSBvZiB0aGUgcHJveHkgY29udGFpbmVyIGFzIGRlZmluZWQgYnkgdGhlIGBgdXNlcmBgIHBhcmFtZXRlciBpbiBhIGNvbnRhaW5lciBkZWZpbml0aW9uLiBUaGlzIGlzIHVzZWQgdG8gZW5zdXJlIHRoZSBwcm94eSBpZ25vcmVzIGl0cyBvd24gdHJhZmZpYy4gSWYgYGBJZ25vcmVkR0lEYGAgaXMgc3BlY2lmaWVkLCB0aGlzIGZpZWxkIGNhbiBiZSBlbXB0eS5cbiAqICAgKyAgYGBJZ25vcmVkR0lEYGAgLSAoUmVxdWlyZWQpIFRoZSBncm91cCBJRCAoR0lEKSBvZiB0aGUgcHJveHkgY29udGFpbmVyIGFzIGRlZmluZWQgYnkgdGhlIGBgdXNlcmBgIHBhcmFtZXRlciBpbiBhIGNvbnRhaW5lciBkZWZpbml0aW9uLiBUaGlzIGlzIHVzZWQgdG8gZW5zdXJlIHRoZSBwcm94eSBpZ25vcmVzIGl0cyBvd24gdHJhZmZpYy4gSWYgYGBJZ25vcmVkVUlEYGAgaXMgc3BlY2lmaWVkLCB0aGlzIGZpZWxkIGNhbiBiZSBlbXB0eS5cbiAqICAgKyAgYGBBcHBQb3J0c2BgIC0gKFJlcXVpcmVkKSBUaGUgbGlzdCBvZiBwb3J0cyB0aGF0IHRoZSBhcHBsaWNhdGlvbiB1c2VzLiBOZXR3b3JrIHRyYWZmaWMgdG8gdGhlc2UgcG9ydHMgaXMgZm9yd2FyZGVkIHRvIHRoZSBgYFByb3h5SW5ncmVzc1BvcnRgYCBhbmQgYGBQcm94eUVncmVzc1BvcnRgYC5cbiAqICAgKyAgYGBQcm94eUluZ3Jlc3NQb3J0YGAgLSAoUmVxdWlyZWQpIFNwZWNpZmllcyB0aGUgcG9ydCB0aGF0IGluY29taW5nIHRyYWZmaWMgdG8gdGhlIGBgQXBwUG9ydHNgYCBpcyBkaXJlY3RlZCB0by5cbiAqICAgKyAgYGBQcm94eUVncmVzc1BvcnRgYCAtIChSZXF1aXJlZCkgU3BlY2lmaWVzIHRoZSBwb3J0IHRoYXQgb3V0Z29pbmcgdHJhZmZpYyBmcm9tIHRoZSBgYEFwcFBvcnRzYGAgaXMgZGlyZWN0ZWQgdG8uXG4gKiAgICsgIGBgRWdyZXNzSWdub3JlZFBvcnRzYGAgLSAoUmVxdWlyZWQpIFRoZSBlZ3Jlc3MgdHJhZmZpYyBnb2luZyB0byB0aGUgc3BlY2lmaWVkIHBvcnRzIGlzIGlnbm9yZWQgYW5kIG5vdCByZWRpcmVjdGVkIHRvIHRoZSBgYFByb3h5RWdyZXNzUG9ydGBgLiBJdCBjYW4gYmUgYW4gZW1wdHkgbGlzdC5cbiAqICAgKyAgYGBFZ3Jlc3NJZ25vcmVkSVBzYGAgLSAoUmVxdWlyZWQpIFRoZSBlZ3Jlc3MgdHJhZmZpYyBnb2luZyB0byB0aGUgc3BlY2lmaWVkIElQIGFkZHJlc3NlcyBpcyBpZ25vcmVkIGFuZCBub3QgcmVkaXJlY3RlZCB0byB0aGUgYGBQcm94eUVncmVzc1BvcnRgYC4gSXQgY2FuIGJlIGFuIGVtcHR5IGxpc3QuXG4gKi9cblByb3h5Q29uZmlndXJhdGlvblByb3BlcnRpZXM/OiBLZXlWYWx1ZVBhaXJbXVxuLyoqXG4gKiBUaGUgcHJveHkgdHlwZS4gVGhlIG9ubHkgc3VwcG9ydGVkIHZhbHVlIGlzIGBgQVBQTUVTSGBgLlxuICovXG5UeXBlPzogc3RyaW5nXG4vKipcbiAqIFRoZSBuYW1lIG9mIHRoZSBjb250YWluZXIgdGhhdCB3aWxsIHNlcnZlIGFzIHRoZSBBcHAgTWVzaCBwcm94eS5cbiAqL1xuQ29udGFpbmVyTmFtZTogc3RyaW5nXG59XG4vKipcbiAqIEEga2V5LXZhbHVlIHBhaXIgb2JqZWN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEtleVZhbHVlUGFpciB7XG4vKipcbiAqIFRoZSB2YWx1ZSBvZiB0aGUga2V5LXZhbHVlIHBhaXIuIEZvciBlbnZpcm9ubWVudCB2YXJpYWJsZXMsIHRoaXMgaXMgdGhlIHZhbHVlIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAqL1xuVmFsdWU/OiBzdHJpbmdcbi8qKlxuICogVGhlIG5hbWUgb2YgdGhlIGtleS12YWx1ZSBwYWlyLiBGb3IgZW52aXJvbm1lbnQgdmFyaWFibGVzLCB0aGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAqL1xuTmFtZT86IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgZGF0YSB2b2x1bWUgY29uZmlndXJhdGlvbiBmb3IgdGFza3MgbGF1bmNoZWQgdXNpbmcgdGhpcyB0YXNrIGRlZmluaXRpb24uIFNwZWNpZnlpbmcgYSB2b2x1bWUgY29uZmlndXJhdGlvbiBpbiBhIHRhc2sgZGVmaW5pdGlvbiBpcyBvcHRpb25hbC4gVGhlIHZvbHVtZSBjb25maWd1cmF0aW9uIG1heSBjb250YWluIG11bHRpcGxlIHZvbHVtZXMgYnV0IG9ubHkgb25lIHZvbHVtZSBjb25maWd1cmVkIGF0IGxhdW5jaCBpcyBzdXBwb3J0ZWQuIEVhY2ggdm9sdW1lIGRlZmluZWQgaW4gdGhlIHZvbHVtZSBjb25maWd1cmF0aW9uIG1heSBvbmx5IHNwZWNpZnkgYSBgYG5hbWVgYCBhbmQgb25lIG9mIGVpdGhlciBgYGNvbmZpZ3VyZWRBdExhdW5jaGBgLCBgYGRvY2tlclZvbHVtZUNvbmZpZ3VyYXRpb25gYCwgYGBlZnNWb2x1bWVDb25maWd1cmF0aW9uYGAsIGBgZnN4V2luZG93c0ZpbGVTZXJ2ZXJWb2x1bWVDb25maWd1cmF0aW9uYGAsIG9yIGBgaG9zdGBgLiBJZiBhbiBlbXB0eSB2b2x1bWUgY29uZmlndXJhdGlvbiBpcyBzcGVjaWZpZWQsIGJ5IGRlZmF1bHQgQW1hem9uIEVDUyB1c2VzIGEgaG9zdCB2b2x1bWUuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1VzaW5nIGRhdGEgdm9sdW1lcyBpbiB0YXNrc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvdXNpbmdfZGF0YV92b2x1bWVzLmh0bWwpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZvbHVtZSB7XG5FRlNWb2x1bWVDb25maWd1cmF0aW9uPzogRUZTVm9sdW1lQ29uZmlndXJhdGlvblxuSG9zdD86IEhvc3RWb2x1bWVQcm9wZXJ0aWVzXG4vKipcbiAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSB2b2x1bWUgc2hvdWxkIGJlIGNvbmZpZ3VyZWQgYXQgbGF1bmNoIHRpbWUuIFRoaXMgaXMgdXNlZCB0byBjcmVhdGUgQW1hem9uIEVCUyB2b2x1bWVzIGZvciBzdGFuZGFsb25lIHRhc2tzIG9yIHRhc2tzIGNyZWF0ZWQgYXMgcGFydCBvZiBhIHNlcnZpY2UuIEVhY2ggdGFzayBkZWZpbml0aW9uIHJldmlzaW9uIG1heSBvbmx5IGhhdmUgb25lIHZvbHVtZSBjb25maWd1cmVkIGF0IGxhdW5jaCBpbiB0aGUgdm9sdW1lIGNvbmZpZ3VyYXRpb24uXG4gKiAgVG8gY29uZmlndXJlIGEgdm9sdW1lIGF0IGxhdW5jaCB0aW1lLCB1c2UgdGhpcyB0YXNrIGRlZmluaXRpb24gcmV2aXNpb24gYW5kIHNwZWNpZnkgYSBgYHZvbHVtZUNvbmZpZ3VyYXRpb25zYGAgb2JqZWN0IHdoZW4gY2FsbGluZyB0aGUgYGBDcmVhdGVTZXJ2aWNlYGAsIGBgVXBkYXRlU2VydmljZWBgLCBgYFJ1blRhc2tgYCBvciBgYFN0YXJ0VGFza2BgIEFQSXMuXG4gKi9cbkNvbmZpZ3VyZWRBdExhdW5jaD86IGJvb2xlYW5cbkRvY2tlclZvbHVtZUNvbmZpZ3VyYXRpb24/OiBEb2NrZXJWb2x1bWVDb25maWd1cmF0aW9uXG5GU3hXaW5kb3dzRmlsZVNlcnZlclZvbHVtZUNvbmZpZ3VyYXRpb24/OiBGU3hXaW5kb3dzRmlsZVNlcnZlclZvbHVtZUNvbmZpZ3VyYXRpb25cbi8qKlxuICogVGhlIG5hbWUgb2YgdGhlIHZvbHVtZS4gVXAgdG8gMjU1IGxldHRlcnMgKHVwcGVyY2FzZSBhbmQgbG93ZXJjYXNlKSwgbnVtYmVycywgdW5kZXJzY29yZXMsIGFuZCBoeXBoZW5zIGFyZSBhbGxvd2VkLlxuICogIFdoZW4gdXNpbmcgYSB2b2x1bWUgY29uZmlndXJlZCBhdCBsYXVuY2gsIHRoZSBgYG5hbWVgYCBpcyByZXF1aXJlZCBhbmQgbXVzdCBhbHNvIGJlIHNwZWNpZmllZCBhcyB0aGUgdm9sdW1lIG5hbWUgaW4gdGhlIGBgU2VydmljZVZvbHVtZUNvbmZpZ3VyYXRpb25gYCBvciBgYFRhc2tWb2x1bWVDb25maWd1cmF0aW9uYGAgcGFyYW1ldGVyIHdoZW4gY3JlYXRpbmcgeW91ciBzZXJ2aWNlIG9yIHN0YW5kYWxvbmUgdGFzay5cbiAqICBGb3IgYWxsIG90aGVyIHR5cGVzIG9mIHZvbHVtZXMsIHRoaXMgbmFtZSBpcyByZWZlcmVuY2VkIGluIHRoZSBgYHNvdXJjZVZvbHVtZWBgIHBhcmFtZXRlciBvZiB0aGUgYGBtb3VudFBvaW50c2BgIG9iamVjdCBpbiB0aGUgY29udGFpbmVyIGRlZmluaXRpb24uXG4gKiAgV2hlbiBhIHZvbHVtZSBpcyB1c2luZyB0aGUgYGBlZnNWb2x1bWVDb25maWd1cmF0aW9uYGAsIHRoZSBuYW1lIGlzIHJlcXVpcmVkLlxuICovXG5OYW1lPzogc3RyaW5nXG59XG4vKipcbiAqIFRoaXMgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCB3aGVuIHlvdSB1c2UgYW4gQW1hem9uIEVsYXN0aWMgRmlsZSBTeXN0ZW0gZmlsZSBzeXN0ZW0gZm9yIHRhc2sgc3RvcmFnZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFRlNWb2x1bWVDb25maWd1cmF0aW9uIHtcbi8qKlxuICogVGhlIEFtYXpvbiBFRlMgZmlsZSBzeXN0ZW0gSUQgdG8gdXNlLlxuICovXG5GaWxlc3lzdGVtSWQ6IHN0cmluZ1xuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gdXNlIGVuY3J5cHRpb24gZm9yIEFtYXpvbiBFRlMgZGF0YSBpbiB0cmFuc2l0IGJldHdlZW4gdGhlIEFtYXpvbiBFQ1MgaG9zdCBhbmQgdGhlIEFtYXpvbiBFRlMgc2VydmVyLiBUcmFuc2l0IGVuY3J5cHRpb24gbXVzdCBiZSB0dXJuZWQgb24gaWYgQW1hem9uIEVGUyBJQU0gYXV0aG9yaXphdGlvbiBpcyB1c2VkLiBJZiB0aGlzIHBhcmFtZXRlciBpcyBvbWl0dGVkLCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBgYERJU0FCTEVEYGAgaXMgdXNlZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbRW5jcnlwdGluZyBkYXRhIGluIHRyYW5zaXRdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9lZnMvbGF0ZXN0L3VnL2VuY3J5cHRpb24taW4tdHJhbnNpdC5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIEZpbGUgU3lzdGVtIFVzZXIgR3VpZGUqLlxuICovXG5UcmFuc2l0RW5jcnlwdGlvbj86IChcIkVOQUJMRURcIiB8IFwiRElTQUJMRURcIilcbkF1dGhvcml6YXRpb25Db25maWc/OiBBdXRob3JpemF0aW9uQ29uZmlnXG4vKipcbiAqIFRoZSBkaXJlY3Rvcnkgd2l0aGluIHRoZSBBbWF6b24gRUZTIGZpbGUgc3lzdGVtIHRvIG1vdW50IGFzIHRoZSByb290IGRpcmVjdG9yeSBpbnNpZGUgdGhlIGhvc3QuIElmIHRoaXMgcGFyYW1ldGVyIGlzIG9taXR0ZWQsIHRoZSByb290IG9mIHRoZSBBbWF6b24gRUZTIHZvbHVtZSB3aWxsIGJlIHVzZWQuIFNwZWNpZnlpbmcgYGAvYGAgd2lsbCBoYXZlIHRoZSBzYW1lIGVmZmVjdCBhcyBvbWl0dGluZyB0aGlzIHBhcmFtZXRlci5cbiAqICAgSWYgYW4gRUZTIGFjY2VzcyBwb2ludCBpcyBzcGVjaWZpZWQgaW4gdGhlIGBgYXV0aG9yaXphdGlvbkNvbmZpZ2BgLCB0aGUgcm9vdCBkaXJlY3RvcnkgcGFyYW1ldGVyIG11c3QgZWl0aGVyIGJlIG9taXR0ZWQgb3Igc2V0IHRvIGBgL2BgIHdoaWNoIHdpbGwgZW5mb3JjZSB0aGUgcGF0aCBzZXQgb24gdGhlIEVGUyBhY2Nlc3MgcG9pbnQuXG4gKi9cblJvb3REaXJlY3Rvcnk/OiBzdHJpbmdcbi8qKlxuICogVGhlIHBvcnQgdG8gdXNlIHdoZW4gc2VuZGluZyBlbmNyeXB0ZWQgZGF0YSBiZXR3ZWVuIHRoZSBBbWF6b24gRUNTIGhvc3QgYW5kIHRoZSBBbWF6b24gRUZTIHNlcnZlci4gSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGEgdHJhbnNpdCBlbmNyeXB0aW9uIHBvcnQsIGl0IHdpbGwgdXNlIHRoZSBwb3J0IHNlbGVjdGlvbiBzdHJhdGVneSB0aGF0IHRoZSBBbWF6b24gRUZTIG1vdW50IGhlbHBlciB1c2VzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtFRlMgbW91bnQgaGVscGVyXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZWZzL2xhdGVzdC91Zy9lZnMtbW91bnQtaGVscGVyLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgRmlsZSBTeXN0ZW0gVXNlciBHdWlkZSouXG4gKi9cblRyYW5zaXRFbmNyeXB0aW9uUG9ydD86IG51bWJlclxufVxuLyoqXG4gKiBUaGUgYXV0aG9yaXphdGlvbiBjb25maWd1cmF0aW9uIGRldGFpbHMgZm9yIHRoZSBBbWF6b24gRUZTIGZpbGUgc3lzdGVtLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhvcml6YXRpb25Db25maWcge1xuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gdXNlIHRoZSBBbWF6b24gRUNTIHRhc2sgcm9sZSBkZWZpbmVkIGluIGEgdGFzayBkZWZpbml0aW9uIHdoZW4gbW91bnRpbmcgdGhlIEFtYXpvbiBFRlMgZmlsZSBzeXN0ZW0uIElmIGl0IGlzIHR1cm5lZCBvbiwgdHJhbnNpdCBlbmNyeXB0aW9uIG11c3QgYmUgdHVybmVkIG9uIGluIHRoZSBgYEVGU1ZvbHVtZUNvbmZpZ3VyYXRpb25gYC4gSWYgdGhpcyBwYXJhbWV0ZXIgaXMgb21pdHRlZCwgdGhlIGRlZmF1bHQgdmFsdWUgb2YgYGBESVNBQkxFRGBgIGlzIHVzZWQuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1VzaW5nIEFtYXpvbiBFRlMgYWNjZXNzIHBvaW50c10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvZWZzLXZvbHVtZXMuaHRtbCNlZnMtdm9sdW1lLWFjY2Vzc3BvaW50cykgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5JQU0/OiAoXCJFTkFCTEVEXCIgfCBcIkRJU0FCTEVEXCIpXG4vKipcbiAqIFRoZSBBbWF6b24gRUZTIGFjY2VzcyBwb2ludCBJRCB0byB1c2UuIElmIGFuIGFjY2VzcyBwb2ludCBpcyBzcGVjaWZpZWQsIHRoZSByb290IGRpcmVjdG9yeSB2YWx1ZSBzcGVjaWZpZWQgaW4gdGhlIGBgRUZTVm9sdW1lQ29uZmlndXJhdGlvbmBgIG11c3QgZWl0aGVyIGJlIG9taXR0ZWQgb3Igc2V0IHRvIGBgL2BgIHdoaWNoIHdpbGwgZW5mb3JjZSB0aGUgcGF0aCBzZXQgb24gdGhlIEVGUyBhY2Nlc3MgcG9pbnQuIElmIGFuIGFjY2VzcyBwb2ludCBpcyB1c2VkLCB0cmFuc2l0IGVuY3J5cHRpb24gbXVzdCBiZSBvbiBpbiB0aGUgYGBFRlNWb2x1bWVDb25maWd1cmF0aW9uYGAuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1dvcmtpbmcgd2l0aCBBbWF6b24gRUZTIGFjY2VzcyBwb2ludHNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9lZnMvbGF0ZXN0L3VnL2Vmcy1hY2Nlc3MtcG9pbnRzLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgRmlsZSBTeXN0ZW0gVXNlciBHdWlkZSouXG4gKi9cbkFjY2Vzc1BvaW50SWQ/OiBzdHJpbmdcbn1cbi8qKlxuICogVGhpcyBwYXJhbWV0ZXIgaXMgc3BlY2lmaWVkIHdoZW4geW91IHVzZSBiaW5kIG1vdW50IGhvc3Qgdm9sdW1lcy4gVGhlIGNvbnRlbnRzIG9mIHRoZSBgYGhvc3RgYCBwYXJhbWV0ZXIgZGV0ZXJtaW5lIHdoZXRoZXIgeW91ciBiaW5kIG1vdW50IGhvc3Qgdm9sdW1lIHBlcnNpc3RzIG9uIHRoZSBob3N0IGNvbnRhaW5lciBpbnN0YW5jZSBhbmQgd2hlcmUgaXQncyBzdG9yZWQuIElmIHRoZSBgYGhvc3RgYCBwYXJhbWV0ZXIgaXMgZW1wdHksIHRoZW4gdGhlIERvY2tlciBkYWVtb24gYXNzaWducyBhIGhvc3QgcGF0aCBmb3IgeW91ciBkYXRhIHZvbHVtZS4gSG93ZXZlciwgdGhlIGRhdGEgaXNuJ3QgZ3VhcmFudGVlZCB0byBwZXJzaXN0IGFmdGVyIHRoZSBjb250YWluZXJzIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCBpdCBzdG9wIHJ1bm5pbmcuXG4gKiAgV2luZG93cyBjb250YWluZXJzIGNhbiBtb3VudCB3aG9sZSBkaXJlY3RvcmllcyBvbiB0aGUgc2FtZSBkcml2ZSBhcyBgYCRlbnY6UHJvZ3JhbURhdGFgYC4gV2luZG93cyBjb250YWluZXJzIGNhbid0IG1vdW50IGRpcmVjdG9yaWVzIG9uIGEgZGlmZmVyZW50IGRyaXZlLCBhbmQgbW91bnQgcG9pbnQgY2FuJ3QgYmUgYWNyb3NzIGRyaXZlcy4gRm9yIGV4YW1wbGUsIHlvdSBjYW4gbW91bnQgYGBDOlxcbXlcXHBhdGg6QzpcXG15XFxwYXRoYGAgYW5kIGBgRDpcXDpEOlxcYGAsIGJ1dCBub3QgYGBEOlxcbXlcXHBhdGg6QzpcXG15XFxwYXRoYGAgb3IgYGBEOlxcOkM6XFxteVxccGF0aGBgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhvc3RWb2x1bWVQcm9wZXJ0aWVzIHtcbi8qKlxuICogV2hlbiB0aGUgYGBob3N0YGAgcGFyYW1ldGVyIGlzIHVzZWQsIHNwZWNpZnkgYSBgYHNvdXJjZVBhdGhgYCB0byBkZWNsYXJlIHRoZSBwYXRoIG9uIHRoZSBob3N0IGNvbnRhaW5lciBpbnN0YW5jZSB0aGF0J3MgcHJlc2VudGVkIHRvIHRoZSBjb250YWluZXIuIElmIHRoaXMgcGFyYW1ldGVyIGlzIGVtcHR5LCB0aGVuIHRoZSBEb2NrZXIgZGFlbW9uIGhhcyBhc3NpZ25lZCBhIGhvc3QgcGF0aCBmb3IgeW91LiBJZiB0aGUgYGBob3N0YGAgcGFyYW1ldGVyIGNvbnRhaW5zIGEgYGBzb3VyY2VQYXRoYGAgZmlsZSBsb2NhdGlvbiwgdGhlbiB0aGUgZGF0YSB2b2x1bWUgcGVyc2lzdHMgYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbiBvbiB0aGUgaG9zdCBjb250YWluZXIgaW5zdGFuY2UgdW50aWwgeW91IGRlbGV0ZSBpdCBtYW51YWxseS4gSWYgdGhlIGBgc291cmNlUGF0aGBgIHZhbHVlIGRvZXNuJ3QgZXhpc3Qgb24gdGhlIGhvc3QgY29udGFpbmVyIGluc3RhbmNlLCB0aGUgRG9ja2VyIGRhZW1vbiBjcmVhdGVzIGl0LiBJZiB0aGUgbG9jYXRpb24gZG9lcyBleGlzdCwgdGhlIGNvbnRlbnRzIG9mIHRoZSBzb3VyY2UgcGF0aCBmb2xkZXIgYXJlIGV4cG9ydGVkLlxuICogIElmIHlvdSdyZSB1c2luZyB0aGUgRmFyZ2F0ZSBsYXVuY2ggdHlwZSwgdGhlIGBgc291cmNlUGF0aGBgIHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkLlxuICovXG5Tb3VyY2VQYXRoPzogc3RyaW5nXG59XG4vKipcbiAqIFRoaXMgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCB3aGVuIHlvdSB1c2UgRG9ja2VyIHZvbHVtZXMuXG4gKiAgV2luZG93cyBjb250YWluZXJzIG9ubHkgc3VwcG9ydCB0aGUgdXNlIG9mIHRoZSBgYGxvY2FsYGAgZHJpdmVyLiBUbyB1c2UgYmluZCBtb3VudHMsIHNwZWNpZnkgdGhlIGBgaG9zdGBgIHBhcmFtZXRlciBpbnN0ZWFkLlxuICogICBEb2NrZXIgdm9sdW1lcyBhcmVuJ3Qgc3VwcG9ydGVkIGJ5IHRhc2tzIHJ1biBvbiBGQVJHQVRFbG9uZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb2NrZXJWb2x1bWVDb25maWd1cmF0aW9uIHtcbi8qKlxuICogQSBtYXAgb2YgRG9ja2VyIGRyaXZlci1zcGVjaWZpYyBvcHRpb25zIHBhc3NlZCB0aHJvdWdoLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgRHJpdmVyT3B0c2BgIGluIHRoZSBkb2NrZXIgY3JlYXRlLXZvbHVtZSBjb21tYW5kIGFuZCB0aGUgYGB4eG9wdGBgIG9wdGlvbiB0byBkb2NrZXIgdm9sdW1lIGNyZWF0ZS5cbiAqL1xuRHJpdmVyT3B0cz86IHtcbi8qKlxuICogVGhpcyBpbnRlcmZhY2Ugd2FzIHJlZmVyZW5jZWQgYnkgYHVuZGVmaW5lZGAncyBKU09OLVNjaGVtYSBkZWZpbml0aW9uXG4gKiB2aWEgdGhlIGBwYXR0ZXJuUHJvcGVydHlgIFwiLnsxLH1cIi5cbiAqL1xuW2s6IHN0cmluZ106IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgc2NvcGUgZm9yIHRoZSBEb2NrZXIgdm9sdW1lIHRoYXQgZGV0ZXJtaW5lcyBpdHMgbGlmZWN5Y2xlLiBEb2NrZXIgdm9sdW1lcyB0aGF0IGFyZSBzY29wZWQgdG8gYSBgYHRhc2tgYCBhcmUgYXV0b21hdGljYWxseSBwcm92aXNpb25lZCB3aGVuIHRoZSB0YXNrIHN0YXJ0cyBhbmQgZGVzdHJveWVkIHdoZW4gdGhlIHRhc2sgc3RvcHMuIERvY2tlciB2b2x1bWVzIHRoYXQgYXJlIHNjb3BlZCBhcyBgYHNoYXJlZGBgIHBlcnNpc3QgYWZ0ZXIgdGhlIHRhc2sgc3RvcHMuXG4gKi9cblNjb3BlPzogc3RyaW5nXG4vKipcbiAqIElmIHRoaXMgdmFsdWUgaXMgYGB0cnVlYGAsIHRoZSBEb2NrZXIgdm9sdW1lIGlzIGNyZWF0ZWQgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LlxuICogICBUaGlzIGZpZWxkIGlzIG9ubHkgdXNlZCBpZiB0aGUgYGBzY29wZWBgIGlzIGBgc2hhcmVkYGAuXG4gKi9cbkF1dG9wcm92aXNpb24/OiBib29sZWFuXG4vKipcbiAqIFRoZSBEb2NrZXIgdm9sdW1lIGRyaXZlciB0byB1c2UuIFRoZSBkcml2ZXIgdmFsdWUgbXVzdCBtYXRjaCB0aGUgZHJpdmVyIG5hbWUgcHJvdmlkZWQgYnkgRG9ja2VyIGJlY2F1c2UgaXQgaXMgdXNlZCBmb3IgdGFzayBwbGFjZW1lbnQuIElmIHRoZSBkcml2ZXIgd2FzIGluc3RhbGxlZCB1c2luZyB0aGUgRG9ja2VyIHBsdWdpbiBDTEksIHVzZSBgYGRvY2tlciBwbHVnaW4gbHNgYCB0byByZXRyaWV2ZSB0aGUgZHJpdmVyIG5hbWUgZnJvbSB5b3VyIGNvbnRhaW5lciBpbnN0YW5jZS4gSWYgdGhlIGRyaXZlciB3YXMgaW5zdGFsbGVkIHVzaW5nIGFub3RoZXIgbWV0aG9kLCB1c2UgRG9ja2VyIHBsdWdpbiBkaXNjb3ZlcnkgdG8gcmV0cmlldmUgdGhlIGRyaXZlciBuYW1lLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgRHJpdmVyYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYHh4ZHJpdmVyYGAgb3B0aW9uIHRvIGRvY2tlciB2b2x1bWUgY3JlYXRlLlxuICovXG5Ecml2ZXI/OiBzdHJpbmdcbi8qKlxuICogQ3VzdG9tIG1ldGFkYXRhIHRvIGFkZCB0byB5b3VyIERvY2tlciB2b2x1bWUuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBMYWJlbHNgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgeHhsYWJlbGBgIG9wdGlvbiB0byBkb2NrZXIgdm9sdW1lIGNyZWF0ZS5cbiAqL1xuTGFiZWxzPzoge1xuLyoqXG4gKiBUaGlzIGludGVyZmFjZSB3YXMgcmVmZXJlbmNlZCBieSBgdW5kZWZpbmVkYCdzIEpTT04tU2NoZW1hIGRlZmluaXRpb25cbiAqIHZpYSB0aGUgYHBhdHRlcm5Qcm9wZXJ0eWAgXCIuezEsfVwiLlxuICovXG5bazogc3RyaW5nXTogc3RyaW5nXG59XG59XG4vKipcbiAqIFRoaXMgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCB3aGVuIHlvdSB1c2UgQW1hem9uIEZTeCBmb3IgV2luZG93cyBGaWxlIFNlcnZlciBmaWxlIHN5c3RlbSBmb3IgdGFzayBzdG9yYWdlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZTeFdpbmRvd3NGaWxlU2VydmVyVm9sdW1lQ29uZmlndXJhdGlvbiB7XG5BdXRob3JpemF0aW9uQ29uZmlnPzogRlN4QXV0aG9yaXphdGlvbkNvbmZpZ1xuLyoqXG4gKiBUaGUgQW1hem9uIEZTeCBmb3IgV2luZG93cyBGaWxlIFNlcnZlciBmaWxlIHN5c3RlbSBJRCB0byB1c2UuXG4gKi9cbkZpbGVTeXN0ZW1JZDogc3RyaW5nXG4vKipcbiAqIFRoZSBkaXJlY3Rvcnkgd2l0aGluIHRoZSBBbWF6b24gRlN4IGZvciBXaW5kb3dzIEZpbGUgU2VydmVyIGZpbGUgc3lzdGVtIHRvIG1vdW50IGFzIHRoZSByb290IGRpcmVjdG9yeSBpbnNpZGUgdGhlIGhvc3QuXG4gKi9cblJvb3REaXJlY3Rvcnk6IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgYXV0aG9yaXphdGlvbiBjb25maWd1cmF0aW9uIGRldGFpbHMgZm9yIHRoZSBBbWF6b24gRlN4IGZvciBXaW5kb3dzIEZpbGUgU2VydmVyIGZpbGUgc3lzdGVtLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZTeEF1dGhvcml6YXRpb25Db25maWcge1xuLyoqXG4gKiBUaGUgYXV0aG9yaXphdGlvbiBjcmVkZW50aWFsIG9wdGlvbiB0byB1c2UuIFRoZSBhdXRob3JpemF0aW9uIGNyZWRlbnRpYWwgb3B0aW9ucyBjYW4gYmUgcHJvdmlkZWQgdXNpbmcgZWl0aGVyIHRoZSBBbWF6b24gUmVzb3VyY2UgTmFtZSAoQVJOKSBvZiBhbiBBU01sb25nIHNlY3JldCBvciBTU00gUGFyYW1ldGVyIFN0b3JlIHBhcmFtZXRlci4gVGhlIEFSTiByZWZlcnMgdG8gdGhlIHN0b3JlZCBjcmVkZW50aWFscy5cbiAqL1xuQ3JlZGVudGlhbHNQYXJhbWV0ZXI6IHN0cmluZ1xuLyoqXG4gKiBBIGZ1bGx5IHF1YWxpZmllZCBkb21haW4gbmFtZSBob3N0ZWQgYnkgYW4gW10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RpcmVjdG9yeXNlcnZpY2UvbGF0ZXN0L2FkbWluLWd1aWRlL2RpcmVjdG9yeV9taWNyb3NvZnRfYWQuaHRtbCkgTWFuYWdlZCBNaWNyb3NvZnQgQUQgKEFjdGl2ZSBEaXJlY3RvcnkpIG9yIHNlbGYtaG9zdGVkIEFEIG9uIEFtYXpvbiBFQzIuXG4gKi9cbkRvbWFpbjogc3RyaW5nXG59XG4vKipcbiAqIFRoZSBgYENvbnRhaW5lckRlZmluaXRpb25gYCBwcm9wZXJ0eSBzcGVjaWZpZXMgYSBjb250YWluZXIgZGVmaW5pdGlvbi4gQ29udGFpbmVyIGRlZmluaXRpb25zIGFyZSB1c2VkIGluIHRhc2sgZGVmaW5pdGlvbnMgdG8gZGVzY3JpYmUgdGhlIGRpZmZlcmVudCBjb250YWluZXJzIHRoYXQgYXJlIGxhdW5jaGVkIGFzIHBhcnQgb2YgYSB0YXNrLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRhaW5lckRlZmluaXRpb24ge1xuLyoqXG4gKiBUaGUgdXNlciB0byB1c2UgaW5zaWRlIHRoZSBjb250YWluZXIuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBVc2VyYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYC0tdXNlcmBgIG9wdGlvbiB0byBkb2NrZXIgcnVuLlxuICogICBXaGVuIHJ1bm5pbmcgdGFza3MgdXNpbmcgdGhlIGBgaG9zdGBgIG5ldHdvcmsgbW9kZSwgZG9uJ3QgcnVuIGNvbnRhaW5lcnMgdXNpbmcgdGhlIHJvb3QgdXNlciAoVUlEIDApLiBXZSByZWNvbW1lbmQgdXNpbmcgYSBub24tcm9vdCB1c2VyIGZvciBiZXR0ZXIgc2VjdXJpdHkuXG4gKiAgIFlvdSBjYW4gc3BlY2lmeSB0aGUgYGB1c2VyYGAgdXNpbmcgdGhlIGZvbGxvd2luZyBmb3JtYXRzLiBJZiBzcGVjaWZ5aW5nIGEgVUlEIG9yIEdJRCwgeW91IG11c3Qgc3BlY2lmeSBpdCBhcyBhIHBvc2l0aXZlIGludGVnZXIuXG4gKiAgICsgICBgYHVzZXJgYCBcbiAqICAgKyAgIGBgdXNlcjpncm91cGBgIFxuICogICArICAgYGB1aWRgYCBcbiAqICAgKyAgIGBgdWlkOmdpZGBgIFxuICogICArICAgYGB1c2VyOmdpZGBgIFxuICogICArICAgYGB1aWQ6Z3JvdXBgYCBcbiAqICAgXG4gKiAgIFRoaXMgcGFyYW1ldGVyIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIFdpbmRvd3MgY29udGFpbmVycy5cbiAqL1xuVXNlcj86IHN0cmluZ1xuLyoqXG4gKiBUaGUgc2VjcmV0cyB0byBwYXNzIHRvIHRoZSBjb250YWluZXIuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1NwZWNpZnlpbmcgU2Vuc2l0aXZlIERhdGFdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3NwZWNpZnlpbmctc2Vuc2l0aXZlLWRhdGEuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5TZWNyZXRzPzogU2VjcmV0W11cbi8qKlxuICogVGhlIGFtb3VudCAoaW4gTWlCKSBvZiBtZW1vcnkgdG8gcHJlc2VudCB0byB0aGUgY29udGFpbmVyLiBJZiB5b3VyIGNvbnRhaW5lciBhdHRlbXB0cyB0byBleGNlZWQgdGhlIG1lbW9yeSBzcGVjaWZpZWQgaGVyZSwgdGhlIGNvbnRhaW5lciBpcyBraWxsZWQuIFRoZSB0b3RhbCBhbW91bnQgb2YgbWVtb3J5IHJlc2VydmVkIGZvciBhbGwgY29udGFpbmVycyB3aXRoaW4gYSB0YXNrIG11c3QgYmUgbG93ZXIgdGhhbiB0aGUgdGFzayBgYG1lbW9yeWBgIHZhbHVlLCBpZiBvbmUgaXMgc3BlY2lmaWVkLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgTWVtb3J5YGAgaW4gdGhlIFtDcmVhdGUgYSBjb250YWluZXJdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9odHRwczovL2RvY3MuZG9ja2VyLmNvbS9lbmdpbmUvYXBpL3YxLjM1LyNvcGVyYXRpb24vQ29udGFpbmVyQ3JlYXRlKSBzZWN0aW9uIG9mIHRoZSBbRG9ja2VyIFJlbW90ZSBBUEldKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9odHRwczovL2RvY3MuZG9ja2VyLmNvbS9lbmdpbmUvYXBpL3YxLjM1LykgYW5kIHRoZSBgYC0tbWVtb3J5YGAgb3B0aW9uIHRvIFtkb2NrZXIgcnVuXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaHR0cHM6Ly9kb2NzLmRvY2tlci5jb20vZW5naW5lL3JlZmVyZW5jZS9ydW4vI3NlY3VyaXR5LWNvbmZpZ3VyYXRpb24pLlxuICogIElmIHVzaW5nIHRoZSBGYXJnYXRlIGxhdW5jaCB0eXBlLCB0aGlzIHBhcmFtZXRlciBpcyBvcHRpb25hbC5cbiAqICBJZiB1c2luZyB0aGUgRUMyIGxhdW5jaCB0eXBlLCB5b3UgbXVzdCBzcGVjaWZ5IGVpdGhlciBhIHRhc2stbGV2ZWwgbWVtb3J5IHZhbHVlIG9yIGEgY29udGFpbmVyLWxldmVsIG1lbW9yeSB2YWx1ZS4gSWYgeW91IHNwZWNpZnkgYm90aCBhIGNvbnRhaW5lci1sZXZlbCBgYG1lbW9yeWBgIGFuZCBgYG1lbW9yeVJlc2VydmF0aW9uYGAgdmFsdWUsIGBgbWVtb3J5YGAgbXVzdCBiZSBncmVhdGVyIHRoYW4gYGBtZW1vcnlSZXNlcnZhdGlvbmBgLiBJZiB5b3Ugc3BlY2lmeSBgYG1lbW9yeVJlc2VydmF0aW9uYGAsIHRoZW4gdGhhdCB2YWx1ZSBpcyBzdWJ0cmFjdGVkIGZyb20gdGhlIGF2YWlsYWJsZSBtZW1vcnkgcmVzb3VyY2VzIGZvciB0aGUgY29udGFpbmVyIGluc3RhbmNlIHdoZXJlIHRoZSBjb250YWluZXIgaXMgcGxhY2VkLiBPdGhlcndpc2UsIHRoZSB2YWx1ZSBvZiBgYG1lbW9yeWBgIGlzIHVzZWQuXG4gKiAgVGhlIERvY2tlciAyMC4xMC4wIG9yIGxhdGVyIGRhZW1vbiByZXNlcnZlcyBhIG1pbmltdW0gb2YgNiBNaUIgb2YgbWVtb3J5IGZvciBhIGNvbnRhaW5lciwgc28geW91IHNob3VsZCBub3Qgc3BlY2lmeSBmZXdlciB0aGFuIDYgTWlCIG9mIG1lbW9yeSBmb3IgeW91ciBjb250YWluZXJzLlxuICogIFRoZSBEb2NrZXIgMTkuMDMuMTMtY2Ugb3IgZWFybGllciBkYWVtb24gcmVzZXJ2ZXMgYSBtaW5pbXVtIG9mIDQgTWlCIG9mIG1lbW9yeSBmb3IgYSBjb250YWluZXIsIHNvIHlvdSBzaG91bGQgbm90IHNwZWNpZnkgZmV3ZXIgdGhhbiA0IE1pQiBvZiBtZW1vcnkgZm9yIHlvdXIgY29udGFpbmVycy5cbiAqL1xuTWVtb3J5PzogbnVtYmVyXG4vKipcbiAqIFdoZW4gdGhpcyBwYXJhbWV0ZXIgaXMgdHJ1ZSwgdGhlIGNvbnRhaW5lciBpcyBnaXZlbiBlbGV2YXRlZCBwcml2aWxlZ2VzIG9uIHRoZSBob3N0IGNvbnRhaW5lciBpbnN0YW5jZSAoc2ltaWxhciB0byB0aGUgYGByb290YGAgdXNlcikuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBQcml2aWxlZ2VkYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYC0tcHJpdmlsZWdlZGBgIG9wdGlvbiB0byBkb2NrZXIgcnVuXG4gKiAgIFRoaXMgcGFyYW1ldGVyIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIFdpbmRvd3MgY29udGFpbmVycyBvciB0YXNrcyBydW4gb24gRkFSR0FURWxvbmcuXG4gKi9cblByaXZpbGVnZWQ/OiBib29sZWFuXG5IZWFsdGhDaGVjaz86IEhlYWx0aENoZWNrXG4vKipcbiAqIFRpbWUgZHVyYXRpb24gKGluIHNlY29uZHMpIHRvIHdhaXQgYmVmb3JlIGdpdmluZyB1cCBvbiByZXNvbHZpbmcgZGVwZW5kZW5jaWVzIGZvciBhIGNvbnRhaW5lci4gRm9yIGV4YW1wbGUsIHlvdSBzcGVjaWZ5IHR3byBjb250YWluZXJzIGluIGEgdGFzayBkZWZpbml0aW9uIHdpdGggY29udGFpbmVyQSBoYXZpbmcgYSBkZXBlbmRlbmN5IG9uIGNvbnRhaW5lckIgcmVhY2hpbmcgYSBgYENPTVBMRVRFYGAsIGBgU1VDQ0VTU2BgLCBvciBgYEhFQUxUSFlgYCBzdGF0dXMuIElmIGEgYGBzdGFydFRpbWVvdXRgYCB2YWx1ZSBpcyBzcGVjaWZpZWQgZm9yIGNvbnRhaW5lckIgYW5kIGl0IGRvZXNuJ3QgcmVhY2ggdGhlIGRlc2lyZWQgc3RhdHVzIHdpdGhpbiB0aGF0IHRpbWUgdGhlbiBjb250YWluZXJBIGdpdmVzIHVwIGFuZCBub3Qgc3RhcnQuIFRoaXMgcmVzdWx0cyBpbiB0aGUgdGFzayB0cmFuc2l0aW9uaW5nIHRvIGEgYGBTVE9QUEVEYGAgc3RhdGUuXG4gKiAgIFdoZW4gdGhlIGBgRUNTX0NPTlRBSU5FUl9TVEFSVF9USU1FT1VUYGAgY29udGFpbmVyIGFnZW50IGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgaXMgdXNlZCwgaXQncyBlbmZvcmNlZCBpbmRlcGVuZGVudGx5IGZyb20gdGhpcyBzdGFydCB0aW1lb3V0IHZhbHVlLlxuICogICBGb3IgdGFza3MgdXNpbmcgdGhlIEZhcmdhdGUgbGF1bmNoIHR5cGUsIHRoZSB0YXNrIG9yIHNlcnZpY2UgcmVxdWlyZXMgdGhlIGZvbGxvd2luZyBwbGF0Zm9ybXM6XG4gKiAgICsgIExpbnV4IHBsYXRmb3JtIHZlcnNpb24gYGAxLjMuMGBgIG9yIGxhdGVyLlxuICogICArICBXaW5kb3dzIHBsYXRmb3JtIHZlcnNpb24gYGAxLjAuMGBgIG9yIGxhdGVyLlxuICogICBcbiAqICBGb3IgdGFza3MgdXNpbmcgdGhlIEVDMiBsYXVuY2ggdHlwZSwgeW91ciBjb250YWluZXIgaW5zdGFuY2VzIHJlcXVpcmUgYXQgbGVhc3QgdmVyc2lvbiBgYDEuMjYuMGBgIG9mIHRoZSBjb250YWluZXIgYWdlbnQgdG8gdXNlIGEgY29udGFpbmVyIHN0YXJ0IHRpbWVvdXQgdmFsdWUuIEhvd2V2ZXIsIHdlIHJlY29tbWVuZCB1c2luZyB0aGUgbGF0ZXN0IGNvbnRhaW5lciBhZ2VudCB2ZXJzaW9uLiBGb3IgaW5mb3JtYXRpb24gYWJvdXQgY2hlY2tpbmcgeW91ciBhZ2VudCB2ZXJzaW9uIGFuZCB1cGRhdGluZyB0byB0aGUgbGF0ZXN0IHZlcnNpb24sIHNlZSBbVXBkYXRpbmcgdGhlIEFtYXpvbiBFQ1MgQ29udGFpbmVyIEFnZW50XShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9lY3MtYWdlbnQtdXBkYXRlLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi4gSWYgeW91J3JlIHVzaW5nIGFuIEFtYXpvbiBFQ1Mtb3B0aW1pemVkIExpbnV4IEFNSSwgeW91ciBpbnN0YW5jZSBuZWVkcyBhdCBsZWFzdCB2ZXJzaW9uIGBgMS4yNi4wLTFgYCBvZiB0aGUgYGBlY3MtaW5pdGBgIHBhY2thZ2UuIElmIHlvdXIgY29udGFpbmVyIGluc3RhbmNlcyBhcmUgbGF1bmNoZWQgZnJvbSB2ZXJzaW9uIGBgMjAxOTAzMDFgYCBvciBsYXRlciwgdGhlbiB0aGV5IGNvbnRhaW4gdGhlIHJlcXVpcmVkIHZlcnNpb25zIG9mIHRoZSBjb250YWluZXIgYWdlbnQgYW5kIGBgZWNzLWluaXRgYC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQW1hem9uIEVDUy1vcHRpbWl6ZWQgTGludXggQU1JXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9lY3Mtb3B0aW1pemVkX0FNSS5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKiAgVGhlIHZhbGlkIHZhbHVlcyBmb3IgRmFyZ2F0ZSBhcmUgMi0xMjAgc2Vjb25kcy5cbiAqL1xuU3RhcnRUaW1lb3V0PzogbnVtYmVyXG4vKipcbiAqIERhdGEgdm9sdW1lcyB0byBtb3VudCBmcm9tIGFub3RoZXIgY29udGFpbmVyLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgVm9sdW1lc0Zyb21gYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS12b2x1bWVzLWZyb21gYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi5cbiAqL1xuVm9sdW1lc0Zyb20/OiBWb2x1bWVGcm9tW11cbi8qKlxuICogVGhlIG51bWJlciBvZiBgYGNwdWBgIHVuaXRzIHJlc2VydmVkIGZvciB0aGUgY29udGFpbmVyLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgQ3B1U2hhcmVzYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmRhbmQgdGhlIGBgLS1jcHUtc2hhcmVzYGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKiAgVGhpcyBmaWVsZCBpcyBvcHRpb25hbCBmb3IgdGFza3MgdXNpbmcgdGhlIEZhcmdhdGUgbGF1bmNoIHR5cGUsIGFuZCB0aGUgb25seSByZXF1aXJlbWVudCBpcyB0aGF0IHRoZSB0b3RhbCBhbW91bnQgb2YgQ1BVIHJlc2VydmVkIGZvciBhbGwgY29udGFpbmVycyB3aXRoaW4gYSB0YXNrIGJlIGxvd2VyIHRoYW4gdGhlIHRhc2stbGV2ZWwgYGBjcHVgYCB2YWx1ZS5cbiAqICAgWW91IGNhbiBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBDUFUgdW5pdHMgdGhhdCBhcmUgYXZhaWxhYmxlIHBlciBFQzIgaW5zdGFuY2UgdHlwZSBieSBtdWx0aXBseWluZyB0aGUgdkNQVXMgbGlzdGVkIGZvciB0aGF0IGluc3RhbmNlIHR5cGUgb24gdGhlIFtBbWF6b24gRUMyIEluc3RhbmNlc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2VjMi9pbnN0YW5jZS10eXBlcy8pIGRldGFpbCBwYWdlIGJ5IDEsMDI0LlxuICogICBMaW51eCBjb250YWluZXJzIHNoYXJlIHVuYWxsb2NhdGVkIENQVSB1bml0cyB3aXRoIG90aGVyIGNvbnRhaW5lcnMgb24gdGhlIGNvbnRhaW5lciBpbnN0YW5jZSB3aXRoIHRoZSBzYW1lIHJhdGlvIGFzIHRoZWlyIGFsbG9jYXRlZCBhbW91bnQuIEZvciBleGFtcGxlLCBpZiB5b3UgcnVuIGEgc2luZ2xlLWNvbnRhaW5lciB0YXNrIG9uIGEgc2luZ2xlLWNvcmUgaW5zdGFuY2UgdHlwZSB3aXRoIDUxMiBDUFUgdW5pdHMgc3BlY2lmaWVkIGZvciB0aGF0IGNvbnRhaW5lciwgYW5kIHRoYXQncyB0aGUgb25seSB0YXNrIHJ1bm5pbmcgb24gdGhlIGNvbnRhaW5lciBpbnN0YW5jZSwgdGhhdCBjb250YWluZXIgY291bGQgdXNlIHRoZSBmdWxsIDEsMDI0IENQVSB1bml0IHNoYXJlIGF0IGFueSBnaXZlbiB0aW1lLiBIb3dldmVyLCBpZiB5b3UgbGF1bmNoZWQgYW5vdGhlciBjb3B5IG9mIHRoZSBzYW1lIHRhc2sgb24gdGhhdCBjb250YWluZXIgaW5zdGFuY2UsIGVhY2ggdGFzayBpcyBndWFyYW50ZWVkIGEgbWluaW11bSBvZiA1MTIgQ1BVIHVuaXRzIHdoZW4gbmVlZGVkLiBNb3Jlb3ZlciwgZWFjaCBjb250YWluZXIgY291bGQgZmxvYXQgdG8gaGlnaGVyIENQVSB1c2FnZSBpZiB0aGUgb3RoZXIgY29udGFpbmVyIHdhcyBub3QgdXNpbmcgaXQuIElmIGJvdGggdGFza3Mgd2VyZSAxMDAlIGFjdGl2ZSBhbGwgb2YgdGhlIHRpbWUsIHRoZXkgd291bGQgYmUgbGltaXRlZCB0byA1MTIgQ1BVIHVuaXRzLlxuICogIE9uIExpbnV4IGNvbnRhaW5lciBpbnN0YW5jZXMsIHRoZSBEb2NrZXIgZGFlbW9uIG9uIHRoZSBjb250YWluZXIgaW5zdGFuY2UgdXNlcyB0aGUgQ1BVIHZhbHVlIHRvIGNhbGN1bGF0ZSB0aGUgcmVsYXRpdmUgQ1BVIHNoYXJlIHJhdGlvcyBmb3IgcnVubmluZyBjb250YWluZXJzLiBUaGUgbWluaW11bSB2YWxpZCBDUFUgc2hhcmUgdmFsdWUgdGhhdCB0aGUgTGludXgga2VybmVsIGFsbG93cyBpcyAyLCBhbmQgdGhlIG1heGltdW0gdmFsaWQgQ1BVIHNoYXJlIHZhbHVlIHRoYXQgdGhlIExpbnV4IGtlcm5lbCBhbGxvd3MgaXMgMjYyMTQ0LiBIb3dldmVyLCB0aGUgQ1BVIHBhcmFtZXRlciBpc24ndCByZXF1aXJlZCwgYW5kIHlvdSBjYW4gdXNlIENQVSB2YWx1ZXMgYmVsb3cgMiBvciBhYm92ZSAyNjIxNDQgaW4geW91ciBjb250YWluZXIgZGVmaW5pdGlvbnMuIEZvciBDUFUgdmFsdWVzIGJlbG93IDIgKGluY2x1ZGluZyBudWxsKSBvciBhYm92ZSAyNjIxNDQsIHRoZSBiZWhhdmlvciB2YXJpZXMgYmFzZWQgb24geW91ciBBbWF6b24gRUNTIGNvbnRhaW5lciBhZ2VudCB2ZXJzaW9uOlxuICogICArICAqQWdlbnQgdmVyc2lvbnMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDEuMS4wOiogTnVsbCBhbmQgemVybyBDUFUgdmFsdWVzIGFyZSBwYXNzZWQgdG8gRG9ja2VyIGFzIDAsIHdoaWNoIERvY2tlciB0aGVuIGNvbnZlcnRzIHRvIDEsMDI0IENQVSBzaGFyZXMuIENQVSB2YWx1ZXMgb2YgMSBhcmUgcGFzc2VkIHRvIERvY2tlciBhcyAxLCB3aGljaCB0aGUgTGludXgga2VybmVsIGNvbnZlcnRzIHRvIHR3byBDUFUgc2hhcmVzLlxuICogICArICAqQWdlbnQgdmVyc2lvbnMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEuMi4wOiogTnVsbCwgemVybywgYW5kIENQVSB2YWx1ZXMgb2YgMSBhcmUgcGFzc2VkIHRvIERvY2tlciBhcyAyLlxuICogICArICAqQWdlbnQgdmVyc2lvbnMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEuODQuMDoqIENQVSB2YWx1ZXMgZ3JlYXRlciB0aGFuIDI1NiB2Q1BVIGFyZSBwYXNzZWQgdG8gRG9ja2VyIGFzIDI1Niwgd2hpY2ggaXMgZXF1aXZhbGVudCB0byAyNjIxNDQgQ1BVIHNoYXJlcy5cbiAqICAgXG4gKiAgT24gV2luZG93cyBjb250YWluZXIgaW5zdGFuY2VzLCB0aGUgQ1BVIGxpbWl0IGlzIGVuZm9yY2VkIGFzIGFuIGFic29sdXRlIGxpbWl0LCBvciBhIHF1b3RhLiBXaW5kb3dzIGNvbnRhaW5lcnMgb25seSBoYXZlIGFjY2VzcyB0byB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBDUFUgdGhhdCdzIGRlc2NyaWJlZCBpbiB0aGUgdGFzayBkZWZpbml0aW9uLiBBIG51bGwgb3IgemVybyBDUFUgdmFsdWUgaXMgcGFzc2VkIHRvIERvY2tlciBhcyBgYDBgYCwgd2hpY2ggV2luZG93cyBpbnRlcnByZXRzIGFzIDElIG9mIG9uZSBDUFUuXG4gKi9cbkNwdT86IG51bWJlclxuLyoqXG4gKiBFYXJseSB2ZXJzaW9ucyBvZiB0aGUgQW1hem9uIEVDUyBjb250YWluZXIgYWdlbnQgZG9uJ3QgcHJvcGVybHkgaGFuZGxlIGBgZW50cnlQb2ludGBgIHBhcmFtZXRlcnMuIElmIHlvdSBoYXZlIHByb2JsZW1zIHVzaW5nIGBgZW50cnlQb2ludGBgLCB1cGRhdGUgeW91ciBjb250YWluZXIgYWdlbnQgb3IgZW50ZXIgeW91ciBjb21tYW5kcyBhbmQgYXJndW1lbnRzIGFzIGBgY29tbWFuZGBgIGFycmF5IGl0ZW1zIGluc3RlYWQuXG4gKiAgIFRoZSBlbnRyeSBwb2ludCB0aGF0J3MgcGFzc2VkIHRvIHRoZSBjb250YWluZXIuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBFbnRyeXBvaW50YGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYC0tZW50cnlwb2ludGBgIG9wdGlvbiB0byBkb2NrZXIgcnVuLlxuICovXG5FbnRyeVBvaW50Pzogc3RyaW5nW11cbi8qKlxuICogQSBsaXN0IG9mIEROUyBzZXJ2ZXJzIHRoYXQgYXJlIHByZXNlbnRlZCB0byB0aGUgY29udGFpbmVyLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgRG5zYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYC0tZG5zYGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKiAgIFRoaXMgcGFyYW1ldGVyIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIFdpbmRvd3MgY29udGFpbmVycy5cbiAqL1xuRG5zU2VydmVycz86IHN0cmluZ1tdXG4vKipcbiAqIFdoZW4gdGhpcyBwYXJhbWV0ZXIgaXMgdHJ1ZSwgdGhlIGNvbnRhaW5lciBpcyBnaXZlbiByZWFkLW9ubHkgYWNjZXNzIHRvIGl0cyByb290IGZpbGUgc3lzdGVtLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgUmVhZG9ubHlSb290ZnNgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS1yZWFkLW9ubHlgYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi5cbiAqICAgVGhpcyBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZCBmb3IgV2luZG93cyBjb250YWluZXJzLlxuICovXG5SZWFkb25seVJvb3RGaWxlc3lzdGVtPzogYm9vbGVhblxuLyoqXG4gKiBUaGUgaW1hZ2UgdXNlZCB0byBzdGFydCBhIGNvbnRhaW5lci4gVGhpcyBzdHJpbmcgaXMgcGFzc2VkIGRpcmVjdGx5IHRvIHRoZSBEb2NrZXIgZGFlbW9uLiBCeSBkZWZhdWx0LCBpbWFnZXMgaW4gdGhlIERvY2tlciBIdWIgcmVnaXN0cnkgYXJlIGF2YWlsYWJsZS4gT3RoZXIgcmVwb3NpdG9yaWVzIGFyZSBzcGVjaWZpZWQgd2l0aCBlaXRoZXIgYGByZXBvc2l0b3J5LXVybC9pbWFnZTp0YWdgYCBvciBgYHJlcG9zaXRvcnktdXJsL2ltYWdlQGRpZ2VzdGBgLiBGb3IgaW1hZ2VzIHVzaW5nIHRhZ3MgKHJlcG9zaXRvcnktdXJsL2ltYWdlOnRhZyksIHVwIHRvIDI1NSBjaGFyYWN0ZXJzIHRvdGFsIGFyZSBhbGxvd2VkLCBpbmNsdWRpbmcgbGV0dGVycyAodXBwZXJjYXNlIGFuZCBsb3dlcmNhc2UpLCBudW1iZXJzLCBoeXBoZW5zLCB1bmRlcnNjb3JlcywgY29sb25zLCBwZXJpb2RzLCBmb3J3YXJkIHNsYXNoZXMsIGFuZCBudW1iZXIgc2lnbnMgKCMpLiBGb3IgaW1hZ2VzIHVzaW5nIGRpZ2VzdHMgKHJlcG9zaXRvcnktdXJsL2ltYWdlQGRpZ2VzdCksIHRoZSAyNTUgY2hhcmFjdGVyIGxpbWl0IGFwcGxpZXMgb25seSB0byB0aGUgcmVwb3NpdG9yeSBVUkwgYW5kIGltYWdlIG5hbWUgKGV2ZXJ5dGhpbmcgYmVmb3JlIHRoZSBAIHNpZ24pLiBUaGUgb25seSBzdXBwb3J0ZWQgaGFzaCBmdW5jdGlvbiBpcyBzaGEyNTYsIGFuZCB0aGUgaGFzaCB2YWx1ZSBhZnRlciBzaGEyNTY6IG11c3QgYmUgZXhhY3RseSA2NCBjaGFyYWN0ZXJzIChvbmx5IGxldHRlcnMgQS1GLCBhLWYsIGFuZCBudW1iZXJzIDAtOSBhcmUgYWxsb3dlZCkuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBJbWFnZWBgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kIGFuZCB0aGUgYGBJTUFHRWBgIHBhcmFtZXRlciBvZiBkb2NrZXIgcnVuLlxuICogICArICBXaGVuIGEgbmV3IHRhc2sgc3RhcnRzLCB0aGUgQW1hem9uIEVDUyBjb250YWluZXIgYWdlbnQgcHVsbHMgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpZWQgaW1hZ2UgYW5kIHRhZyBmb3IgdGhlIGNvbnRhaW5lciB0byB1c2UuIEhvd2V2ZXIsIHN1YnNlcXVlbnQgdXBkYXRlcyB0byBhIHJlcG9zaXRvcnkgaW1hZ2UgYXJlbid0IHByb3BhZ2F0ZWQgdG8gYWxyZWFkeSBydW5uaW5nIHRhc2tzLlxuICogICArICBJbWFnZXMgaW4gQW1hem9uIEVDUiByZXBvc2l0b3JpZXMgY2FuIGJlIHNwZWNpZmllZCBieSBlaXRoZXIgdXNpbmcgdGhlIGZ1bGwgYGByZWdpc3RyeS9yZXBvc2l0b3J5OnRhZ2BgIG9yIGBgcmVnaXN0cnkvcmVwb3NpdG9yeUBkaWdlc3RgYC4gRm9yIGV4YW1wbGUsIGBgMDEyMzQ1Njc4OTEwLmRrci5lY3IuPHJlZ2lvbi1uYW1lPi5hbWF6b25hd3MuY29tLzxyZXBvc2l0b3J5LW5hbWU+OmxhdGVzdGBgIG9yIGBgMDEyMzQ1Njc4OTEwLmRrci5lY3IuPHJlZ2lvbi1uYW1lPi5hbWF6b25hd3MuY29tLzxyZXBvc2l0b3J5LW5hbWU+QHNoYTI1Njo5NGFmZDFmMmU2NGQ5MDhiYzkwZGJjYTAwMzVhNWI1NjdFWEFNUExFYGAuIFxuICogICArICBJbWFnZXMgaW4gb2ZmaWNpYWwgcmVwb3NpdG9yaWVzIG9uIERvY2tlciBIdWIgdXNlIGEgc2luZ2xlIG5hbWUgKGZvciBleGFtcGxlLCBgYHVidW50dWBgIG9yIGBgbW9uZ29gYCkuXG4gKiAgICsgIEltYWdlcyBpbiBvdGhlciByZXBvc2l0b3JpZXMgb24gRG9ja2VyIEh1YiBhcmUgcXVhbGlmaWVkIHdpdGggYW4gb3JnYW5pemF0aW9uIG5hbWUgKGZvciBleGFtcGxlLCBgYGFtYXpvbi9hbWF6b24tZWNzLWFnZW50YGApLlxuICogICArICBJbWFnZXMgaW4gb3RoZXIgb25saW5lIHJlcG9zaXRvcmllcyBhcmUgcXVhbGlmaWVkIGZ1cnRoZXIgYnkgYSBkb21haW4gbmFtZSAoZm9yIGV4YW1wbGUsIGBgcXVheS5pby9hc3NlbWJseWxpbmUvdWJ1bnR1YGApLlxuICovXG5JbWFnZTogc3RyaW5nXG4vKipcbiAqIElmIHRoZSBgYGVzc2VudGlhbGBgIHBhcmFtZXRlciBvZiBhIGNvbnRhaW5lciBpcyBtYXJrZWQgYXMgYGB0cnVlYGAsIGFuZCB0aGF0IGNvbnRhaW5lciBmYWlscyBvciBzdG9wcyBmb3IgYW55IHJlYXNvbiwgYWxsIG90aGVyIGNvbnRhaW5lcnMgdGhhdCBhcmUgcGFydCBvZiB0aGUgdGFzayBhcmUgc3RvcHBlZC4gSWYgdGhlIGBgZXNzZW50aWFsYGAgcGFyYW1ldGVyIG9mIGEgY29udGFpbmVyIGlzIG1hcmtlZCBhcyBgYGZhbHNlYGAsIGl0cyBmYWlsdXJlIGRvZXNuJ3QgYWZmZWN0IHRoZSByZXN0IG9mIHRoZSBjb250YWluZXJzIGluIGEgdGFzay4gSWYgdGhpcyBwYXJhbWV0ZXIgaXMgb21pdHRlZCwgYSBjb250YWluZXIgaXMgYXNzdW1lZCB0byBiZSBlc3NlbnRpYWwuXG4gKiAgQWxsIHRhc2tzIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgZXNzZW50aWFsIGNvbnRhaW5lci4gSWYgeW91IGhhdmUgYW4gYXBwbGljYXRpb24gdGhhdCdzIGNvbXBvc2VkIG9mIG11bHRpcGxlIGNvbnRhaW5lcnMsIGdyb3VwIGNvbnRhaW5lcnMgdGhhdCBhcmUgdXNlZCBmb3IgYSBjb21tb24gcHVycG9zZSBpbnRvIGNvbXBvbmVudHMsIGFuZCBzZXBhcmF0ZSB0aGUgZGlmZmVyZW50IGNvbXBvbmVudHMgaW50byBtdWx0aXBsZSB0YXNrIGRlZmluaXRpb25zLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtBcHBsaWNhdGlvbiBBcmNoaXRlY3R1cmVdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2FwcGxpY2F0aW9uX2FyY2hpdGVjdHVyZS5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKi9cbkVzc2VudGlhbD86IGJvb2xlYW5cbkxvZ0NvbmZpZ3VyYXRpb24/OiBMb2dDb25maWd1cmF0aW9uXG4vKipcbiAqIFRoZSB0eXBlIGFuZCBhbW91bnQgb2YgYSByZXNvdXJjZSB0byBhc3NpZ24gdG8gYSBjb250YWluZXIuIFRoZSBvbmx5IHN1cHBvcnRlZCByZXNvdXJjZSBpcyBhIEdQVS5cbiAqL1xuUmVzb3VyY2VSZXF1aXJlbWVudHM/OiBSZXNvdXJjZVJlcXVpcmVtZW50W11cbi8qKlxuICogQSBsaXN0IG9mIGZpbGVzIGNvbnRhaW5pbmcgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBwYXNzIHRvIGEgY29udGFpbmVyLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIHRoZSBgYC0tZW52LWZpbGVgYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi5cbiAqICBZb3UgY2FuIHNwZWNpZnkgdXAgdG8gdGVuIGVudmlyb25tZW50IGZpbGVzLiBUaGUgZmlsZSBtdXN0IGhhdmUgYSBgYC5lbnZgYCBmaWxlIGV4dGVuc2lvbi4gRWFjaCBsaW5lIGluIGFuIGVudmlyb25tZW50IGZpbGUgY29udGFpbnMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgaW4gYGBWQVJJQUJMRT1WQUxVRWBgIGZvcm1hdC4gTGluZXMgYmVnaW5uaW5nIHdpdGggYGAjYGAgYXJlIHRyZWF0ZWQgYXMgY29tbWVudHMgYW5kIGFyZSBpZ25vcmVkLlxuICogIElmIHRoZXJlIGFyZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgc3BlY2lmaWVkIHVzaW5nIHRoZSBgYGVudmlyb25tZW50YGAgcGFyYW1ldGVyIGluIGEgY29udGFpbmVyIGRlZmluaXRpb24sIHRoZXkgdGFrZSBwcmVjZWRlbmNlIG92ZXIgdGhlIHZhcmlhYmxlcyBjb250YWluZWQgd2l0aGluIGFuIGVudmlyb25tZW50IGZpbGUuIElmIG11bHRpcGxlIGVudmlyb25tZW50IGZpbGVzIGFyZSBzcGVjaWZpZWQgdGhhdCBjb250YWluIHRoZSBzYW1lIHZhcmlhYmxlLCB0aGV5J3JlIHByb2Nlc3NlZCBmcm9tIHRoZSB0b3AgZG93bi4gV2UgcmVjb21tZW5kIHRoYXQgeW91IHVzZSB1bmlxdWUgdmFyaWFibGUgbmFtZXMuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1NwZWNpZnlpbmcgRW52aXJvbm1lbnQgVmFyaWFibGVzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS90YXNrZGVmLWVudmZpbGVzLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuRW52aXJvbm1lbnRGaWxlcz86IEVudmlyb25tZW50RmlsZVtdXG4vKipcbiAqIFRoZSBuYW1lIG9mIGEgY29udGFpbmVyLiBJZiB5b3UncmUgbGlua2luZyBtdWx0aXBsZSBjb250YWluZXJzIHRvZ2V0aGVyIGluIGEgdGFzayBkZWZpbml0aW9uLCB0aGUgYGBuYW1lYGAgb2Ygb25lIGNvbnRhaW5lciBjYW4gYmUgZW50ZXJlZCBpbiB0aGUgYGBsaW5rc2BgIG9mIGFub3RoZXIgY29udGFpbmVyIHRvIGNvbm5lY3QgdGhlIGNvbnRhaW5lcnMuIFVwIHRvIDI1NSBsZXR0ZXJzICh1cHBlcmNhc2UgYW5kIGxvd2VyY2FzZSksIG51bWJlcnMsIHVuZGVyc2NvcmVzLCBhbmQgaHlwaGVucyBhcmUgYWxsb3dlZC4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYG5hbWVgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS1uYW1lYGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKi9cbk5hbWU6IHN0cmluZ1xuRmlyZWxlbnNDb25maWd1cmF0aW9uPzogRmlyZWxlbnNDb25maWd1cmF0aW9uXG4vKipcbiAqIEEgbGlzdCBvZiBzdHJpbmdzIHRvIHByb3ZpZGUgY3VzdG9tIGNvbmZpZ3VyYXRpb24gZm9yIG11bHRpcGxlIHNlY3VyaXR5IHN5c3RlbXMuIFRoaXMgZmllbGQgaXNuJ3QgdmFsaWQgZm9yIGNvbnRhaW5lcnMgaW4gdGFza3MgdXNpbmcgdGhlIEZhcmdhdGUgbGF1bmNoIHR5cGUuXG4gKiAgRm9yIExpbnV4IHRhc2tzIG9uIEVDMiwgdGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHVzZWQgdG8gcmVmZXJlbmNlIGN1c3RvbSBsYWJlbHMgZm9yIFNFTGludXggYW5kIEFwcEFybW9yIG11bHRpLWxldmVsIHNlY3VyaXR5IHN5c3RlbXMuXG4gKiAgRm9yIGFueSB0YXNrcyBvbiBFQzIsIHRoaXMgcGFyYW1ldGVyIGNhbiBiZSB1c2VkIHRvIHJlZmVyZW5jZSBhIGNyZWRlbnRpYWwgc3BlYyBmaWxlIHRoYXQgY29uZmlndXJlcyBhIGNvbnRhaW5lciBmb3IgQWN0aXZlIERpcmVjdG9yeSBhdXRoZW50aWNhdGlvbi4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbVXNpbmcgZ01TQXMgZm9yIFdpbmRvd3MgQ29udGFpbmVyc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvd2luZG93cy1nbXNhLmh0bWwpIGFuZCBbVXNpbmcgZ01TQXMgZm9yIExpbnV4IENvbnRhaW5lcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2xpbnV4LWdtc2EuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICogIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBTZWN1cml0eU9wdGBgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kIGFuZCB0aGUgYGAtLXNlY3VyaXR5LW9wdGBgIG9wdGlvbiB0byBkb2NrZXIgcnVuLlxuICogICBUaGUgQW1hem9uIEVDUyBjb250YWluZXIgYWdlbnQgcnVubmluZyBvbiBhIGNvbnRhaW5lciBpbnN0YW5jZSBtdXN0IHJlZ2lzdGVyIHdpdGggdGhlIGBgRUNTX1NFTElOVVhfQ0FQQUJMRT10cnVlYGAgb3IgYGBFQ1NfQVBQQVJNT1JfQ0FQQUJMRT10cnVlYGAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGJlZm9yZSBjb250YWluZXJzIHBsYWNlZCBvbiB0aGF0IGluc3RhbmNlIGNhbiB1c2UgdGhlc2Ugc2VjdXJpdHkgb3B0aW9ucy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQW1hem9uIEVDUyBDb250YWluZXIgQWdlbnQgQ29uZmlndXJhdGlvbl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvZWNzLWFnZW50LWNvbmZpZy5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKiAgIFZhbGlkIHZhbHVlczogXCJuby1uZXctcHJpdmlsZWdlc1wiIHwgXCJhcHBhcm1vcjpQUk9GSUxFXCIgfCBcImxhYmVsOnZhbHVlXCIgfCBcImNyZWRlbnRpYWxzcGVjOkNyZWRlbnRpYWxTcGVjRmlsZVBhdGhcIlxuICovXG5Eb2NrZXJTZWN1cml0eU9wdGlvbnM/OiBzdHJpbmdbXVxuLyoqXG4gKiBBIGxpc3Qgb2YgbmFtZXNwYWNlZCBrZXJuZWwgcGFyYW1ldGVycyB0byBzZXQgaW4gdGhlIGNvbnRhaW5lci4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYFN5c2N0bHNgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS1zeXNjdGxgYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi4gRm9yIGV4YW1wbGUsIHlvdSBjYW4gY29uZmlndXJlIGBgbmV0LmlwdjQudGNwX2tlZXBhbGl2ZV90aW1lYGAgc2V0dGluZyB0byBtYWludGFpbiBsb25nZXIgbGl2ZWQgY29ubmVjdGlvbnMuXG4gKi9cblN5c3RlbUNvbnRyb2xzPzogU3lzdGVtQ29udHJvbFtdXG4vKipcbiAqIFdoZW4gdGhpcyBwYXJhbWV0ZXIgaXMgYGB0cnVlYGAsIHlvdSBjYW4gZGVwbG95IGNvbnRhaW5lcml6ZWQgYXBwbGljYXRpb25zIHRoYXQgcmVxdWlyZSBgYHN0ZGluYGAgb3IgYSBgYHR0eWBgIHRvIGJlIGFsbG9jYXRlZC4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYE9wZW5TdGRpbmBgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kIGFuZCB0aGUgYGAtLWludGVyYWN0aXZlYGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKi9cbkludGVyYWN0aXZlPzogYm9vbGVhblxuLyoqXG4gKiBBIGxpc3Qgb2YgRE5TIHNlYXJjaCBkb21haW5zIHRoYXQgYXJlIHByZXNlbnRlZCB0byB0aGUgY29udGFpbmVyLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgRG5zU2VhcmNoYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYC0tZG5zLXNlYXJjaGBgIG9wdGlvbiB0byBkb2NrZXIgcnVuLlxuICogICBUaGlzIHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkIGZvciBXaW5kb3dzIGNvbnRhaW5lcnMuXG4gKi9cbkRuc1NlYXJjaERvbWFpbnM/OiBzdHJpbmdbXVxuLyoqXG4gKiBBIGxpc3Qgb2YgQVJOcyBpbiBTU00gb3IgQW1hem9uIFMzIHRvIGEgY3JlZGVudGlhbCBzcGVjIChgYENyZWRTcGVjYGApIGZpbGUgdGhhdCBjb25maWd1cmVzIHRoZSBjb250YWluZXIgZm9yIEFjdGl2ZSBEaXJlY3RvcnkgYXV0aGVudGljYXRpb24uIFdlIHJlY29tbWVuZCB0aGF0IHlvdSB1c2UgdGhpcyBwYXJhbWV0ZXIgaW5zdGVhZCBvZiB0aGUgYGBkb2NrZXJTZWN1cml0eU9wdGlvbnNgYC4gVGhlIG1heGltdW0gbnVtYmVyIG9mIEFSTnMgaXMgMS5cbiAqICBUaGVyZSBhcmUgdHdvIGZvcm1hdHMgZm9yIGVhY2ggQVJOLlxuICogICArIGNyZWRlbnRpYWxzcGVjZG9tYWlubGVzczpNeUFSTiBZb3UgdXNlIGNyZWRlbnRpYWxzcGVjZG9tYWlubGVzczpNeUFSTiB0byBwcm92aWRlIGEgQ3JlZFNwZWMgd2l0aCBhbiBhZGRpdGlvbmFsIHNlY3Rpb24gZm9yIGEgc2VjcmV0IGluIC4gWW91IHByb3ZpZGUgdGhlIGxvZ2luIGNyZWRlbnRpYWxzIHRvIHRoZSBkb21haW4gaW4gdGhlIHNlY3JldC4gRWFjaCB0YXNrIHRoYXQgcnVucyBvbiBhbnkgY29udGFpbmVyIGluc3RhbmNlIGNhbiBqb2luIGRpZmZlcmVudCBkb21haW5zLiBZb3UgY2FuIHVzZSB0aGlzIGZvcm1hdCB3aXRob3V0IGpvaW5pbmcgdGhlIGNvbnRhaW5lciBpbnN0YW5jZSB0byBhIGRvbWFpbi4gKyBjcmVkZW50aWFsc3BlYzpNeUFSTiBZb3UgdXNlIGNyZWRlbnRpYWxzcGVjOk15QVJOIHRvIHByb3ZpZGUgYSBDcmVkU3BlYyBmb3IgYSBzaW5nbGUgZG9tYWluLiBZb3UgbXVzdCBqb2luIHRoZSBjb250YWluZXIgaW5zdGFuY2UgdG8gdGhlIGRvbWFpbiBiZWZvcmUgeW91IHN0YXJ0IGFueSB0YXNrcyB0aGF0IHVzZSB0aGlzIHRhc2sgZGVmaW5pdGlvbi4gXG4gKiAgSW4gYm90aCBmb3JtYXRzLCByZXBsYWNlIGBgTXlBUk5gYCB3aXRoIHRoZSBBUk4gaW4gU1NNIG9yIEFtYXpvbiBTMy5cbiAqICBJZiB5b3UgcHJvdmlkZSBhIGBgY3JlZGVudGlhbHNwZWNkb21haW5sZXNzOk15QVJOYGAsIHRoZSBgYGNyZWRzcGVjYGAgbXVzdCBwcm92aWRlIGEgQVJOIGluIEFTTWxvbmcgZm9yIGEgc2VjcmV0IGNvbnRhaW5pbmcgdGhlIHVzZXJuYW1lLCBwYXNzd29yZCwgYW5kIHRoZSBkb21haW4gdG8gY29ubmVjdCB0by4gRm9yIGJldHRlciBzZWN1cml0eSwgdGhlIGluc3RhbmNlIGlzbid0IGpvaW5lZCB0byB0aGUgZG9tYWluIGZvciBkb21haW5sZXNzIGF1dGhlbnRpY2F0aW9uLiBPdGhlciBhcHBsaWNhdGlvbnMgb24gdGhlIGluc3RhbmNlIGNhbid0IHVzZSB0aGUgZG9tYWlubGVzcyBjcmVkZW50aWFscy4gWW91IGNhbiB1c2UgdGhpcyBwYXJhbWV0ZXIgdG8gcnVuIHRhc2tzIG9uIHRoZSBzYW1lIGluc3RhbmNlLCBldmVuIGl0IHRoZSB0YXNrcyBuZWVkIHRvIGpvaW4gZGlmZmVyZW50IGRvbWFpbnMuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1VzaW5nIGdNU0FzIGZvciBXaW5kb3dzIENvbnRhaW5lcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3dpbmRvd3MtZ21zYS5odG1sKSBhbmQgW1VzaW5nIGdNU0FzIGZvciBMaW51eCBDb250YWluZXJzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9saW51eC1nbXNhLmh0bWwpLlxuICovXG5DcmVkZW50aWFsU3BlY3M/OiBzdHJpbmdbXVxuLyoqXG4gKiBBIGxpc3Qgb2YgYGB1bGltaXRzYGAgdG8gc2V0IGluIHRoZSBjb250YWluZXIuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBVbGltaXRzYGAgaW4gdGhlIFtDcmVhdGUgYSBjb250YWluZXJdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9odHRwczovL2RvY3MuZG9ja2VyLmNvbS9lbmdpbmUvYXBpL3YxLjM1LyNvcGVyYXRpb24vQ29udGFpbmVyQ3JlYXRlKSBzZWN0aW9uIG9mIHRoZSBbRG9ja2VyIFJlbW90ZSBBUEldKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9odHRwczovL2RvY3MuZG9ja2VyLmNvbS9lbmdpbmUvYXBpL3YxLjM1LykgYW5kIHRoZSBgYC0tdWxpbWl0YGAgb3B0aW9uIHRvIFtkb2NrZXIgcnVuXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaHR0cHM6Ly9kb2NzLmRvY2tlci5jb20vZW5naW5lL3JlZmVyZW5jZS9ydW4vKS4gVmFsaWQgbmFtaW5nIHZhbHVlcyBhcmUgZGlzcGxheWVkIGluIHRoZSBbVWxpbWl0XShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1VsaW1pdC5odG1sKSBkYXRhIHR5cGUuIFRoaXMgcGFyYW1ldGVyIHJlcXVpcmVzIHZlcnNpb24gMS4xOCBvZiB0aGUgRG9ja2VyIFJlbW90ZSBBUEkgb3IgZ3JlYXRlciBvbiB5b3VyIGNvbnRhaW5lciBpbnN0YW5jZS4gVG8gY2hlY2sgdGhlIERvY2tlciBSZW1vdGUgQVBJIHZlcnNpb24gb24geW91ciBjb250YWluZXIgaW5zdGFuY2UsIGxvZyBpbiB0byB5b3VyIGNvbnRhaW5lciBpbnN0YW5jZSBhbmQgcnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZDogYGBzdWRvIGRvY2tlciB2ZXJzaW9uIC0tZm9ybWF0ICd7ey5TZXJ2ZXIuQVBJVmVyc2lvbn19J2BgXG4gKiAgIFRoaXMgcGFyYW1ldGVyIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIFdpbmRvd3MgY29udGFpbmVycy5cbiAqL1xuVWxpbWl0cz86IFVsaW1pdFtdXG4vKipcbiAqIFRpbWUgZHVyYXRpb24gKGluIHNlY29uZHMpIHRvIHdhaXQgYmVmb3JlIHRoZSBjb250YWluZXIgaXMgZm9yY2VmdWxseSBraWxsZWQgaWYgaXQgZG9lc24ndCBleGl0IG5vcm1hbGx5IG9uIGl0cyBvd24uXG4gKiAgRm9yIHRhc2tzIHVzaW5nIHRoZSBGYXJnYXRlIGxhdW5jaCB0eXBlLCB0aGUgdGFzayBvciBzZXJ2aWNlIHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcgcGxhdGZvcm1zOlxuICogICArICBMaW51eCBwbGF0Zm9ybSB2ZXJzaW9uIGBgMS4zLjBgYCBvciBsYXRlci5cbiAqICAgKyAgV2luZG93cyBwbGF0Zm9ybSB2ZXJzaW9uIGBgMS4wLjBgYCBvciBsYXRlci5cbiAqICAgXG4gKiAgRm9yIHRhc2tzIHRoYXQgdXNlIHRoZSBGYXJnYXRlIGxhdW5jaCB0eXBlLCB0aGUgbWF4IHN0b3AgdGltZW91dCB2YWx1ZSBpcyAxMjAgc2Vjb25kcyBhbmQgaWYgdGhlIHBhcmFtZXRlciBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiAzMCBzZWNvbmRzIGlzIHVzZWQuXG4gKiAgRm9yIHRhc2tzIHRoYXQgdXNlIHRoZSBFQzIgbGF1bmNoIHR5cGUsIGlmIHRoZSBgYHN0b3BUaW1lb3V0YGAgcGFyYW1ldGVyIGlzbid0IHNwZWNpZmllZCwgdGhlIHZhbHVlIHNldCBmb3IgdGhlIEFtYXpvbiBFQ1MgY29udGFpbmVyIGFnZW50IGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgYGBFQ1NfQ09OVEFJTkVSX1NUT1BfVElNRU9VVGBgIGlzIHVzZWQuIElmIG5laXRoZXIgdGhlIGBgc3RvcFRpbWVvdXRgYCBwYXJhbWV0ZXIgb3IgdGhlIGBgRUNTX0NPTlRBSU5FUl9TVE9QX1RJTUVPVVRgYCBhZ2VudCBjb25maWd1cmF0aW9uIHZhcmlhYmxlIGFyZSBzZXQsIHRoZW4gdGhlIGRlZmF1bHQgdmFsdWVzIG9mIDMwIHNlY29uZHMgZm9yIExpbnV4IGNvbnRhaW5lcnMgYW5kIDMwIHNlY29uZHMgb24gV2luZG93cyBjb250YWluZXJzIGFyZSB1c2VkLiBZb3VyIGNvbnRhaW5lciBpbnN0YW5jZXMgcmVxdWlyZSBhdCBsZWFzdCB2ZXJzaW9uIDEuMjYuMCBvZiB0aGUgY29udGFpbmVyIGFnZW50IHRvIHVzZSBhIGNvbnRhaW5lciBzdG9wIHRpbWVvdXQgdmFsdWUuIEhvd2V2ZXIsIHdlIHJlY29tbWVuZCB1c2luZyB0aGUgbGF0ZXN0IGNvbnRhaW5lciBhZ2VudCB2ZXJzaW9uLiBGb3IgaW5mb3JtYXRpb24gYWJvdXQgY2hlY2tpbmcgeW91ciBhZ2VudCB2ZXJzaW9uIGFuZCB1cGRhdGluZyB0byB0aGUgbGF0ZXN0IHZlcnNpb24sIHNlZSBbVXBkYXRpbmcgdGhlIEFtYXpvbiBFQ1MgQ29udGFpbmVyIEFnZW50XShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9lY3MtYWdlbnQtdXBkYXRlLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi4gSWYgeW91J3JlIHVzaW5nIGFuIEFtYXpvbiBFQ1Mtb3B0aW1pemVkIExpbnV4IEFNSSwgeW91ciBpbnN0YW5jZSBuZWVkcyBhdCBsZWFzdCB2ZXJzaW9uIDEuMjYuMC0xIG9mIHRoZSBgYGVjcy1pbml0YGAgcGFja2FnZS4gSWYgeW91ciBjb250YWluZXIgaW5zdGFuY2VzIGFyZSBsYXVuY2hlZCBmcm9tIHZlcnNpb24gYGAyMDE5MDMwMWBgIG9yIGxhdGVyLCB0aGVuIHRoZXkgY29udGFpbiB0aGUgcmVxdWlyZWQgdmVyc2lvbnMgb2YgdGhlIGNvbnRhaW5lciBhZ2VudCBhbmQgYGBlY3MtaW5pdGBgLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtBbWF6b24gRUNTLW9wdGltaXplZCBMaW51eCBBTUldKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2Vjcy1vcHRpbWl6ZWRfQU1JLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICBUaGUgdmFsaWQgdmFsdWVzIGZvciBGYXJnYXRlIGFyZSAyLTEyMCBzZWNvbmRzLlxuICovXG5TdG9wVGltZW91dD86IG51bWJlclxuLyoqXG4gKiBUaGUgd29ya2luZyBkaXJlY3RvcnkgdG8gcnVuIGNvbW1hbmRzIGluc2lkZSB0aGUgY29udGFpbmVyIGluLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgV29ya2luZ0RpcmBgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kIGFuZCB0aGUgYGAtLXdvcmtkaXJgYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi5cbiAqL1xuV29ya2luZ0RpcmVjdG9yeT86IHN0cmluZ1xuLyoqXG4gKiBUaGUgc29mdCBsaW1pdCAoaW4gTWlCKSBvZiBtZW1vcnkgdG8gcmVzZXJ2ZSBmb3IgdGhlIGNvbnRhaW5lci4gV2hlbiBzeXN0ZW0gbWVtb3J5IGlzIHVuZGVyIGhlYXZ5IGNvbnRlbnRpb24sIERvY2tlciBhdHRlbXB0cyB0byBrZWVwIHRoZSBjb250YWluZXIgbWVtb3J5IHRvIHRoaXMgc29mdCBsaW1pdC4gSG93ZXZlciwgeW91ciBjb250YWluZXIgY2FuIGNvbnN1bWUgbW9yZSBtZW1vcnkgd2hlbiBpdCBuZWVkcyB0bywgdXAgdG8gZWl0aGVyIHRoZSBoYXJkIGxpbWl0IHNwZWNpZmllZCB3aXRoIHRoZSBgYG1lbW9yeWBgIHBhcmFtZXRlciAoaWYgYXBwbGljYWJsZSksIG9yIGFsbCBvZiB0aGUgYXZhaWxhYmxlIG1lbW9yeSBvbiB0aGUgY29udGFpbmVyIGluc3RhbmNlLCB3aGljaGV2ZXIgY29tZXMgZmlyc3QuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBNZW1vcnlSZXNlcnZhdGlvbmBgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kIGFuZCB0aGUgYGAtLW1lbW9yeS1yZXNlcnZhdGlvbmBgIG9wdGlvbiB0byBkb2NrZXIgcnVuLlxuICogIElmIGEgdGFzay1sZXZlbCBtZW1vcnkgdmFsdWUgaXMgbm90IHNwZWNpZmllZCwgeW91IG11c3Qgc3BlY2lmeSBhIG5vbi16ZXJvIGludGVnZXIgZm9yIG9uZSBvciBib3RoIG9mIGBgbWVtb3J5YGAgb3IgYGBtZW1vcnlSZXNlcnZhdGlvbmBgIGluIGEgY29udGFpbmVyIGRlZmluaXRpb24uIElmIHlvdSBzcGVjaWZ5IGJvdGgsIGBgbWVtb3J5YGAgbXVzdCBiZSBncmVhdGVyIHRoYW4gYGBtZW1vcnlSZXNlcnZhdGlvbmBgLiBJZiB5b3Ugc3BlY2lmeSBgYG1lbW9yeVJlc2VydmF0aW9uYGAsIHRoZW4gdGhhdCB2YWx1ZSBpcyBzdWJ0cmFjdGVkIGZyb20gdGhlIGF2YWlsYWJsZSBtZW1vcnkgcmVzb3VyY2VzIGZvciB0aGUgY29udGFpbmVyIGluc3RhbmNlIHdoZXJlIHRoZSBjb250YWluZXIgaXMgcGxhY2VkLiBPdGhlcndpc2UsIHRoZSB2YWx1ZSBvZiBgYG1lbW9yeWBgIGlzIHVzZWQuXG4gKiAgRm9yIGV4YW1wbGUsIGlmIHlvdXIgY29udGFpbmVyIG5vcm1hbGx5IHVzZXMgMTI4IE1pQiBvZiBtZW1vcnksIGJ1dCBvY2Nhc2lvbmFsbHkgYnVyc3RzIHRvIDI1NiBNaUIgb2YgbWVtb3J5IGZvciBzaG9ydCBwZXJpb2RzIG9mIHRpbWUsIHlvdSBjYW4gc2V0IGEgYGBtZW1vcnlSZXNlcnZhdGlvbmBgIG9mIDEyOCBNaUIsIGFuZCBhIGBgbWVtb3J5YGAgaGFyZCBsaW1pdCBvZiAzMDAgTWlCLiBUaGlzIGNvbmZpZ3VyYXRpb24gd291bGQgYWxsb3cgdGhlIGNvbnRhaW5lciB0byBvbmx5IHJlc2VydmUgMTI4IE1pQiBvZiBtZW1vcnkgZnJvbSB0aGUgcmVtYWluaW5nIHJlc291cmNlcyBvbiB0aGUgY29udGFpbmVyIGluc3RhbmNlLCBidXQgYWxzbyBhbGxvdyB0aGUgY29udGFpbmVyIHRvIGNvbnN1bWUgbW9yZSBtZW1vcnkgcmVzb3VyY2VzIHdoZW4gbmVlZGVkLlxuICogIFRoZSBEb2NrZXIgMjAuMTAuMCBvciBsYXRlciBkYWVtb24gcmVzZXJ2ZXMgYSBtaW5pbXVtIG9mIDYgTWlCIG9mIG1lbW9yeSBmb3IgYSBjb250YWluZXIuIFNvLCBkb24ndCBzcGVjaWZ5IGxlc3MgdGhhbiA2IE1pQiBvZiBtZW1vcnkgZm9yIHlvdXIgY29udGFpbmVycy4gXG4gKiAgVGhlIERvY2tlciAxOS4wMy4xMy1jZSBvciBlYXJsaWVyIGRhZW1vbiByZXNlcnZlcyBhIG1pbmltdW0gb2YgNCBNaUIgb2YgbWVtb3J5IGZvciBhIGNvbnRhaW5lci4gU28sIGRvbid0IHNwZWNpZnkgbGVzcyB0aGFuIDQgTWlCIG9mIG1lbW9yeSBmb3IgeW91ciBjb250YWluZXJzLlxuICovXG5NZW1vcnlSZXNlcnZhdGlvbj86IG51bWJlclxuUmVwb3NpdG9yeUNyZWRlbnRpYWxzPzogUmVwb3NpdG9yeUNyZWRlbnRpYWxzXG4vKipcbiAqIEEgbGlzdCBvZiBob3N0bmFtZXMgYW5kIElQIGFkZHJlc3MgbWFwcGluZ3MgdG8gYXBwZW5kIHRvIHRoZSBgYC9ldGMvaG9zdHNgYCBmaWxlIG9uIHRoZSBjb250YWluZXIuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBFeHRyYUhvc3RzYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYC0tYWRkLWhvc3RgYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi5cbiAqICAgVGhpcyBwYXJhbWV0ZXIgaXNuJ3Qgc3VwcG9ydGVkIGZvciBXaW5kb3dzIGNvbnRhaW5lcnMgb3IgdGFza3MgdGhhdCB1c2UgdGhlIGBgYXdzdnBjYGAgbmV0d29yayBtb2RlLlxuICovXG5FeHRyYUhvc3RzPzogSG9zdEVudHJ5W11cbi8qKlxuICogVGhlIGhvc3RuYW1lIHRvIHVzZSBmb3IgeW91ciBjb250YWluZXIuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBIb3N0bmFtZWBgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kIGFuZCB0aGUgYGAtLWhvc3RuYW1lYGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKiAgIFRoZSBgYGhvc3RuYW1lYGAgcGFyYW1ldGVyIGlzIG5vdCBzdXBwb3J0ZWQgaWYgeW91J3JlIHVzaW5nIHRoZSBgYGF3c3ZwY2BgIG5ldHdvcmsgbW9kZS5cbiAqL1xuSG9zdG5hbWU/OiBzdHJpbmdcbkxpbnV4UGFyYW1ldGVycz86IExpbnV4UGFyYW1ldGVyc1xuLyoqXG4gKiBTcGVjaWZpZXMgd2hldGhlciBBbWF6b24gRUNTIHdpbGwgcmVzb2x2ZSB0aGUgY29udGFpbmVyIGltYWdlIHRhZyBwcm92aWRlZCBpbiB0aGUgY29udGFpbmVyIGRlZmluaXRpb24gdG8gYW4gaW1hZ2UgZGlnZXN0LiBCeSBkZWZhdWx0LCB0aGUgdmFsdWUgaXMgYGBlbmFibGVkYGAuIElmIHlvdSBzZXQgdGhlIHZhbHVlIGZvciBhIGNvbnRhaW5lciBhcyBgYGRpc2FibGVkYGAsIEFtYXpvbiBFQ1Mgd2lsbCBub3QgcmVzb2x2ZSB0aGUgcHJvdmlkZWQgY29udGFpbmVyIGltYWdlIHRhZyB0byBhIGRpZ2VzdCBhbmQgd2lsbCB1c2UgdGhlIG9yaWdpbmFsIGltYWdlIFVSSSBzcGVjaWZpZWQgaW4gdGhlIGNvbnRhaW5lciBkZWZpbml0aW9uIGZvciBkZXBsb3ltZW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBjb250YWluZXIgaW1hZ2UgcmVzb2x1dGlvbiwgc2VlIFtDb250YWluZXIgaW1hZ2UgcmVzb2x1dGlvbl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvZGVwbG95bWVudC10eXBlLWVjcy5odG1sI2RlcGxveW1lbnQtY29udGFpbmVyLWltYWdlLXN0YWJpbGl0eSkgaW4gdGhlICpBbWF6b24gRUNTIERldmVsb3BlciBHdWlkZSouXG4gKi9cblZlcnNpb25Db25zaXN0ZW5jeT86IChcImVuYWJsZWRcIiB8IFwiZGlzYWJsZWRcIilcblJlc3RhcnRQb2xpY3k/OiBSZXN0YXJ0UG9saWN5XG4vKipcbiAqIFdoZW4gdGhpcyBwYXJhbWV0ZXIgaXMgdHJ1ZSwgbmV0d29ya2luZyBpcyBvZmYgd2l0aGluIHRoZSBjb250YWluZXIuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBOZXR3b3JrRGlzYWJsZWRgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZC5cbiAqICAgVGhpcyBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZCBmb3IgV2luZG93cyBjb250YWluZXJzLlxuICovXG5EaXNhYmxlTmV0d29ya2luZz86IGJvb2xlYW5cbi8qKlxuICogV2hlbiB0aGlzIHBhcmFtZXRlciBpcyBgYHRydWVgYCwgYSBUVFkgaXMgYWxsb2NhdGVkLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgVHR5YGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYC0tdHR5YGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKi9cblBzZXVkb1Rlcm1pbmFsPzogYm9vbGVhblxuLyoqXG4gKiBUaGUgbW91bnQgcG9pbnRzIGZvciBkYXRhIHZvbHVtZXMgaW4geW91ciBjb250YWluZXIuXG4gKiAgVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYFZvbHVtZXNgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS12b2x1bWVgYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi5cbiAqICBXaW5kb3dzIGNvbnRhaW5lcnMgY2FuIG1vdW50IHdob2xlIGRpcmVjdG9yaWVzIG9uIHRoZSBzYW1lIGRyaXZlIGFzIGBgJGVudjpQcm9ncmFtRGF0YWBgLiBXaW5kb3dzIGNvbnRhaW5lcnMgY2FuJ3QgbW91bnQgZGlyZWN0b3JpZXMgb24gYSBkaWZmZXJlbnQgZHJpdmUsIGFuZCBtb3VudCBwb2ludCBjYW4ndCBiZSBhY3Jvc3MgZHJpdmVzLlxuICovXG5Nb3VudFBvaW50cz86IE1vdW50UG9pbnRbXVxuLyoqXG4gKiBUaGUgZGVwZW5kZW5jaWVzIGRlZmluZWQgZm9yIGNvbnRhaW5lciBzdGFydHVwIGFuZCBzaHV0ZG93bi4gQSBjb250YWluZXIgY2FuIGNvbnRhaW4gbXVsdGlwbGUgZGVwZW5kZW5jaWVzLiBXaGVuIGEgZGVwZW5kZW5jeSBpcyBkZWZpbmVkIGZvciBjb250YWluZXIgc3RhcnR1cCwgZm9yIGNvbnRhaW5lciBzaHV0ZG93biBpdCBpcyByZXZlcnNlZC5cbiAqICBGb3IgdGFza3MgdXNpbmcgdGhlIEVDMiBsYXVuY2ggdHlwZSwgdGhlIGNvbnRhaW5lciBpbnN0YW5jZXMgcmVxdWlyZSBhdCBsZWFzdCB2ZXJzaW9uIDEuMjYuMCBvZiB0aGUgY29udGFpbmVyIGFnZW50IHRvIHR1cm4gb24gY29udGFpbmVyIGRlcGVuZGVuY2llcy4gSG93ZXZlciwgd2UgcmVjb21tZW5kIHVzaW5nIHRoZSBsYXRlc3QgY29udGFpbmVyIGFnZW50IHZlcnNpb24uIEZvciBpbmZvcm1hdGlvbiBhYm91dCBjaGVja2luZyB5b3VyIGFnZW50IHZlcnNpb24gYW5kIHVwZGF0aW5nIHRvIHRoZSBsYXRlc3QgdmVyc2lvbiwgc2VlIFtVcGRhdGluZyB0aGUgQW1hem9uIEVDUyBDb250YWluZXIgQWdlbnRdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2Vjcy1hZ2VudC11cGRhdGUuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLiBJZiB5b3UncmUgdXNpbmcgYW4gQW1hem9uIEVDUy1vcHRpbWl6ZWQgTGludXggQU1JLCB5b3VyIGluc3RhbmNlIG5lZWRzIGF0IGxlYXN0IHZlcnNpb24gMS4yNi4wLTEgb2YgdGhlIGBgZWNzLWluaXRgYCBwYWNrYWdlLiBJZiB5b3VyIGNvbnRhaW5lciBpbnN0YW5jZXMgYXJlIGxhdW5jaGVkIGZyb20gdmVyc2lvbiBgYDIwMTkwMzAxYGAgb3IgbGF0ZXIsIHRoZW4gdGhleSBjb250YWluIHRoZSByZXF1aXJlZCB2ZXJzaW9ucyBvZiB0aGUgY29udGFpbmVyIGFnZW50IGFuZCBgYGVjcy1pbml0YGAuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0FtYXpvbiBFQ1Mtb3B0aW1pemVkIExpbnV4IEFNSV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvZWNzLW9wdGltaXplZF9BTUkuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICogIEZvciB0YXNrcyB1c2luZyB0aGUgRmFyZ2F0ZSBsYXVuY2ggdHlwZSwgdGhlIHRhc2sgb3Igc2VydmljZSByZXF1aXJlcyB0aGUgZm9sbG93aW5nIHBsYXRmb3JtczpcbiAqICAgKyAgTGludXggcGxhdGZvcm0gdmVyc2lvbiBgYDEuMy4wYGAgb3IgbGF0ZXIuXG4gKiAgICsgIFdpbmRvd3MgcGxhdGZvcm0gdmVyc2lvbiBgYDEuMC4wYGAgb3IgbGF0ZXIuXG4gKiAgIFxuICogIElmIHRoZSB0YXNrIGRlZmluaXRpb24gaXMgdXNlZCBpbiBhIGJsdWUvZ3JlZW4gZGVwbG95bWVudCB0aGF0IHVzZXMgW0FXUzo6Q29kZURlcGxveTo6RGVwbG95bWVudEdyb3VwIEJsdWVHcmVlbkRlcGxveW1lbnRDb25maWd1cmF0aW9uXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtcHJvcGVydGllcy1jb2RlZGVwbG95LWRlcGxveW1lbnRncm91cC1ibHVlZ3JlZW5kZXBsb3ltZW50Y29uZmlndXJhdGlvbi5odG1sKSwgdGhlIGBgZGVwZW5kc09uYGAgcGFyYW1ldGVyIGlzIG5vdCBzdXBwb3J0ZWQuXG4gKi9cbkRlcGVuZHNPbj86IENvbnRhaW5lckRlcGVuZGVuY3lbXVxuLyoqXG4gKiBBIGtleS92YWx1ZSBtYXAgb2YgbGFiZWxzIHRvIGFkZCB0byB0aGUgY29udGFpbmVyLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgTGFiZWxzYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYC0tbGFiZWxgYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi4gVGhpcyBwYXJhbWV0ZXIgcmVxdWlyZXMgdmVyc2lvbiAxLjE4IG9mIHRoZSBEb2NrZXIgUmVtb3RlIEFQSSBvciBncmVhdGVyIG9uIHlvdXIgY29udGFpbmVyIGluc3RhbmNlLiBUbyBjaGVjayB0aGUgRG9ja2VyIFJlbW90ZSBBUEkgdmVyc2lvbiBvbiB5b3VyIGNvbnRhaW5lciBpbnN0YW5jZSwgbG9nIGluIHRvIHlvdXIgY29udGFpbmVyIGluc3RhbmNlIGFuZCBydW4gdGhlIGZvbGxvd2luZyBjb21tYW5kOiBgYHN1ZG8gZG9ja2VyIHZlcnNpb24gLS1mb3JtYXQgJ3t7LlNlcnZlci5BUElWZXJzaW9ufX0nYGBcbiAqL1xuRG9ja2VyTGFiZWxzPzoge1xuLyoqXG4gKiBUaGlzIGludGVyZmFjZSB3YXMgcmVmZXJlbmNlZCBieSBgdW5kZWZpbmVkYCdzIEpTT04tU2NoZW1hIGRlZmluaXRpb25cbiAqIHZpYSB0aGUgYHBhdHRlcm5Qcm9wZXJ0eWAgXCIuezEsfVwiLlxuICovXG5bazogc3RyaW5nXTogc3RyaW5nXG59XG4vKipcbiAqIFRoZSBsaXN0IG9mIHBvcnQgbWFwcGluZ3MgZm9yIHRoZSBjb250YWluZXIuIFBvcnQgbWFwcGluZ3MgYWxsb3cgY29udGFpbmVycyB0byBhY2Nlc3MgcG9ydHMgb24gdGhlIGhvc3QgY29udGFpbmVyIGluc3RhbmNlIHRvIHNlbmQgb3IgcmVjZWl2ZSB0cmFmZmljLlxuICogIEZvciB0YXNrIGRlZmluaXRpb25zIHRoYXQgdXNlIHRoZSBgYGF3c3ZwY2BgIG5ldHdvcmsgbW9kZSwgeW91IHNob3VsZCBvbmx5IHNwZWNpZnkgdGhlIGBgY29udGFpbmVyUG9ydGBgLiBUaGUgYGBob3N0UG9ydGBgIGNhbiBiZSBsZWZ0IGJsYW5rIG9yIGl0IG11c3QgYmUgdGhlIHNhbWUgdmFsdWUgYXMgdGhlIGBgY29udGFpbmVyUG9ydGBgLlxuICogIFBvcnQgbWFwcGluZ3Mgb24gV2luZG93cyB1c2UgdGhlIGBgTmV0TkFUYGAgZ2F0ZXdheSBhZGRyZXNzIHJhdGhlciB0aGFuIGBgbG9jYWxob3N0YGAuIFRoZXJlIGlzIG5vIGxvb3BiYWNrIGZvciBwb3J0IG1hcHBpbmdzIG9uIFdpbmRvd3MsIHNvIHlvdSBjYW5ub3QgYWNjZXNzIGEgY29udGFpbmVyJ3MgbWFwcGVkIHBvcnQgZnJvbSB0aGUgaG9zdCBpdHNlbGYuIFxuICogIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBQb3J0QmluZGluZ3NgYCBpbiB0aGUgW0NyZWF0ZSBhIGNvbnRhaW5lcl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2h0dHBzOi8vZG9jcy5kb2NrZXIuY29tL2VuZ2luZS9hcGkvdjEuMzUvI29wZXJhdGlvbi9Db250YWluZXJDcmVhdGUpIHNlY3Rpb24gb2YgdGhlIFtEb2NrZXIgUmVtb3RlIEFQSV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2h0dHBzOi8vZG9jcy5kb2NrZXIuY29tL2VuZ2luZS9hcGkvdjEuMzUvKSBhbmQgdGhlIGBgLS1wdWJsaXNoYGAgb3B0aW9uIHRvIFtkb2NrZXIgcnVuXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaHR0cHM6Ly9kb2NzLmRvY2tlci5jb20vZW5naW5lL3JlZmVyZW5jZS9ydW4vKS4gSWYgdGhlIG5ldHdvcmsgbW9kZSBvZiBhIHRhc2sgZGVmaW5pdGlvbiBpcyBzZXQgdG8gYGBub25lYGAsIHRoZW4geW91IGNhbid0IHNwZWNpZnkgcG9ydCBtYXBwaW5ncy4gSWYgdGhlIG5ldHdvcmsgbW9kZSBvZiBhIHRhc2sgZGVmaW5pdGlvbiBpcyBzZXQgdG8gYGBob3N0YGAsIHRoZW4gaG9zdCBwb3J0cyBtdXN0IGVpdGhlciBiZSB1bmRlZmluZWQgb3IgdGhleSBtdXN0IG1hdGNoIHRoZSBjb250YWluZXIgcG9ydCBpbiB0aGUgcG9ydCBtYXBwaW5nLlxuICogICBBZnRlciBhIHRhc2sgcmVhY2hlcyB0aGUgYGBSVU5OSU5HYGAgc3RhdHVzLCBtYW51YWwgYW5kIGF1dG9tYXRpYyBob3N0IGFuZCBjb250YWluZXIgcG9ydCBhc3NpZ25tZW50cyBhcmUgdmlzaWJsZSBpbiB0aGUgKk5ldHdvcmsgQmluZGluZ3MqIHNlY3Rpb24gb2YgYSBjb250YWluZXIgZGVzY3JpcHRpb24gZm9yIGEgc2VsZWN0ZWQgdGFzayBpbiB0aGUgQW1hem9uIEVDUyBjb25zb2xlLiBUaGUgYXNzaWdubWVudHMgYXJlIGFsc28gdmlzaWJsZSBpbiB0aGUgYGBuZXR3b3JrQmluZGluZ3NgYCBzZWN0aW9uIFtEZXNjcmliZVRhc2tzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlVGFza3MuaHRtbCkgcmVzcG9uc2VzLlxuICovXG5Qb3J0TWFwcGluZ3M/OiBQb3J0TWFwcGluZ1tdXG4vKipcbiAqIFRoZSBjb21tYW5kIHRoYXQncyBwYXNzZWQgdG8gdGhlIGNvbnRhaW5lci4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYENtZGBgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kIGFuZCB0aGUgYGBDT01NQU5EYGAgcGFyYW1ldGVyIHRvIGRvY2tlciBydW4uIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBhcmd1bWVudHMsIGVhY2ggYXJndW1lbnQgaXMgYSBzZXBhcmF0ZWQgc3RyaW5nIGluIHRoZSBhcnJheS5cbiAqL1xuQ29tbWFuZD86IHN0cmluZ1tdXG4vKipcbiAqIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gcGFzcyB0byBhIGNvbnRhaW5lci4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYEVudmBgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kIGFuZCB0aGUgYGAtLWVudmBgIG9wdGlvbiB0byBkb2NrZXIgcnVuLlxuICogICBXZSBkb24ndCByZWNvbW1lbmQgdGhhdCB5b3UgdXNlIHBsYWludGV4dCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBjcmVkZW50aWFsIGRhdGEuXG4gKi9cbkVudmlyb25tZW50PzogS2V5VmFsdWVQYWlyW11cbi8qKlxuICogVGhlIGBgbGlua3NgYCBwYXJhbWV0ZXIgYWxsb3dzIGNvbnRhaW5lcnMgdG8gY29tbXVuaWNhdGUgd2l0aCBlYWNoIG90aGVyIHdpdGhvdXQgdGhlIG5lZWQgZm9yIHBvcnQgbWFwcGluZ3MuIFRoaXMgcGFyYW1ldGVyIGlzIG9ubHkgc3VwcG9ydGVkIGlmIHRoZSBuZXR3b3JrIG1vZGUgb2YgYSB0YXNrIGRlZmluaXRpb24gaXMgYGBicmlkZ2VgYC4gVGhlIGBgbmFtZTppbnRlcm5hbE5hbWVgYCBjb25zdHJ1Y3QgaXMgYW5hbG9nb3VzIHRvIGBgbmFtZTphbGlhc2BgIGluIERvY2tlciBsaW5rcy4gVXAgdG8gMjU1IGxldHRlcnMgKHVwcGVyY2FzZSBhbmQgbG93ZXJjYXNlKSwgbnVtYmVycywgdW5kZXJzY29yZXMsIGFuZCBoeXBoZW5zIGFyZSBhbGxvd2VkLi4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYExpbmtzYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYC0tbGlua2BgIG9wdGlvbiB0byBkb2NrZXIgcnVuLlxuICogICBUaGlzIHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkIGZvciBXaW5kb3dzIGNvbnRhaW5lcnMuXG4gKiAgICBDb250YWluZXJzIHRoYXQgYXJlIGNvbGxvY2F0ZWQgb24gYSBzaW5nbGUgY29udGFpbmVyIGluc3RhbmNlIG1heSBiZSBhYmxlIHRvIGNvbW11bmljYXRlIHdpdGggZWFjaCBvdGhlciB3aXRob3V0IHJlcXVpcmluZyBsaW5rcyBvciBob3N0IHBvcnQgbWFwcGluZ3MuIE5ldHdvcmsgaXNvbGF0aW9uIGlzIGFjaGlldmVkIG9uIHRoZSBjb250YWluZXIgaW5zdGFuY2UgdXNpbmcgc2VjdXJpdHkgZ3JvdXBzIGFuZCBWUEMgc2V0dGluZ3MuXG4gKi9cbkxpbmtzPzogc3RyaW5nW11cbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc2VjcmV0IHRvIGV4cG9zZSB0byB5b3VyIGNvbnRhaW5lci4gU2VjcmV0cyBjYW4gYmUgZXhwb3NlZCB0byBhIGNvbnRhaW5lciBpbiB0aGUgZm9sbG93aW5nIHdheXM6XG4gKiAgICsgIFRvIGluamVjdCBzZW5zaXRpdmUgZGF0YSBpbnRvIHlvdXIgY29udGFpbmVycyBhcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMsIHVzZSB0aGUgYGBzZWNyZXRzYGAgY29udGFpbmVyIGRlZmluaXRpb24gcGFyYW1ldGVyLlxuICogICArICBUbyByZWZlcmVuY2Ugc2Vuc2l0aXZlIGluZm9ybWF0aW9uIGluIHRoZSBsb2cgY29uZmlndXJhdGlvbiBvZiBhIGNvbnRhaW5lciwgdXNlIHRoZSBgYHNlY3JldE9wdGlvbnNgYCBjb250YWluZXIgZGVmaW5pdGlvbiBwYXJhbWV0ZXIuXG4gKiAgIFxuICogIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1NwZWNpZnlpbmcgc2Vuc2l0aXZlIGRhdGFdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3NwZWNpZnlpbmctc2Vuc2l0aXZlLWRhdGEuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlY3JldCB7XG4vKipcbiAqIFRoZSBzZWNyZXQgdG8gZXhwb3NlIHRvIHRoZSBjb250YWluZXIuIFRoZSBzdXBwb3J0ZWQgdmFsdWVzIGFyZSBlaXRoZXIgdGhlIGZ1bGwgQVJOIG9mIHRoZSBBU01sb25nIHNlY3JldCBvciB0aGUgZnVsbCBBUk4gb2YgdGhlIHBhcmFtZXRlciBpbiB0aGUgU1NNIFBhcmFtZXRlciBTdG9yZS5cbiAqICBGb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlcXVpcmUgSUFNbG9uZyBwZXJtaXNzaW9ucywgc2VlIFtSZXF1aXJlZCBJQU0gcGVybWlzc2lvbnMgZm9yIEFtYXpvbiBFQ1Mgc2VjcmV0c10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvc3BlY2lmeWluZy1zZW5zaXRpdmUtZGF0YS1zZWNyZXRzLmh0bWwjc2VjcmV0cy1pYW0pIChmb3IgU2VjcmV0cyBNYW5hZ2VyKSBvciBbUmVxdWlyZWQgSUFNIHBlcm1pc3Npb25zIGZvciBBbWF6b24gRUNTIHNlY3JldHNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3NwZWNpZnlpbmctc2Vuc2l0aXZlLWRhdGEtcGFyYW1ldGVycy5odG1sKSAoZm9yIFN5c3RlbXMgTWFuYWdlciBQYXJhbWV0ZXIgc3RvcmUpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICAgSWYgdGhlIFNTTSBQYXJhbWV0ZXIgU3RvcmUgcGFyYW1ldGVyIGV4aXN0cyBpbiB0aGUgc2FtZSBSZWdpb24gYXMgdGhlIHRhc2sgeW91J3JlIGxhdW5jaGluZywgdGhlbiB5b3UgY2FuIHVzZSBlaXRoZXIgdGhlIGZ1bGwgQVJOIG9yIG5hbWUgb2YgdGhlIHBhcmFtZXRlci4gSWYgdGhlIHBhcmFtZXRlciBleGlzdHMgaW4gYSBkaWZmZXJlbnQgUmVnaW9uLCB0aGVuIHRoZSBmdWxsIEFSTiBtdXN0IGJlIHNwZWNpZmllZC5cbiAqL1xuVmFsdWVGcm9tOiBzdHJpbmdcbi8qKlxuICogVGhlIG5hbWUgb2YgdGhlIHNlY3JldC5cbiAqL1xuTmFtZTogc3RyaW5nXG59XG4vKipcbiAqIFRoZSBjb250YWluZXIgaGVhbHRoIGNoZWNrIGNvbW1hbmQgYW5kIGFzc29jaWF0ZWQgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGZvciB0aGUgY29udGFpbmVyLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgSGVhbHRoQ2hlY2tgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgSEVBTFRIQ0hFQ0tgYCBwYXJhbWV0ZXIgb2YgZG9ja2VyIHJ1bi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIZWFsdGhDaGVjayB7XG4vKipcbiAqIEEgc3RyaW5nIGFycmF5IHJlcHJlc2VudGluZyB0aGUgY29tbWFuZCB0aGF0IHRoZSBjb250YWluZXIgcnVucyB0byBkZXRlcm1pbmUgaWYgaXQgaXMgaGVhbHRoeS4gVGhlIHN0cmluZyBhcnJheSBtdXN0IHN0YXJ0IHdpdGggYGBDTURgYCB0byBydW4gdGhlIGNvbW1hbmQgYXJndW1lbnRzIGRpcmVjdGx5LCBvciBgYENNRC1TSEVMTGBgIHRvIHJ1biB0aGUgY29tbWFuZCB3aXRoIHRoZSBjb250YWluZXIncyBkZWZhdWx0IHNoZWxsLiBcbiAqICAgV2hlbiB5b3UgdXNlIHRoZSBBV1MgTWFuYWdlbWVudCBDb25zb2xlIEpTT04gcGFuZWwsIHRoZSBDTElsb25nLCBvciB0aGUgQVBJcywgZW5jbG9zZSB0aGUgbGlzdCBvZiBjb21tYW5kcyBpbiBkb3VibGUgcXVvdGVzIGFuZCBicmFja2V0cy5cbiAqICAgYGBbIFwiQ01ELVNIRUxMXCIsIFwiY3VybCAtZiBodHRwOi8vbG9jYWxob3N0LyB8fCBleGl0IDFcIiBdYGAgXG4gKiAgWW91IGRvbid0IGluY2x1ZGUgdGhlIGRvdWJsZSBxdW90ZXMgYW5kIGJyYWNrZXRzIHdoZW4geW91IHVzZSB0aGUgQVdTIE1hbmFnZW1lbnQgQ29uc29sZS5cbiAqICAgYGBDTUQtU0hFTEwsIGN1cmwgLWYgaHR0cDovL2xvY2FsaG9zdC8gfHwgZXhpdCAxYGAgXG4gKiAgQW4gZXhpdCBjb2RlIG9mIDAgaW5kaWNhdGVzIHN1Y2Nlc3MsIGFuZCBub24temVybyBleGl0IGNvZGUgaW5kaWNhdGVzIGZhaWx1cmUuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgYGBIZWFsdGhDaGVja2BgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kLlxuICovXG5Db21tYW5kPzogc3RyaW5nW11cbi8qKlxuICogVGhlIHRpbWUgcGVyaW9kIGluIHNlY29uZHMgdG8gd2FpdCBmb3IgYSBoZWFsdGggY2hlY2sgdG8gc3VjY2VlZCBiZWZvcmUgaXQgaXMgY29uc2lkZXJlZCBhIGZhaWx1cmUuIFlvdSBtYXkgc3BlY2lmeSBiZXR3ZWVuIDIgYW5kIDYwIHNlY29uZHMuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDUuIFRoaXMgdmFsdWUgYXBwbGllcyBvbmx5IHdoZW4geW91IHNwZWNpZnkgYSBgYGNvbW1hbmRgYC5cbiAqL1xuVGltZW91dD86IG51bWJlclxuLyoqXG4gKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIHJldHJ5IGEgZmFpbGVkIGhlYWx0aCBjaGVjayBiZWZvcmUgdGhlIGNvbnRhaW5lciBpcyBjb25zaWRlcmVkIHVuaGVhbHRoeS4gWW91IG1heSBzcGVjaWZ5IGJldHdlZW4gMSBhbmQgMTAgcmV0cmllcy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMy4gVGhpcyB2YWx1ZSBhcHBsaWVzIG9ubHkgd2hlbiB5b3Ugc3BlY2lmeSBhIGBgY29tbWFuZGBgLlxuICovXG5SZXRyaWVzPzogbnVtYmVyXG4vKipcbiAqIFRoZSB0aW1lIHBlcmlvZCBpbiBzZWNvbmRzIGJldHdlZW4gZWFjaCBoZWFsdGggY2hlY2sgZXhlY3V0aW9uLiBZb3UgbWF5IHNwZWNpZnkgYmV0d2VlbiA1IGFuZCAzMDAgc2Vjb25kcy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMzAgc2Vjb25kcy4gVGhpcyB2YWx1ZSBhcHBsaWVzIG9ubHkgd2hlbiB5b3Ugc3BlY2lmeSBhIGBgY29tbWFuZGBgLlxuICovXG5JbnRlcnZhbD86IG51bWJlclxuLyoqXG4gKiBUaGUgb3B0aW9uYWwgZ3JhY2UgcGVyaW9kIHRvIHByb3ZpZGUgY29udGFpbmVycyB0aW1lIHRvIGJvb3RzdHJhcCBiZWZvcmUgZmFpbGVkIGhlYWx0aCBjaGVja3MgY291bnQgdG93YXJkcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgcmV0cmllcy4gWW91IGNhbiBzcGVjaWZ5IGJldHdlZW4gMCBhbmQgMzAwIHNlY29uZHMuIEJ5IGRlZmF1bHQsIHRoZSBgYHN0YXJ0UGVyaW9kYGAgaXMgb2ZmLiBUaGlzIHZhbHVlIGFwcGxpZXMgb25seSB3aGVuIHlvdSBzcGVjaWZ5IGEgYGBjb21tYW5kYGAuIFxuICogICBJZiBhIGhlYWx0aCBjaGVjayBzdWNjZWVkcyB3aXRoaW4gdGhlIGBgc3RhcnRQZXJpb2RgYCwgdGhlbiB0aGUgY29udGFpbmVyIGlzIGNvbnNpZGVyZWQgaGVhbHRoeSBhbmQgYW55IHN1YnNlcXVlbnQgZmFpbHVyZXMgY291bnQgdG93YXJkIHRoZSBtYXhpbXVtIG51bWJlciBvZiByZXRyaWVzLlxuICovXG5TdGFydFBlcmlvZD86IG51bWJlclxufVxuLyoqXG4gKiBEZXRhaWxzIG9uIGEgZGF0YSB2b2x1bWUgZnJvbSBhbm90aGVyIGNvbnRhaW5lciBpbiB0aGUgc2FtZSB0YXNrIGRlZmluaXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVm9sdW1lRnJvbSB7XG4vKipcbiAqIElmIHRoaXMgdmFsdWUgaXMgYGB0cnVlYGAsIHRoZSBjb250YWluZXIgaGFzIHJlYWQtb25seSBhY2Nlc3MgdG8gdGhlIHZvbHVtZS4gSWYgdGhpcyB2YWx1ZSBpcyBgYGZhbHNlYGAsIHRoZW4gdGhlIGNvbnRhaW5lciBjYW4gd3JpdGUgdG8gdGhlIHZvbHVtZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYGBmYWxzZWBgLlxuICovXG5SZWFkT25seT86IGJvb2xlYW5cbi8qKlxuICogVGhlIG5hbWUgb2YgYW5vdGhlciBjb250YWluZXIgd2l0aGluIHRoZSBzYW1lIHRhc2sgZGVmaW5pdGlvbiB0byBtb3VudCB2b2x1bWVzIGZyb20uXG4gKi9cblNvdXJjZUNvbnRhaW5lcj86IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgbG9nIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWNhdGlvbiBmb3IgdGhlIGNvbnRhaW5lci5cbiAqICBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgTG9nQ29uZmlnYGAgaW4gdGhlIGRvY2tlciBDcmVhdGUgYSBjb250YWluZXIgY29tbWFuZCBhbmQgdGhlIGBgLS1sb2ctZHJpdmVyYGAgb3B0aW9uIHRvIGRvY2tlciBydW4uIEJ5IGRlZmF1bHQsIGNvbnRhaW5lcnMgdXNlIHRoZSBzYW1lIGxvZ2dpbmcgZHJpdmVyIHRoYXQgdGhlIERvY2tlciBkYWVtb24gdXNlcy4gSG93ZXZlciwgdGhlIGNvbnRhaW5lciBtYXkgdXNlIGEgZGlmZmVyZW50IGxvZ2dpbmcgZHJpdmVyIHRoYW4gdGhlIERvY2tlciBkYWVtb24gYnkgc3BlY2lmeWluZyBhIGxvZyBkcml2ZXIgd2l0aCB0aGlzIHBhcmFtZXRlciBpbiB0aGUgY29udGFpbmVyIGRlZmluaXRpb24uIFRvIHVzZSBhIGRpZmZlcmVudCBsb2dnaW5nIGRyaXZlciBmb3IgYSBjb250YWluZXIsIHRoZSBsb2cgc3lzdGVtIG11c3QgYmUgY29uZmlndXJlZCBwcm9wZXJseSBvbiB0aGUgY29udGFpbmVyIGluc3RhbmNlIChvciBvbiBhIGRpZmZlcmVudCBsb2cgc2VydmVyIGZvciByZW1vdGUgbG9nZ2luZyBvcHRpb25zKS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIG9wdGlvbnMgZm9yIGRpZmZlcmVudCBzdXBwb3J0ZWQgbG9nIGRyaXZlcnMsIHNlZSBbQ29uZmlndXJlIGxvZ2dpbmcgZHJpdmVyc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2h0dHBzOi8vZG9jcy5kb2NrZXIuY29tL2VuZ2luZS9hZG1pbi9sb2dnaW5nL292ZXJ2aWV3LykgaW4gdGhlIERvY2tlciBkb2N1bWVudGF0aW9uLlxuICogICBBbWF6b24gRUNTIGN1cnJlbnRseSBzdXBwb3J0cyBhIHN1YnNldCBvZiB0aGUgbG9nZ2luZyBkcml2ZXJzIGF2YWlsYWJsZSB0byB0aGUgRG9ja2VyIGRhZW1vbiAoc2hvd24gaW4gdGhlIFtMb2dDb25maWd1cmF0aW9uXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xvZ0NvbmZpZ3VyYXRpb24uaHRtbCkgZGF0YSB0eXBlKS4gQWRkaXRpb25hbCBsb2cgZHJpdmVycyBtYXkgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcyBvZiB0aGUgQW1hem9uIEVDUyBjb250YWluZXIgYWdlbnQuXG4gKiAgIFRoaXMgcGFyYW1ldGVyIHJlcXVpcmVzIHZlcnNpb24gMS4xOCBvZiB0aGUgRG9ja2VyIFJlbW90ZSBBUEkgb3IgZ3JlYXRlciBvbiB5b3VyIGNvbnRhaW5lciBpbnN0YW5jZS4gVG8gY2hlY2sgdGhlIERvY2tlciBSZW1vdGUgQVBJIHZlcnNpb24gb24geW91ciBjb250YWluZXIgaW5zdGFuY2UsIGxvZyBpbiB0byB5b3VyIGNvbnRhaW5lciBpbnN0YW5jZSBhbmQgcnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZDogYGBzdWRvIGRvY2tlciB2ZXJzaW9uIC0tZm9ybWF0ICd7ey5TZXJ2ZXIuQVBJVmVyc2lvbn19J2BgXG4gKiAgIFRoZSBBbWF6b24gRUNTIGNvbnRhaW5lciBhZ2VudCBydW5uaW5nIG9uIGEgY29udGFpbmVyIGluc3RhbmNlIG11c3QgcmVnaXN0ZXIgdGhlIGxvZ2dpbmcgZHJpdmVycyBhdmFpbGFibGUgb24gdGhhdCBpbnN0YW5jZSB3aXRoIHRoZSBgYEVDU19BVkFJTEFCTEVfTE9HR0lOR19EUklWRVJTYGAgZW52aXJvbm1lbnQgdmFyaWFibGUgYmVmb3JlIGNvbnRhaW5lcnMgcGxhY2VkIG9uIHRoYXQgaW5zdGFuY2UgY2FuIHVzZSB0aGVzZSBsb2cgY29uZmlndXJhdGlvbiBvcHRpb25zLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtDb250YWluZXIgQWdlbnQgQ29uZmlndXJhdGlvbl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvZWNzLWFnZW50LWNvbmZpZy5odG1sKSBpbiB0aGUgKkRldmVsb3BlciBHdWlkZSouXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9nQ29uZmlndXJhdGlvbiB7XG4vKipcbiAqIFRoZSBzZWNyZXRzIHRvIHBhc3MgdG8gdGhlIGxvZyBjb25maWd1cmF0aW9uLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtTcGVjaWZ5aW5nIHNlbnNpdGl2ZSBkYXRhXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9zcGVjaWZ5aW5nLXNlbnNpdGl2ZS1kYXRhLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuU2VjcmV0T3B0aW9ucz86IFNlY3JldFtdXG4vKipcbiAqIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gc2VuZCB0byB0aGUgbG9nIGRyaXZlci5cbiAqICBUaGUgb3B0aW9ucyB5b3UgY2FuIHNwZWNpZnkgZGVwZW5kIG9uIHRoZSBsb2cgZHJpdmVyLiBTb21lIG9mIHRoZSBvcHRpb25zIHlvdSBjYW4gc3BlY2lmeSB3aGVuIHlvdSB1c2UgdGhlIGBgYXdzbG9nc2BgIGxvZyBkcml2ZXIgdG8gcm91dGUgbG9ncyB0byBBbWF6b24gQ2xvdWRXYXRjaCBpbmNsdWRlIHRoZSBmb2xsb3dpbmc6XG4gKiAgICsgYXdzbG9ncy1jcmVhdGUtZ3JvdXAgUmVxdWlyZWQ6IE5vIFNwZWNpZnkgd2hldGhlciB5b3Ugd2FudCB0aGUgbG9nIGdyb3VwIHRvIGJlIGNyZWF0ZWQgYXV0b21hdGljYWxseS4gSWYgdGhpcyBvcHRpb24gaXNuJ3Qgc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byBmYWxzZS4gWW91ciBJQU0gcG9saWN5IG11c3QgaW5jbHVkZSB0aGUgbG9nczpDcmVhdGVMb2dHcm91cCBwZXJtaXNzaW9uIGJlZm9yZSB5b3UgYXR0ZW1wdCB0byB1c2UgYXdzbG9ncy1jcmVhdGUtZ3JvdXAuICsgYXdzbG9ncy1yZWdpb24gUmVxdWlyZWQ6IFllcyBTcGVjaWZ5IHRoZSBSZWdpb24gdGhhdCB0aGUgYXdzbG9ncyBsb2cgZHJpdmVyIGlzIHRvIHNlbmQgeW91ciBEb2NrZXIgbG9ncyB0by4gWW91IGNhbiBjaG9vc2UgdG8gc2VuZCBhbGwgb2YgeW91ciBsb2dzIGZyb20gY2x1c3RlcnMgaW4gZGlmZmVyZW50IFJlZ2lvbnMgdG8gYSBzaW5nbGUgcmVnaW9uIGluIENsb3VkV2F0Y2ggTG9ncy4gVGhpcyBpcyBzbyB0aGF0IHRoZXkncmUgYWxsIHZpc2libGUgaW4gb25lIGxvY2F0aW9uLiBPdGhlcndpc2UsIHlvdSBjYW4gc2VwYXJhdGUgdGhlbSBieSBSZWdpb24gZm9yIG1vcmUgZ3JhbnVsYXJpdHkuIE1ha2Ugc3VyZSB0aGF0IHRoZSBzcGVjaWZpZWQgbG9nIGdyb3VwIGV4aXN0cyBpbiB0aGUgUmVnaW9uIHRoYXQgeW91IHNwZWNpZnkgd2l0aCB0aGlzIG9wdGlvbi4gKyBhd3Nsb2dzLWdyb3VwIFJlcXVpcmVkOiBZZXMgTWFrZSBzdXJlIHRvIHNwZWNpZnkgYSBsb2cgZ3JvdXAgdGhhdCB0aGUgYXdzbG9ncyBsb2cgZHJpdmVyIHNlbmRzIGl0cyBsb2cgc3RyZWFtcyB0by4gKyBhd3Nsb2dzLXN0cmVhbS1wcmVmaXggUmVxdWlyZWQ6IFllcywgd2hlbiB1c2luZyBGYXJnYXRlLk9wdGlvbmFsIHdoZW4gdXNpbmcgRUMyLiBVc2UgdGhlIGF3c2xvZ3Mtc3RyZWFtLXByZWZpeCBvcHRpb24gdG8gYXNzb2NpYXRlIGEgbG9nIHN0cmVhbSB3aXRoIHRoZSBzcGVjaWZpZWQgcHJlZml4LCB0aGUgY29udGFpbmVyIG5hbWUsIGFuZCB0aGUgSUQgb2YgdGhlIEFtYXpvbiBFQ1MgdGFzayB0aGF0IHRoZSBjb250YWluZXIgYmVsb25ncyB0by4gSWYgeW91IHNwZWNpZnkgYSBwcmVmaXggd2l0aCB0aGlzIG9wdGlvbiwgdGhlbiB0aGUgbG9nIHN0cmVhbSB0YWtlcyB0aGUgZm9ybWF0IHByZWZpeC1uYW1lL2NvbnRhaW5lci1uYW1lL2Vjcy10YXNrLWlkLiBJZiB5b3UgZG9uJ3Qgc3BlY2lmeSBhIHByZWZpeCB3aXRoIHRoaXMgb3B0aW9uLCB0aGVuIHRoZSBsb2cgc3RyZWFtIGlzIG5hbWVkIGFmdGVyIHRoZSBjb250YWluZXIgSUQgdGhhdCdzIGFzc2lnbmVkIGJ5IHRoZSBEb2NrZXIgZGFlbW9uIG9uIHRoZSBjb250YWluZXIgaW5zdGFuY2UuIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gdHJhY2UgbG9ncyBiYWNrIHRvIHRoZSBjb250YWluZXIgdGhhdCBzZW50IHRoZW0gd2l0aCBqdXN0IHRoZSBEb2NrZXIgY29udGFpbmVyIElEICh3aGljaCBpcyBvbmx5IGF2YWlsYWJsZSBvbiB0aGUgY29udGFpbmVyIGluc3RhbmNlKSwgd2UgcmVjb21tZW5kIHRoYXQgeW91IHNwZWNpZnkgYSBwcmVmaXggd2l0aCB0aGlzIG9wdGlvbi4gRm9yIEFtYXpvbiBFQ1Mgc2VydmljZXMsIHlvdSBjYW4gdXNlIHRoZSBzZXJ2aWNlIG5hbWUgYXMgdGhlIHByZWZpeC4gRG9pbmcgc28sIHlvdSBjYW4gdHJhY2UgbG9nIHN0cmVhbXMgdG8gdGhlIHNlcnZpY2UgdGhhdCB0aGUgY29udGFpbmVyIGJlbG9uZ3MgdG8sIHRoZSBuYW1lIG9mIHRoZSBjb250YWluZXIgdGhhdCBzZW50IHRoZW0sIGFuZCB0aGUgSUQgb2YgdGhlIHRhc2sgdGhhdCB0aGUgY29udGFpbmVyIGJlbG9uZ3MgdG8uIFlvdSBtdXN0IHNwZWNpZnkgYSBzdHJlYW0tcHJlZml4IGZvciB5b3VyIGxvZ3MgdG8gaGF2ZSB5b3VyIGxvZ3MgYXBwZWFyIGluIHRoZSBMb2cgcGFuZSB3aGVuIHVzaW5nIHRoZSBBbWF6b24gRUNTIGNvbnNvbGUuICsgYXdzbG9ncy1kYXRldGltZS1mb3JtYXQgUmVxdWlyZWQ6IE5vIFRoaXMgb3B0aW9uIGRlZmluZXMgYSBtdWx0aWxpbmUgc3RhcnQgcGF0dGVybiBpbiBQeXRob24gc3RyZnRpbWUgZm9ybWF0LiBBIGxvZyBtZXNzYWdlIGNvbnNpc3RzIG9mIGEgbGluZSB0aGF0IG1hdGNoZXMgdGhlIHBhdHRlcm4gYW5kIGFueSBmb2xsb3dpbmcgbGluZXMgdGhhdCBkb27igJl0IG1hdGNoIHRoZSBwYXR0ZXJuLiBUaGUgbWF0Y2hlZCBsaW5lIGlzIHRoZSBkZWxpbWl0ZXIgYmV0d2VlbiBsb2cgbWVzc2FnZXMuIE9uZSBleGFtcGxlIG9mIGEgdXNlIGNhc2UgZm9yIHVzaW5nIHRoaXMgZm9ybWF0IGlzIGZvciBwYXJzaW5nIG91dHB1dCBzdWNoIGFzIGEgc3RhY2sgZHVtcCwgd2hpY2ggbWlnaHQgb3RoZXJ3aXNlIGJlIGxvZ2dlZCBpbiBtdWx0aXBsZSBlbnRyaWVzLiBUaGUgY29ycmVjdCBwYXR0ZXJuIGFsbG93cyBpdCB0byBiZSBjYXB0dXJlZCBpbiBhIHNpbmdsZSBlbnRyeS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBhd3Nsb2dzLWRhdGV0aW1lLWZvcm1hdC4gWW91IGNhbm5vdCBjb25maWd1cmUgYm90aCB0aGUgYXdzbG9ncy1kYXRldGltZS1mb3JtYXQgYW5kIGF3c2xvZ3MtbXVsdGlsaW5lLXBhdHRlcm4gb3B0aW9ucy4gTXVsdGlsaW5lIGxvZ2dpbmcgcGVyZm9ybXMgcmVndWxhciBleHByZXNzaW9uIHBhcnNpbmcgYW5kIG1hdGNoaW5nIG9mIGFsbCBsb2cgbWVzc2FnZXMuIFRoaXMgbWlnaHQgaGF2ZSBhIG5lZ2F0aXZlIGltcGFjdCBvbiBsb2dnaW5nIHBlcmZvcm1hbmNlLiArIGF3c2xvZ3MtbXVsdGlsaW5lLXBhdHRlcm4gUmVxdWlyZWQ6IE5vIFRoaXMgb3B0aW9uIGRlZmluZXMgYSBtdWx0aWxpbmUgc3RhcnQgcGF0dGVybiB0aGF0IHVzZXMgYSByZWd1bGFyIGV4cHJlc3Npb24uIEEgbG9nIG1lc3NhZ2UgY29uc2lzdHMgb2YgYSBsaW5lIHRoYXQgbWF0Y2hlcyB0aGUgcGF0dGVybiBhbmQgYW55IGZvbGxvd2luZyBsaW5lcyB0aGF0IGRvbuKAmXQgbWF0Y2ggdGhlIHBhdHRlcm4uIFRoZSBtYXRjaGVkIGxpbmUgaXMgdGhlIGRlbGltaXRlciBiZXR3ZWVuIGxvZyBtZXNzYWdlcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBhd3Nsb2dzLW11bHRpbGluZS1wYXR0ZXJuLiBUaGlzIG9wdGlvbiBpcyBpZ25vcmVkIGlmIGF3c2xvZ3MtZGF0ZXRpbWUtZm9ybWF0IGlzIGFsc28gY29uZmlndXJlZC4gWW91IGNhbm5vdCBjb25maWd1cmUgYm90aCB0aGUgYXdzbG9ncy1kYXRldGltZS1mb3JtYXQgYW5kIGF3c2xvZ3MtbXVsdGlsaW5lLXBhdHRlcm4gb3B0aW9ucy4gTXVsdGlsaW5lIGxvZ2dpbmcgcGVyZm9ybXMgcmVndWxhciBleHByZXNzaW9uIHBhcnNpbmcgYW5kIG1hdGNoaW5nIG9mIGFsbCBsb2cgbWVzc2FnZXMuIFRoaXMgbWlnaHQgaGF2ZSBhIG5lZ2F0aXZlIGltcGFjdCBvbiBsb2dnaW5nIHBlcmZvcm1hbmNlLiBcbiAqICBUaGUgZm9sbG93aW5nIG9wdGlvbnMgYXBwbHkgdG8gYWxsIHN1cHBvcnRlZCBsb2cgZHJpdmVycy5cbiAqICAgKyBtb2RlIFJlcXVpcmVkOiBObyBWYWxpZCB2YWx1ZXM6IG5vbi1ibG9ja2luZyB8IGJsb2NraW5nIFRoaXMgb3B0aW9uIGRlZmluZXMgdGhlIGRlbGl2ZXJ5IG1vZGUgb2YgbG9nIG1lc3NhZ2VzIGZyb20gdGhlIGNvbnRhaW5lciB0byB0aGUgbG9nIGRyaXZlciBzcGVjaWZpZWQgdXNpbmcgbG9nRHJpdmVyLiBUaGUgZGVsaXZlcnkgbW9kZSB5b3UgY2hvb3NlIGFmZmVjdHMgYXBwbGljYXRpb24gYXZhaWxhYmlsaXR5IHdoZW4gdGhlIGZsb3cgb2YgbG9ncyBmcm9tIGNvbnRhaW5lciBpcyBpbnRlcnJ1cHRlZC4gSWYgeW91IHVzZSB0aGUgYmxvY2tpbmcgbW9kZSBhbmQgdGhlIGZsb3cgb2YgbG9ncyBpcyBpbnRlcnJ1cHRlZCwgY2FsbHMgZnJvbSBjb250YWluZXIgY29kZSB0byB3cml0ZSB0byB0aGUgc3Rkb3V0IGFuZCBzdGRlcnIgc3RyZWFtcyB3aWxsIGJsb2NrLiBUaGUgbG9nZ2luZyB0aHJlYWQgb2YgdGhlIGFwcGxpY2F0aW9uIHdpbGwgYmxvY2sgYXMgYSByZXN1bHQuIFRoaXMgbWF5IGNhdXNlIHRoZSBhcHBsaWNhdGlvbiB0byBiZWNvbWUgdW5yZXNwb25zaXZlIGFuZCBsZWFkIHRvIGNvbnRhaW5lciBoZWFsdGhjaGVjayBmYWlsdXJlLiBJZiB5b3UgdXNlIHRoZSBub24tYmxvY2tpbmcgbW9kZSwgdGhlIGNvbnRhaW5lcidzIGxvZ3MgYXJlIGluc3RlYWQgc3RvcmVkIGluIGFuIGluLW1lbW9yeSBpbnRlcm1lZGlhdGUgYnVmZmVyIGNvbmZpZ3VyZWQgd2l0aCB0aGUgbWF4LWJ1ZmZlci1zaXplIG9wdGlvbi4gVGhpcyBwcmV2ZW50cyB0aGUgYXBwbGljYXRpb24gZnJvbSBiZWNvbWluZyB1bnJlc3BvbnNpdmUgd2hlbiBsb2dzIGNhbm5vdCBiZSBzZW50LiBXZSByZWNvbW1lbmQgdXNpbmcgdGhpcyBtb2RlIGlmIHlvdSB3YW50IHRvIGVuc3VyZSBzZXJ2aWNlIGF2YWlsYWJpbGl0eSBhbmQgYXJlIG9rYXkgd2l0aCBzb21lIGxvZyBsb3NzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFByZXZlbnRpbmcgbG9nIGxvc3Mgd2l0aCBub24tYmxvY2tpbmcgbW9kZSBpbiB0aGUgYXdzbG9ncyBjb250YWluZXIgbG9nIGRyaXZlci4gWW91IGNhbiBzZXQgYSBkZWZhdWx0IG1vZGUgZm9yIGFsbCBjb250YWluZXJzIGluIGEgc3BlY2lmaWMgUmVnaW9uIGJ5IHVzaW5nIHRoZSBkZWZhdWx0TG9nRHJpdmVyTW9kZSBhY2NvdW50IHNldHRpbmcuIElmIHlvdSBkb24ndCBzcGVjaWZ5IHRoZSBtb2RlIG9wdGlvbiBvciBjb25maWd1cmUgdGhlIGFjY291bnQgc2V0dGluZywgQW1hem9uIEVDUyB3aWxsIGRlZmF1bHQgdG8gdGhlIGJsb2NraW5nIG1vZGUuIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBhY2NvdW50IHNldHRpbmcsIHNlZSBEZWZhdWx0IGxvZyBkcml2ZXIgbW9kZSBpbiB0aGUgQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlLiBPbiBKdW5lIDI1LCAyMDI1LCBBbWF6b24gRUNTIGlzIGNoYW5naW5nIHRoZSBkZWZhdWx0IGxvZyBkcml2ZXIgbW9kZSBmcm9tIGJsb2NraW5nIHRvIG5vbi1ibG9ja2luZyB0byBwcmlvcml0aXplIHRhc2sgYXZhaWxhYmlsaXR5IG92ZXIgbG9nZ2luZy4gVG8gY29udGludWUgdXNpbmcgdGhlIGJsb2NraW5nIG1vZGUgYWZ0ZXIgdGhpcyBjaGFuZ2UsIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOiBTZXQgdGhlIG1vZGUgb3B0aW9uIGluIHlvdXIgY29udGFpbmVyIGRlZmluaXRpb24ncyBsb2dDb25maWd1cmF0aW9uIGFzIGJsb2NraW5nLiBTZXQgdGhlIGRlZmF1bHRMb2dEcml2ZXJNb2RlIGFjY291bnQgc2V0dGluZyB0byBibG9ja2luZy4gKyBtYXgtYnVmZmVyLXNpemUgUmVxdWlyZWQ6IE5vIERlZmF1bHQgdmFsdWU6IDFtIFdoZW4gbm9uLWJsb2NraW5nIG1vZGUgaXMgdXNlZCwgdGhlIG1heC1idWZmZXItc2l6ZSBsb2cgb3B0aW9uIGNvbnRyb2xzIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgdGhhdCdzIHVzZWQgZm9yIGludGVybWVkaWF0ZSBtZXNzYWdlIHN0b3JhZ2UuIE1ha2Ugc3VyZSB0byBzcGVjaWZ5IGFuIGFkZXF1YXRlIGJ1ZmZlciBzaXplIGJhc2VkIG9uIHlvdXIgYXBwbGljYXRpb24uIFdoZW4gdGhlIGJ1ZmZlciBmaWxscyB1cCwgZnVydGhlciBsb2dzIGNhbm5vdCBiZSBzdG9yZWQuIExvZ3MgdGhhdCBjYW5ub3QgYmUgc3RvcmVkIGFyZSBsb3N0LiBcbiAqICBUbyByb3V0ZSBsb2dzIHVzaW5nIHRoZSBgYHNwbHVua2BgIGxvZyByb3V0ZXIsIHlvdSBuZWVkIHRvIHNwZWNpZnkgYSBgYHNwbHVuay10b2tlbmBgIGFuZCBhIGBgc3BsdW5rLXVybGBgLlxuICogIFdoZW4geW91IHVzZSB0aGUgYGBhd3NmaXJlbGVuc2BgIGxvZyByb3V0ZXIgdG8gcm91dGUgbG9ncyB0byBhbiBBV1MgU2VydmljZSBvciBBV1MgUGFydG5lciBOZXR3b3JrIGRlc3RpbmF0aW9uIGZvciBsb2cgc3RvcmFnZSBhbmQgYW5hbHl0aWNzLCB5b3UgY2FuIHNldCB0aGUgYGBsb2ctZHJpdmVyLWJ1ZmZlci1saW1pdGBgIG9wdGlvbiB0byBsaW1pdCB0aGUgbnVtYmVyIG9mIGV2ZW50cyB0aGF0IGFyZSBidWZmZXJlZCBpbiBtZW1vcnksIGJlZm9yZSBiZWluZyBzZW50IHRvIHRoZSBsb2cgcm91dGVyIGNvbnRhaW5lci4gSXQgY2FuIGhlbHAgdG8gcmVzb2x2ZSBwb3RlbnRpYWwgbG9nIGxvc3MgaXNzdWUgYmVjYXVzZSBoaWdoIHRocm91Z2hwdXQgbWlnaHQgcmVzdWx0IGluIG1lbW9yeSBydW5uaW5nIG91dCBmb3IgdGhlIGJ1ZmZlciBpbnNpZGUgb2YgRG9ja2VyLlxuICogIE90aGVyIG9wdGlvbnMgeW91IGNhbiBzcGVjaWZ5IHdoZW4gdXNpbmcgYGBhd3NmaXJlbGVuc2BgIHRvIHJvdXRlIGxvZ3MgZGVwZW5kIG9uIHRoZSBkZXN0aW5hdGlvbi4gV2hlbiB5b3UgZXhwb3J0IGxvZ3MgdG8gQW1hem9uIERhdGEgRmlyZWhvc2UsIHlvdSBjYW4gc3BlY2lmeSB0aGUgQVdTIFJlZ2lvbiB3aXRoIGBgcmVnaW9uYGAgYW5kIGEgbmFtZSBmb3IgdGhlIGxvZyBzdHJlYW0gd2l0aCBgYGRlbGl2ZXJ5X3N0cmVhbWBgLlxuICogIFdoZW4geW91IGV4cG9ydCBsb2dzIHRvIEFtYXpvbiBLaW5lc2lzIERhdGEgU3RyZWFtcywgeW91IGNhbiBzcGVjaWZ5IGFuIEFXUyBSZWdpb24gd2l0aCBgYHJlZ2lvbmBgIGFuZCBhIGRhdGEgc3RyZWFtIG5hbWUgd2l0aCBgYHN0cmVhbWBgLlxuICogICBXaGVuIHlvdSBleHBvcnQgbG9ncyB0byBBbWF6b24gT3BlblNlYXJjaCBTZXJ2aWNlLCB5b3UgY2FuIHNwZWNpZnkgb3B0aW9ucyBsaWtlIGBgTmFtZWBgLCBgYEhvc3RgYCAoT3BlblNlYXJjaCBTZXJ2aWNlIGVuZHBvaW50IHdpdGhvdXQgcHJvdG9jb2wpLCBgYFBvcnRgYCwgYGBJbmRleGBgLCBgYFR5cGVgYCwgYGBBd3NfYXV0aGBgLCBgYEF3c19yZWdpb25gYCwgYGBTdXBwcmVzc19UeXBlX05hbWVgYCwgYW5kIGBgdGxzYGAuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1VuZGVyIHRoZSBob29kOiBGaXJlTGVucyBmb3IgQW1hem9uIEVDUyBUYXNrc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NvbnRhaW5lcnMvdW5kZXItdGhlLWhvb2QtZmlyZWxlbnMtZm9yLWFtYXpvbi1lY3MtdGFza3MvKS5cbiAqICBXaGVuIHlvdSBleHBvcnQgbG9ncyB0byBBbWF6b24gUzMsIHlvdSBjYW4gc3BlY2lmeSB0aGUgYnVja2V0IHVzaW5nIHRoZSBgYGJ1Y2tldGBgIG9wdGlvbi4gWW91IGNhbiBhbHNvIHNwZWNpZnkgYGByZWdpb25gYCwgYGB0b3RhbF9maWxlX3NpemVgYCwgYGB1cGxvYWRfdGltZW91dGBgLCBhbmQgYGB1c2VfcHV0X29iamVjdGBgIGFzIG9wdGlvbnMuXG4gKiAgVGhpcyBwYXJhbWV0ZXIgcmVxdWlyZXMgdmVyc2lvbiAxLjE5IG9mIHRoZSBEb2NrZXIgUmVtb3RlIEFQSSBvciBncmVhdGVyIG9uIHlvdXIgY29udGFpbmVyIGluc3RhbmNlLiBUbyBjaGVjayB0aGUgRG9ja2VyIFJlbW90ZSBBUEkgdmVyc2lvbiBvbiB5b3VyIGNvbnRhaW5lciBpbnN0YW5jZSwgbG9nIGluIHRvIHlvdXIgY29udGFpbmVyIGluc3RhbmNlIGFuZCBydW4gdGhlIGZvbGxvd2luZyBjb21tYW5kOiBgYHN1ZG8gZG9ja2VyIHZlcnNpb24gLS1mb3JtYXQgJ3t7LlNlcnZlci5BUElWZXJzaW9ufX0nYGBcbiAqL1xuT3B0aW9ucz86IHtcbi8qKlxuICogVGhpcyBpbnRlcmZhY2Ugd2FzIHJlZmVyZW5jZWQgYnkgYHVuZGVmaW5lZGAncyBKU09OLVNjaGVtYSBkZWZpbml0aW9uXG4gKiB2aWEgdGhlIGBwYXR0ZXJuUHJvcGVydHlgIFwiLnsxLH1cIi5cbiAqL1xuW2s6IHN0cmluZ106IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgbG9nIGRyaXZlciB0byB1c2UgZm9yIHRoZSBjb250YWluZXIuXG4gKiAgRm9yIHRhc2tzIG9uIEZBUkdBVEVsb25nLCB0aGUgc3VwcG9ydGVkIGxvZyBkcml2ZXJzIGFyZSBgYGF3c2xvZ3NgYCwgYGBzcGx1bmtgYCwgYW5kIGBgYXdzZmlyZWxlbnNgYC5cbiAqICBGb3IgdGFza3MgaG9zdGVkIG9uIEFtYXpvbiBFQzIgaW5zdGFuY2VzLCB0aGUgc3VwcG9ydGVkIGxvZyBkcml2ZXJzIGFyZSBgYGF3c2xvZ3NgYCwgYGBmbHVlbnRkYGAsIGBgZ2VsZmBgLCBgYGpzb24tZmlsZWBgLCBgYGpvdXJuYWxkYGAsIGBgc3lzbG9nYGAsIGBgc3BsdW5rYGAsIGFuZCBgYGF3c2ZpcmVsZW5zYGAuXG4gKiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdXNpbmcgdGhlIGBgYXdzbG9nc2BgIGxvZyBkcml2ZXIsIHNlZSBbU2VuZCBBbWF6b24gRUNTIGxvZ3MgdG8gQ2xvdWRXYXRjaF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvdXNpbmdfYXdzbG9ncy5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdXNpbmcgdGhlIGBgYXdzZmlyZWxlbnNgYCBsb2cgZHJpdmVyLCBzZWUgW1NlbmQgQW1hem9uIEVDUyBsb2dzIHRvIGFuIHNlcnZpY2Ugb3IgUGFydG5lcl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvdXNpbmdfZmlyZWxlbnMuaHRtbCkuXG4gKiAgIElmIHlvdSBoYXZlIGEgY3VzdG9tIGRyaXZlciB0aGF0IGlzbid0IGxpc3RlZCwgeW91IGNhbiBmb3JrIHRoZSBBbWF6b24gRUNTIGNvbnRhaW5lciBhZ2VudCBwcm9qZWN0IHRoYXQncyBbYXZhaWxhYmxlIG9uIEdpdEh1Yl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2h0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYW1hem9uLWVjcy1hZ2VudCkgYW5kIGN1c3RvbWl6ZSBpdCB0byB3b3JrIHdpdGggdGhhdCBkcml2ZXIuIFdlIGVuY291cmFnZSB5b3UgdG8gc3VibWl0IHB1bGwgcmVxdWVzdHMgZm9yIGNoYW5nZXMgdGhhdCB5b3Ugd291bGQgbGlrZSB0byBoYXZlIGluY2x1ZGVkLiBIb3dldmVyLCB3ZSBkb24ndCBjdXJyZW50bHkgcHJvdmlkZSBzdXBwb3J0IGZvciBydW5uaW5nIG1vZGlmaWVkIGNvcGllcyBvZiB0aGlzIHNvZnR3YXJlLlxuICovXG5Mb2dEcml2ZXI6IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgdHlwZSBhbmQgYW1vdW50IG9mIGEgcmVzb3VyY2UgdG8gYXNzaWduIHRvIGEgY29udGFpbmVyLiBUaGUgc3VwcG9ydGVkIHJlc291cmNlIHR5cGVzIGFyZSBHUFVzIGFuZCBFbGFzdGljIEluZmVyZW5jZSBhY2NlbGVyYXRvcnMuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1dvcmtpbmcgd2l0aCBHUFVzIG9uIEFtYXpvbiBFQ1NdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2Vjcy1ncHUuaHRtbCkgb3IgW1dvcmtpbmcgd2l0aCBBbWF6b24gRWxhc3RpYyBJbmZlcmVuY2Ugb24gQW1hem9uIEVDU10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvZWNzLWluZmVyZW5jZS5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSpcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvdXJjZVJlcXVpcmVtZW50IHtcbi8qKlxuICogVGhlIHR5cGUgb2YgcmVzb3VyY2UgdG8gYXNzaWduIHRvIGEgY29udGFpbmVyLlxuICovXG5UeXBlOiBzdHJpbmdcbi8qKlxuICogVGhlIHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlIHR5cGUuXG4gKiAgV2hlbiB0aGUgdHlwZSBpcyBgYEdQVWBgLCB0aGUgdmFsdWUgaXMgdGhlIG51bWJlciBvZiBwaHlzaWNhbCBgYEdQVXNgYCB0aGUgQW1hem9uIEVDUyBjb250YWluZXIgYWdlbnQgcmVzZXJ2ZXMgZm9yIHRoZSBjb250YWluZXIuIFRoZSBudW1iZXIgb2YgR1BVcyB0aGF0J3MgcmVzZXJ2ZWQgZm9yIGFsbCBjb250YWluZXJzIGluIGEgdGFzayBjYW4ndCBleGNlZWQgdGhlIG51bWJlciBvZiBhdmFpbGFibGUgR1BVcyBvbiB0aGUgY29udGFpbmVyIGluc3RhbmNlIHRoYXQgdGhlIHRhc2sgaXMgbGF1bmNoZWQgb24uXG4gKiAgV2hlbiB0aGUgdHlwZSBpcyBgYEluZmVyZW5jZUFjY2VsZXJhdG9yYGAsIHRoZSBgYHZhbHVlYGAgbWF0Y2hlcyB0aGUgYGBkZXZpY2VOYW1lYGAgZm9yIGFuIFtJbmZlcmVuY2VBY2NlbGVyYXRvcl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9JbmZlcmVuY2VBY2NlbGVyYXRvci5odG1sKSBzcGVjaWZpZWQgaW4gYSB0YXNrIGRlZmluaXRpb24uXG4gKi9cblZhbHVlOiBzdHJpbmdcbn1cbi8qKlxuICogQSBsaXN0IG9mIGZpbGVzIGNvbnRhaW5pbmcgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBwYXNzIHRvIGEgY29udGFpbmVyLiBZb3UgY2FuIHNwZWNpZnkgdXAgdG8gdGVuIGVudmlyb25tZW50IGZpbGVzLiBUaGUgZmlsZSBtdXN0IGhhdmUgYSBgYC5lbnZgYCBmaWxlIGV4dGVuc2lvbi4gRWFjaCBsaW5lIGluIGFuIGVudmlyb25tZW50IGZpbGUgc2hvdWxkIGNvbnRhaW4gYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgaW4gYGBWQVJJQUJMRT1WQUxVRWBgIGZvcm1hdC4gTGluZXMgYmVnaW5uaW5nIHdpdGggYGAjYGAgYXJlIHRyZWF0ZWQgYXMgY29tbWVudHMgYW5kIGFyZSBpZ25vcmVkLlxuICogIElmIHRoZXJlIGFyZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgc3BlY2lmaWVkIHVzaW5nIHRoZSBgYGVudmlyb25tZW50YGAgcGFyYW1ldGVyIGluIGEgY29udGFpbmVyIGRlZmluaXRpb24sIHRoZXkgdGFrZSBwcmVjZWRlbmNlIG92ZXIgdGhlIHZhcmlhYmxlcyBjb250YWluZWQgd2l0aGluIGFuIGVudmlyb25tZW50IGZpbGUuIElmIG11bHRpcGxlIGVudmlyb25tZW50IGZpbGVzIGFyZSBzcGVjaWZpZWQgdGhhdCBjb250YWluIHRoZSBzYW1lIHZhcmlhYmxlLCB0aGV5J3JlIHByb2Nlc3NlZCBmcm9tIHRoZSB0b3AgZG93bi4gV2UgcmVjb21tZW5kIHRoYXQgeW91IHVzZSB1bmlxdWUgdmFyaWFibGUgbmFtZXMuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1VzZSBhIGZpbGUgdG8gcGFzcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gYSBjb250YWluZXJdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3VzZS1lbnZpcm9ubWVudC1maWxlLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICBFbnZpcm9ubWVudCB2YXJpYWJsZSBmaWxlcyBhcmUgb2JqZWN0cyBpbiBBbWF6b24gUzMgYW5kIGFsbCBBbWF6b24gUzMgc2VjdXJpdHkgY29uc2lkZXJhdGlvbnMgYXBwbHkuIFxuICogIFlvdSBtdXN0IHVzZSB0aGUgZm9sbG93aW5nIHBsYXRmb3JtcyBmb3IgdGhlIEZhcmdhdGUgbGF1bmNoIHR5cGU6XG4gKiAgICsgIExpbnV4IHBsYXRmb3JtIHZlcnNpb24gYGAxLjQuMGBgIG9yIGxhdGVyLlxuICogICArICBXaW5kb3dzIHBsYXRmb3JtIHZlcnNpb24gYGAxLjAuMGBgIG9yIGxhdGVyLlxuICogICBcbiAqICBDb25zaWRlciB0aGUgZm9sbG93aW5nIHdoZW4gdXNpbmcgdGhlIEZhcmdhdGUgbGF1bmNoIHR5cGU6XG4gKiAgICsgIFRoZSBmaWxlIGlzIGhhbmRsZWQgbGlrZSBhIG5hdGl2ZSBEb2NrZXIgZW52LWZpbGUuXG4gKiAgICsgIFRoZXJlIGlzIG5vIHN1cHBvcnQgZm9yIHNoZWxsIGVzY2FwZSBoYW5kbGluZy5cbiAqICAgKyAgVGhlIGNvbnRhaW5lciBlbnRyeSBwb2ludCBpbnRlcnBlcnRzIHRoZSBgYFZBUklBQkxFYGAgdmFsdWVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudmlyb25tZW50RmlsZSB7XG4vKipcbiAqIFRoZSBmaWxlIHR5cGUgdG8gdXNlLiBFbnZpcm9ubWVudCBmaWxlcyBhcmUgb2JqZWN0cyBpbiBBbWF6b24gUzMuIFRoZSBvbmx5IHN1cHBvcnRlZCB2YWx1ZSBpcyBgYHMzYGAuXG4gKi9cblR5cGU/OiBzdHJpbmdcbi8qKlxuICogVGhlIEFtYXpvbiBSZXNvdXJjZSBOYW1lIChBUk4pIG9mIHRoZSBBbWF6b24gUzMgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGZpbGUuXG4gKi9cblZhbHVlPzogc3RyaW5nXG59XG4vKipcbiAqIFRoZSBGaXJlTGVucyBjb25maWd1cmF0aW9uIGZvciB0aGUgY29udGFpbmVyLiBUaGlzIGlzIHVzZWQgdG8gc3BlY2lmeSBhbmQgY29uZmlndXJlIGEgbG9nIHJvdXRlciBmb3IgY29udGFpbmVyIGxvZ3MuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0N1c3RvbSBMb2cgUm91dGluZ10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvdXNpbmdfZmlyZWxlbnMuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpcmVsZW5zQ29uZmlndXJhdGlvbiB7XG4vKipcbiAqIFRoZSBvcHRpb25zIHRvIHVzZSB3aGVuIGNvbmZpZ3VyaW5nIHRoZSBsb2cgcm91dGVyLiBUaGlzIGZpZWxkIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgdXNlZCB0byBhZGQgYWRkaXRpb25hbCBtZXRhZGF0YSwgc3VjaCBhcyB0aGUgdGFzaywgdGFzayBkZWZpbml0aW9uLCBjbHVzdGVyLCBhbmQgY29udGFpbmVyIGluc3RhbmNlIGRldGFpbHMgdG8gdGhlIGxvZyBldmVudC5cbiAqICAgSWYgc3BlY2lmaWVkLCB2YWxpZCBvcHRpb24ga2V5cyBhcmU6XG4gKiAgICsgIGBgZW5hYmxlLWVjcy1sb2ctbWV0YWRhdGFgYCwgd2hpY2ggY2FuIGJlIGBgdHJ1ZWBgIG9yIGBgZmFsc2VgYFxuICogICArICBgYGNvbmZpZy1maWxlLXR5cGVgYCwgd2hpY2ggY2FuIGJlIGBgczNgYCBvciBgYGZpbGVgYFxuICogICArICBgYGNvbmZpZy1maWxlLXZhbHVlYGAsIHdoaWNoIGlzIGVpdGhlciBhbiBTMyBBUk4gb3IgYSBmaWxlIHBhdGhcbiAqL1xuT3B0aW9ucz86IHtcbi8qKlxuICogVGhpcyBpbnRlcmZhY2Ugd2FzIHJlZmVyZW5jZWQgYnkgYHVuZGVmaW5lZGAncyBKU09OLVNjaGVtYSBkZWZpbml0aW9uXG4gKiB2aWEgdGhlIGBwYXR0ZXJuUHJvcGVydHlgIFwiLnsxLH1cIi5cbiAqL1xuW2s6IHN0cmluZ106IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgbG9nIHJvdXRlciB0byB1c2UuIFRoZSB2YWxpZCB2YWx1ZXMgYXJlIGBgZmx1ZW50ZGBgIG9yIGBgZmx1ZW50Yml0YGAuXG4gKi9cblR5cGU/OiBzdHJpbmdcbn1cbi8qKlxuICogQSBsaXN0IG9mIG5hbWVzcGFjZWQga2VybmVsIHBhcmFtZXRlcnMgdG8gc2V0IGluIHRoZSBjb250YWluZXIuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBTeXNjdGxzYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYC0tc3lzY3RsYGAgb3B0aW9uIHRvIGRvY2tlciBydW4uIEZvciBleGFtcGxlLCB5b3UgY2FuIGNvbmZpZ3VyZSBgYG5ldC5pcHY0LnRjcF9rZWVwYWxpdmVfdGltZWBgIHNldHRpbmcgdG8gbWFpbnRhaW4gbG9uZ2VyIGxpdmVkIGNvbm5lY3Rpb25zLlxuICogIFdlIGRvbid0IHJlY29tbWVuZCB0aGF0IHlvdSBzcGVjaWZ5IG5ldHdvcmstcmVsYXRlZCBgYHN5c3RlbUNvbnRyb2xzYGAgcGFyYW1ldGVycyBmb3IgbXVsdGlwbGUgY29udGFpbmVycyBpbiBhIHNpbmdsZSB0YXNrIHRoYXQgYWxzbyB1c2VzIGVpdGhlciB0aGUgYGBhd3N2cGNgYCBvciBgYGhvc3RgYCBuZXR3b3JrIG1vZGUuIERvaW5nIHRoaXMgaGFzIHRoZSBmb2xsb3dpbmcgZGlzYWR2YW50YWdlczpcbiAqICAgKyAgRm9yIHRhc2tzIHRoYXQgdXNlIHRoZSBgYGF3c3ZwY2BgIG5ldHdvcmsgbW9kZSBpbmNsdWRpbmcgRmFyZ2F0ZSwgaWYgeW91IHNldCBgYHN5c3RlbUNvbnRyb2xzYGAgZm9yIGFueSBjb250YWluZXIsIGl0IGFwcGxpZXMgdG8gYWxsIGNvbnRhaW5lcnMgaW4gdGhlIHRhc2suIElmIHlvdSBzZXQgZGlmZmVyZW50IGBgc3lzdGVtQ29udHJvbHNgYCBmb3IgbXVsdGlwbGUgY29udGFpbmVycyBpbiBhIHNpbmdsZSB0YXNrLCB0aGUgY29udGFpbmVyIHRoYXQncyBzdGFydGVkIGxhc3QgZGV0ZXJtaW5lcyB3aGljaCBgYHN5c3RlbUNvbnRyb2xzYGAgdGFrZSBlZmZlY3QuXG4gKiAgICsgIEZvciB0YXNrcyB0aGF0IHVzZSB0aGUgYGBob3N0YGAgbmV0d29yayBtb2RlLCB0aGUgbmV0d29yayBuYW1lc3BhY2UgYGBzeXN0ZW1Db250cm9sc2BgIGFyZW4ndCBzdXBwb3J0ZWQuXG4gKiAgIFxuICogIElmIHlvdSdyZSBzZXR0aW5nIGFuIElQQyByZXNvdXJjZSBuYW1lc3BhY2UgdG8gdXNlIGZvciB0aGUgY29udGFpbmVycyBpbiB0aGUgdGFzaywgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFwcGx5IHRvIHlvdXIgc3lzdGVtIGNvbnRyb2xzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtJUEMgbW9kZV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvdGFza19kZWZpbml0aW9uX3BhcmFtZXRlcnMuaHRtbCN0YXNrX2RlZmluaXRpb25faXBjbW9kZSkuXG4gKiAgICsgIEZvciB0YXNrcyB0aGF0IHVzZSB0aGUgYGBob3N0YGAgSVBDIG1vZGUsIElQQyBuYW1lc3BhY2UgYGBzeXN0ZW1Db250cm9sc2BgIGFyZW4ndCBzdXBwb3J0ZWQuXG4gKiAgICsgIEZvciB0YXNrcyB0aGF0IHVzZSB0aGUgYGB0YXNrYGAgSVBDIG1vZGUsIElQQyBuYW1lc3BhY2UgYGBzeXN0ZW1Db250cm9sc2BgIHZhbHVlcyBhcHBseSB0byBhbGwgY29udGFpbmVycyB3aXRoaW4gYSB0YXNrLlxuICogICBcbiAqICAgVGhpcyBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZCBmb3IgV2luZG93cyBjb250YWluZXJzLlxuICogICAgVGhpcyBwYXJhbWV0ZXIgaXMgb25seSBzdXBwb3J0ZWQgZm9yIHRhc2tzIHRoYXQgYXJlIGhvc3RlZCBvbiBGQVJHQVRFbG9uZyBpZiB0aGUgdGFza3MgYXJlIHVzaW5nIHBsYXRmb3JtIHZlcnNpb24gYGAxLjQuMGBgIG9yIGxhdGVyIChMaW51eCkuIFRoaXMgaXNuJ3Qgc3VwcG9ydGVkIGZvciBXaW5kb3dzIGNvbnRhaW5lcnMgb24gRmFyZ2F0ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTeXN0ZW1Db250cm9sIHtcbi8qKlxuICogVGhlIG5hbWVzcGFjZWQga2VybmVsIHBhcmFtZXRlciB0byBzZXQgYSBgYHZhbHVlYGAgZm9yLlxuICogIFZhbGlkIElQQyBuYW1lc3BhY2UgdmFsdWVzOiBgYFwia2VybmVsLm1zZ21heFwiIHwgXCJrZXJuZWwubXNnbW5iXCIgfCBcImtlcm5lbC5tc2dtbmlcIiB8IFwia2VybmVsLnNlbVwiIHwgXCJrZXJuZWwuc2htYWxsXCIgfCBcImtlcm5lbC5zaG1tYXhcIiB8IFwia2VybmVsLnNobW1uaVwiIHwgXCJrZXJuZWwuc2htX3JtaWRfZm9yY2VkXCJgYCwgYW5kIGBgU3lzY3Rsc2BgIHRoYXQgc3RhcnQgd2l0aCBgYFwiZnMubXF1ZXVlLipcImBgXG4gKiAgVmFsaWQgbmV0d29yayBuYW1lc3BhY2UgdmFsdWVzOiBgYFN5c2N0bHNgYCB0aGF0IHN0YXJ0IHdpdGggYGBcIm5ldC4qXCJgYC4gT25seSBuYW1lc3BhY2VkIGBgU3lzY3Rsc2BgIHRoYXQgZXhpc3Qgd2l0aGluIHRoZSBjb250YWluZXIgc3RhcnRpbmcgd2l0aCBcIm5ldC4qIGFyZSBhY2NlcHRlZC5cbiAqICBBbGwgb2YgdGhlc2UgdmFsdWVzIGFyZSBzdXBwb3J0ZWQgYnkgRmFyZ2F0ZS5cbiAqL1xuVmFsdWU/OiBzdHJpbmdcbi8qKlxuICogVGhlIG5hbWVzcGFjZWQga2VybmVsIHBhcmFtZXRlciB0byBzZXQgYSBgYHZhbHVlYGAgZm9yLlxuICovXG5OYW1lc3BhY2U/OiBzdHJpbmdcbn1cbi8qKlxuICogVGhlIGBgdWxpbWl0YGAgc2V0dGluZ3MgdG8gcGFzcyB0byB0aGUgY29udGFpbmVyLlxuICogIEFtYXpvbiBFQ1MgdGFza3MgaG9zdGVkIG9uIEZBUkdBVEVsb25nIHVzZSB0aGUgZGVmYXVsdCByZXNvdXJjZSBsaW1pdCB2YWx1ZXMgc2V0IGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUgYGBub2ZpbGVgYCByZXNvdXJjZSBsaW1pdCBwYXJhbWV0ZXIgd2hpY2ggRkFSR0FURWxvbmcgb3ZlcnJpZGVzLiBUaGUgYGBub2ZpbGVgYCByZXNvdXJjZSBsaW1pdCBzZXRzIGEgcmVzdHJpY3Rpb24gb24gdGhlIG51bWJlciBvZiBvcGVuIGZpbGVzIHRoYXQgYSBjb250YWluZXIgY2FuIHVzZS4gVGhlIGRlZmF1bHQgYGBub2ZpbGVgYCBzb2Z0IGxpbWl0IGlzIGBgNjU1MzVgYCBhbmQgdGhlIGRlZmF1bHQgaGFyZCBsaW1pdCBpcyBgYDY1NTM1YGAuXG4gKiAgWW91IGNhbiBzcGVjaWZ5IHRoZSBgYHVsaW1pdGBgIHNldHRpbmdzIGZvciBhIGNvbnRhaW5lciBpbiBhIHRhc2sgZGVmaW5pdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVbGltaXQge1xuLyoqXG4gKiBUaGUgc29mdCBsaW1pdCBmb3IgdGhlIGBgdWxpbWl0YGAgdHlwZS4gVGhlIHZhbHVlIGNhbiBiZSBzcGVjaWZpZWQgaW4gYnl0ZXMsIHNlY29uZHMsIG9yIGFzIGEgY291bnQsIGRlcGVuZGluZyBvbiB0aGUgYGB0eXBlYGAgb2YgdGhlIGBgdWxpbWl0YGAuXG4gKi9cblNvZnRMaW1pdDogbnVtYmVyXG4vKipcbiAqIFRoZSBoYXJkIGxpbWl0IGZvciB0aGUgYGB1bGltaXRgYCB0eXBlLiBUaGUgdmFsdWUgY2FuIGJlIHNwZWNpZmllZCBpbiBieXRlcywgc2Vjb25kcywgb3IgYXMgYSBjb3VudCwgZGVwZW5kaW5nIG9uIHRoZSBgYHR5cGVgYCBvZiB0aGUgYGB1bGltaXRgYC5cbiAqL1xuSGFyZExpbWl0OiBudW1iZXJcbi8qKlxuICogVGhlIGBgdHlwZWBgIG9mIHRoZSBgYHVsaW1pdGBgLlxuICovXG5OYW1lOiBzdHJpbmdcbn1cbi8qKlxuICogVGhlIHByaXZhdGUgcmVwb3NpdG9yeSBhdXRoZW50aWNhdGlvbiBjcmVkZW50aWFscyB0byB1c2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVwb3NpdG9yeUNyZWRlbnRpYWxzIHtcbi8qKlxuICogVGhlIEFtYXpvbiBSZXNvdXJjZSBOYW1lIChBUk4pIG9mIHRoZSBzZWNyZXQgY29udGFpbmluZyB0aGUgcHJpdmF0ZSByZXBvc2l0b3J5IGNyZWRlbnRpYWxzLlxuICogICBXaGVuIHlvdSB1c2UgdGhlIEFtYXpvbiBFQ1MgQVBJLCBDTEksIG9yIEFXUyBTREssIGlmIHRoZSBzZWNyZXQgZXhpc3RzIGluIHRoZSBzYW1lIFJlZ2lvbiBhcyB0aGUgdGFzayB0aGF0IHlvdSdyZSBsYXVuY2hpbmcgdGhlbiB5b3UgY2FuIHVzZSBlaXRoZXIgdGhlIGZ1bGwgQVJOIG9yIHRoZSBuYW1lIG9mIHRoZSBzZWNyZXQuIFdoZW4geW91IHVzZSB0aGUgQVdTIE1hbmFnZW1lbnQgQ29uc29sZSwgeW91IG11c3Qgc3BlY2lmeSB0aGUgZnVsbCBBUk4gb2YgdGhlIHNlY3JldC5cbiAqL1xuQ3JlZGVudGlhbHNQYXJhbWV0ZXI/OiBzdHJpbmdcbn1cbi8qKlxuICogVGhlIGBgSG9zdEVudHJ5YGAgcHJvcGVydHkgc3BlY2lmaWVzIGEgaG9zdG5hbWUgYW5kIGFuIElQIGFkZHJlc3MgdGhhdCBhcmUgYWRkZWQgdG8gdGhlIGBgL2V0Yy9ob3N0c2BgIGZpbGUgb2YgYSBjb250YWluZXIgdGhyb3VnaCB0aGUgYGBleHRyYUhvc3RzYGAgcGFyYW1ldGVyIG9mIGl0cyBgYENvbnRhaW5lckRlZmluaXRpb25gYCByZXNvdXJjZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb3N0RW50cnkge1xuLyoqXG4gKiBUaGUgaG9zdG5hbWUgdG8gdXNlIGluIHRoZSBgYC9ldGMvaG9zdHNgYCBlbnRyeS5cbiAqL1xuSG9zdG5hbWU/OiBzdHJpbmdcbi8qKlxuICogVGhlIElQIGFkZHJlc3MgdG8gdXNlIGluIHRoZSBgYC9ldGMvaG9zdHNgYCBlbnRyeS5cbiAqL1xuSXBBZGRyZXNzPzogc3RyaW5nXG59XG4vKipcbiAqIExpbnV4LXNwZWNpZmljIG1vZGlmaWNhdGlvbnMgdGhhdCBhcmUgYXBwbGllZCB0byB0aGUgY29udGFpbmVyLCBzdWNoIGFzIExpbnV4IGtlcm5lbCBjYXBhYmlsaXRpZXMuIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSBbS2VybmVsQ2FwYWJpbGl0aWVzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0tlcm5lbENhcGFiaWxpdGllcy5odG1sKS5cbiAqICAgVGhpcyBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZCBmb3IgV2luZG93cyBjb250YWluZXJzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbnV4UGFyYW1ldGVycyB7XG5DYXBhYmlsaXRpZXM/OiBLZXJuZWxDYXBhYmlsaXRpZXNcbi8qKlxuICogVGhpcyBhbGxvd3MgeW91IHRvIHR1bmUgYSBjb250YWluZXIncyBtZW1vcnkgc3dhcHBpbmVzcyBiZWhhdmlvci4gQSBgYHN3YXBwaW5lc3NgYCB2YWx1ZSBvZiBgYDBgYCB3aWxsIGNhdXNlIHN3YXBwaW5nIHRvIG5vdCBoYXBwZW4gdW5sZXNzIGFic29sdXRlbHkgbmVjZXNzYXJ5LiBBIGBgc3dhcHBpbmVzc2BgIHZhbHVlIG9mIGBgMTAwYGAgd2lsbCBjYXVzZSBwYWdlcyB0byBiZSBzd2FwcGVkIHZlcnkgYWdncmVzc2l2ZWx5LiBBY2NlcHRlZCB2YWx1ZXMgYXJlIHdob2xlIG51bWJlcnMgYmV0d2VlbiBgYDBgYCBhbmQgYGAxMDBgYC4gSWYgdGhlIGBgc3dhcHBpbmVzc2BgIHBhcmFtZXRlciBpcyBub3Qgc3BlY2lmaWVkLCBhIGRlZmF1bHQgdmFsdWUgb2YgYGA2MGBgIGlzIHVzZWQuIElmIGEgdmFsdWUgaXMgbm90IHNwZWNpZmllZCBmb3IgYGBtYXhTd2FwYGAgdGhlbiB0aGlzIHBhcmFtZXRlciBpcyBpZ25vcmVkLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIHRoZSBgYC0tbWVtb3J5LXN3YXBwaW5lc3NgYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi5cbiAqICAgSWYgeW91J3JlIHVzaW5nIHRhc2tzIHRoYXQgdXNlIHRoZSBGYXJnYXRlIGxhdW5jaCB0eXBlLCB0aGUgYGBzd2FwcGluZXNzYGAgcGFyYW1ldGVyIGlzbid0IHN1cHBvcnRlZC5cbiAqICBJZiB5b3UncmUgdXNpbmcgdGFza3Mgb24gQW1hem9uIExpbnV4IDIwMjMgdGhlIGBgc3dhcHBpbmVzc2BgIHBhcmFtZXRlciBpc24ndCBzdXBwb3J0ZWQuXG4gKi9cblN3YXBwaW5lc3M/OiBudW1iZXJcbi8qKlxuICogVGhlIGNvbnRhaW5lciBwYXRoLCBtb3VudCBvcHRpb25zLCBhbmQgc2l6ZSAoaW4gTWlCKSBvZiB0aGUgdG1wZnMgbW91bnQuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gdGhlIGBgLS10bXBmc2BgIG9wdGlvbiB0byBkb2NrZXIgcnVuLlxuICogICBJZiB5b3UncmUgdXNpbmcgdGFza3MgdGhhdCB1c2UgdGhlIEZhcmdhdGUgbGF1bmNoIHR5cGUsIHRoZSBgYHRtcGZzYGAgcGFyYW1ldGVyIGlzbid0IHN1cHBvcnRlZC5cbiAqL1xuVG1wZnM/OiBUbXBmc1tdXG4vKipcbiAqIFRoZSB2YWx1ZSBmb3IgdGhlIHNpemUgKGluIE1pQikgb2YgdGhlIGBgL2Rldi9zaG1gYCB2b2x1bWUuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gdGhlIGBgLS1zaG0tc2l6ZWBgIG9wdGlvbiB0byBkb2NrZXIgcnVuLlxuICogICBJZiB5b3UgYXJlIHVzaW5nIHRhc2tzIHRoYXQgdXNlIHRoZSBGYXJnYXRlIGxhdW5jaCB0eXBlLCB0aGUgYGBzaGFyZWRNZW1vcnlTaXplYGAgcGFyYW1ldGVyIGlzIG5vdCBzdXBwb3J0ZWQuXG4gKi9cblNoYXJlZE1lbW9yeVNpemU/OiBudW1iZXJcbi8qKlxuICogQW55IGhvc3QgZGV2aWNlcyB0byBleHBvc2UgdG8gdGhlIGNvbnRhaW5lci4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYERldmljZXNgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS1kZXZpY2VgYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi5cbiAqICAgSWYgeW91J3JlIHVzaW5nIHRhc2tzIHRoYXQgdXNlIHRoZSBGYXJnYXRlIGxhdW5jaCB0eXBlLCB0aGUgYGBkZXZpY2VzYGAgcGFyYW1ldGVyIGlzbid0IHN1cHBvcnRlZC5cbiAqL1xuRGV2aWNlcz86IERldmljZVtdXG4vKipcbiAqIFJ1biBhbiBgYGluaXRgYCBwcm9jZXNzIGluc2lkZSB0aGUgY29udGFpbmVyIHRoYXQgZm9yd2FyZHMgc2lnbmFscyBhbmQgcmVhcHMgcHJvY2Vzc2VzLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIHRoZSBgYC0taW5pdGBgIG9wdGlvbiB0byBkb2NrZXIgcnVuLiBUaGlzIHBhcmFtZXRlciByZXF1aXJlcyB2ZXJzaW9uIDEuMjUgb2YgdGhlIERvY2tlciBSZW1vdGUgQVBJIG9yIGdyZWF0ZXIgb24geW91ciBjb250YWluZXIgaW5zdGFuY2UuIFRvIGNoZWNrIHRoZSBEb2NrZXIgUmVtb3RlIEFQSSB2ZXJzaW9uIG9uIHlvdXIgY29udGFpbmVyIGluc3RhbmNlLCBsb2cgaW4gdG8geW91ciBjb250YWluZXIgaW5zdGFuY2UgYW5kIHJ1biB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6IGBgc3VkbyBkb2NrZXIgdmVyc2lvbiAtLWZvcm1hdCAne3suU2VydmVyLkFQSVZlcnNpb259fSdgYFxuICovXG5Jbml0UHJvY2Vzc0VuYWJsZWQ/OiBib29sZWFuXG4vKipcbiAqIFRoZSB0b3RhbCBhbW91bnQgb2Ygc3dhcCBtZW1vcnkgKGluIE1pQikgYSBjb250YWluZXIgY2FuIHVzZS4gVGhpcyBwYXJhbWV0ZXIgd2lsbCBiZSB0cmFuc2xhdGVkIHRvIHRoZSBgYC0tbWVtb3J5LXN3YXBgYCBvcHRpb24gdG8gZG9ja2VyIHJ1biB3aGVyZSB0aGUgdmFsdWUgd291bGQgYmUgdGhlIHN1bSBvZiB0aGUgY29udGFpbmVyIG1lbW9yeSBwbHVzIHRoZSBgYG1heFN3YXBgYCB2YWx1ZS5cbiAqICBJZiBhIGBgbWF4U3dhcGBgIHZhbHVlIG9mIGBgMGBgIGlzIHNwZWNpZmllZCwgdGhlIGNvbnRhaW5lciB3aWxsIG5vdCB1c2Ugc3dhcC4gQWNjZXB0ZWQgdmFsdWVzIGFyZSBgYDBgYCBvciBhbnkgcG9zaXRpdmUgaW50ZWdlci4gSWYgdGhlIGBgbWF4U3dhcGBgIHBhcmFtZXRlciBpcyBvbWl0dGVkLCB0aGUgY29udGFpbmVyIHdpbGwgdXNlIHRoZSBzd2FwIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBjb250YWluZXIgaW5zdGFuY2UgaXQgaXMgcnVubmluZyBvbi4gQSBgYG1heFN3YXBgYCB2YWx1ZSBtdXN0IGJlIHNldCBmb3IgdGhlIGBgc3dhcHBpbmVzc2BgIHBhcmFtZXRlciB0byBiZSB1c2VkLlxuICogICBJZiB5b3UncmUgdXNpbmcgdGFza3MgdGhhdCB1c2UgdGhlIEZhcmdhdGUgbGF1bmNoIHR5cGUsIHRoZSBgYG1heFN3YXBgYCBwYXJhbWV0ZXIgaXNuJ3Qgc3VwcG9ydGVkLlxuICogIElmIHlvdSdyZSB1c2luZyB0YXNrcyBvbiBBbWF6b24gTGludXggMjAyMyB0aGUgYGBzd2FwcGluZXNzYGAgcGFyYW1ldGVyIGlzbid0IHN1cHBvcnRlZC5cbiAqL1xuTWF4U3dhcD86IG51bWJlclxufVxuLyoqXG4gKiBUaGUgTGludXggY2FwYWJpbGl0aWVzIGZvciB0aGUgY29udGFpbmVyIHRoYXQgYXJlIGFkZGVkIHRvIG9yIGRyb3BwZWQgZnJvbSB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIHByb3ZpZGVkIGJ5IERvY2tlci5cbiAqICAgRm9yIHRhc2tzIHRoYXQgdXNlIHRoZSBGYXJnYXRlIGxhdW5jaCB0eXBlLCBgYGNhcGFiaWxpdGllc2BgIGlzIHN1cHBvcnRlZCBmb3IgYWxsIHBsYXRmb3JtIHZlcnNpb25zIGJ1dCB0aGUgYGBhZGRgYCBwYXJhbWV0ZXIgaXMgb25seSBzdXBwb3J0ZWQgaWYgdXNpbmcgcGxhdGZvcm0gdmVyc2lvbiAxLjQuMCBvciBsYXRlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBLZXJuZWxDYXBhYmlsaXRpZXMge1xuLyoqXG4gKiBUaGUgTGludXggY2FwYWJpbGl0aWVzIGZvciB0aGUgY29udGFpbmVyIHRoYXQgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gcHJvdmlkZWQgYnkgRG9ja2VyLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgQ2FwQWRkYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYC0tY2FwLWFkZGBgIG9wdGlvbiB0byBkb2NrZXIgcnVuLlxuICogICBUYXNrcyBsYXVuY2hlZCBvbiBGQVJHQVRFbG9uZyBvbmx5IHN1cHBvcnQgYWRkaW5nIHRoZSBgYFNZU19QVFJBQ0VgYCBrZXJuZWwgY2FwYWJpbGl0eS5cbiAqICAgVmFsaWQgdmFsdWVzOiBgYFwiQUxMXCIgfCBcIkFVRElUX0NPTlRST0xcIiB8IFwiQVVESVRfV1JJVEVcIiB8IFwiQkxPQ0tfU1VTUEVORFwiIHwgXCJDSE9XTlwiIHwgXCJEQUNfT1ZFUlJJREVcIiB8IFwiREFDX1JFQURfU0VBUkNIXCIgfCBcIkZPV05FUlwiIHwgXCJGU0VUSURcIiB8IFwiSVBDX0xPQ0tcIiB8IFwiSVBDX09XTkVSXCIgfCBcIktJTExcIiB8IFwiTEVBU0VcIiB8IFwiTElOVVhfSU1NVVRBQkxFXCIgfCBcIk1BQ19BRE1JTlwiIHwgXCJNQUNfT1ZFUlJJREVcIiB8IFwiTUtOT0RcIiB8IFwiTkVUX0FETUlOXCIgfCBcIk5FVF9CSU5EX1NFUlZJQ0VcIiB8IFwiTkVUX0JST0FEQ0FTVFwiIHwgXCJORVRfUkFXXCIgfCBcIlNFVEZDQVBcIiB8IFwiU0VUR0lEXCIgfCBcIlNFVFBDQVBcIiB8IFwiU0VUVUlEXCIgfCBcIlNZU19BRE1JTlwiIHwgXCJTWVNfQk9PVFwiIHwgXCJTWVNfQ0hST09UXCIgfCBcIlNZU19NT0RVTEVcIiB8IFwiU1lTX05JQ0VcIiB8IFwiU1lTX1BBQ0NUXCIgfCBcIlNZU19QVFJBQ0VcIiB8IFwiU1lTX1JBV0lPXCIgfCBcIlNZU19SRVNPVVJDRVwiIHwgXCJTWVNfVElNRVwiIHwgXCJTWVNfVFRZX0NPTkZJR1wiIHwgXCJTWVNMT0dcIiB8IFwiV0FLRV9BTEFSTVwiYGBcbiAqL1xuQWRkPzogc3RyaW5nW11cbi8qKlxuICogVGhlIExpbnV4IGNhcGFiaWxpdGllcyBmb3IgdGhlIGNvbnRhaW5lciB0aGF0IGhhdmUgYmVlbiByZW1vdmVkIGZyb20gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBwcm92aWRlZCBieSBEb2NrZXIuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBDYXBEcm9wYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYC0tY2FwLWRyb3BgYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi5cbiAqICBWYWxpZCB2YWx1ZXM6IGBgXCJBTExcIiB8IFwiQVVESVRfQ09OVFJPTFwiIHwgXCJBVURJVF9XUklURVwiIHwgXCJCTE9DS19TVVNQRU5EXCIgfCBcIkNIT1dOXCIgfCBcIkRBQ19PVkVSUklERVwiIHwgXCJEQUNfUkVBRF9TRUFSQ0hcIiB8IFwiRk9XTkVSXCIgfCBcIkZTRVRJRFwiIHwgXCJJUENfTE9DS1wiIHwgXCJJUENfT1dORVJcIiB8IFwiS0lMTFwiIHwgXCJMRUFTRVwiIHwgXCJMSU5VWF9JTU1VVEFCTEVcIiB8IFwiTUFDX0FETUlOXCIgfCBcIk1BQ19PVkVSUklERVwiIHwgXCJNS05PRFwiIHwgXCJORVRfQURNSU5cIiB8IFwiTkVUX0JJTkRfU0VSVklDRVwiIHwgXCJORVRfQlJPQURDQVNUXCIgfCBcIk5FVF9SQVdcIiB8IFwiU0VURkNBUFwiIHwgXCJTRVRHSURcIiB8IFwiU0VUUENBUFwiIHwgXCJTRVRVSURcIiB8IFwiU1lTX0FETUlOXCIgfCBcIlNZU19CT09UXCIgfCBcIlNZU19DSFJPT1RcIiB8IFwiU1lTX01PRFVMRVwiIHwgXCJTWVNfTklDRVwiIHwgXCJTWVNfUEFDQ1RcIiB8IFwiU1lTX1BUUkFDRVwiIHwgXCJTWVNfUkFXSU9cIiB8IFwiU1lTX1JFU09VUkNFXCIgfCBcIlNZU19USU1FXCIgfCBcIlNZU19UVFlfQ09ORklHXCIgfCBcIlNZU0xPR1wiIHwgXCJXQUtFX0FMQVJNXCJgYFxuICovXG5Ecm9wPzogc3RyaW5nW11cbn1cbi8qKlxuICogVGhlIGNvbnRhaW5lciBwYXRoLCBtb3VudCBvcHRpb25zLCBhbmQgc2l6ZSBvZiB0aGUgdG1wZnMgbW91bnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG1wZnMge1xuLyoqXG4gKiBUaGUgbWF4aW11bSBzaXplIChpbiBNaUIpIG9mIHRoZSB0bXBmcyB2b2x1bWUuXG4gKi9cblNpemU6IG51bWJlclxuLyoqXG4gKiBUaGUgYWJzb2x1dGUgZmlsZSBwYXRoIHdoZXJlIHRoZSB0bXBmcyB2b2x1bWUgaXMgdG8gYmUgbW91bnRlZC5cbiAqL1xuQ29udGFpbmVyUGF0aD86IHN0cmluZ1xuLyoqXG4gKiBUaGUgbGlzdCBvZiB0bXBmcyB2b2x1bWUgbW91bnQgb3B0aW9ucy5cbiAqICBWYWxpZCB2YWx1ZXM6IGBgXCJkZWZhdWx0c1wiIHwgXCJyb1wiIHwgXCJyd1wiIHwgXCJzdWlkXCIgfCBcIm5vc3VpZFwiIHwgXCJkZXZcIiB8IFwibm9kZXZcIiB8IFwiZXhlY1wiIHwgXCJub2V4ZWNcIiB8IFwic3luY1wiIHwgXCJhc3luY1wiIHwgXCJkaXJzeW5jXCIgfCBcInJlbW91bnRcIiB8IFwibWFuZFwiIHwgXCJub21hbmRcIiB8IFwiYXRpbWVcIiB8IFwibm9hdGltZVwiIHwgXCJkaXJhdGltZVwiIHwgXCJub2RpcmF0aW1lXCIgfCBcImJpbmRcIiB8IFwicmJpbmRcIiB8IFwidW5iaW5kYWJsZVwiIHwgXCJydW5iaW5kYWJsZVwiIHwgXCJwcml2YXRlXCIgfCBcInJwcml2YXRlXCIgfCBcInNoYXJlZFwiIHwgXCJyc2hhcmVkXCIgfCBcInNsYXZlXCIgfCBcInJzbGF2ZVwiIHwgXCJyZWxhdGltZVwiIHwgXCJub3JlbGF0aW1lXCIgfCBcInN0cmljdGF0aW1lXCIgfCBcIm5vc3RyaWN0YXRpbWVcIiB8IFwibW9kZVwiIHwgXCJ1aWRcIiB8IFwiZ2lkXCIgfCBcIm5yX2lub2Rlc1wiIHwgXCJucl9ibG9ja3NcIiB8IFwibXBvbFwiYGBcbiAqL1xuTW91bnRPcHRpb25zPzogc3RyaW5nW11cbn1cbi8qKlxuICogVGhlIGBgRGV2aWNlYGAgcHJvcGVydHkgc3BlY2lmaWVzIGFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBjb250YWluZXIgaW5zdGFuY2UgaG9zdCBkZXZpY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGV2aWNlIHtcbi8qKlxuICogVGhlIHBhdGggZm9yIHRoZSBkZXZpY2Ugb24gdGhlIGhvc3QgY29udGFpbmVyIGluc3RhbmNlLlxuICovXG5Ib3N0UGF0aD86IHN0cmluZ1xuLyoqXG4gKiBUaGUgZXhwbGljaXQgcGVybWlzc2lvbnMgdG8gcHJvdmlkZSB0byB0aGUgY29udGFpbmVyIGZvciB0aGUgZGV2aWNlLiBCeSBkZWZhdWx0LCB0aGUgY29udGFpbmVyIGhhcyBwZXJtaXNzaW9ucyBmb3IgYGByZWFkYGAsIGBgd3JpdGVgYCwgYW5kIGBgbWtub2RgYCBmb3IgdGhlIGRldmljZS5cbiAqL1xuUGVybWlzc2lvbnM/OiBzdHJpbmdbXVxuLyoqXG4gKiBUaGUgcGF0aCBpbnNpZGUgdGhlIGNvbnRhaW5lciBhdCB3aGljaCB0byBleHBvc2UgdGhlIGhvc3QgZGV2aWNlLlxuICovXG5Db250YWluZXJQYXRoPzogc3RyaW5nXG59XG4vKipcbiAqIFRoZSByZXN0YXJ0IHBvbGljeSBmb3IgYSBjb250YWluZXIuIFdoZW4geW91IHNldCB1cCBhIHJlc3RhcnQgcG9saWN5LCBBbWF6b24gRUNTIGNhbiByZXN0YXJ0IHRoZSBjb250YWluZXIgd2l0aG91dCBuZWVkaW5nIHRvIHJlcGxhY2UgdGhlIHRhc2suIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1Jlc3RhcnQgaW5kaXZpZHVhbCBjb250YWluZXJzIGluIEFtYXpvbiBFQ1MgdGFza3Mgd2l0aCBjb250YWluZXIgcmVzdGFydCBwb2xpY2llc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvY29udGFpbmVyLXJlc3RhcnQtcG9saWN5Lmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXN0YXJ0UG9saWN5IHtcbi8qKlxuICogQSBsaXN0IG9mIGV4aXQgY29kZXMgdGhhdCBBbWF6b24gRUNTIHdpbGwgaWdub3JlIGFuZCBub3QgYXR0ZW1wdCBhIHJlc3RhcnQgb24uIFlvdSBjYW4gc3BlY2lmeSBhIG1heGltdW0gb2YgNTAgY29udGFpbmVyIGV4aXQgY29kZXMuIEJ5IGRlZmF1bHQsIEFtYXpvbiBFQ1MgZG9lcyBub3QgaWdub3JlIGFueSBleGl0IGNvZGVzLlxuICovXG5JZ25vcmVkRXhpdENvZGVzPzogbnVtYmVyW11cbi8qKlxuICogQSBwZXJpb2Qgb2YgdGltZSAoaW4gc2Vjb25kcykgdGhhdCB0aGUgY29udGFpbmVyIG11c3QgcnVuIGZvciBiZWZvcmUgYSByZXN0YXJ0IGNhbiBiZSBhdHRlbXB0ZWQuIEEgY29udGFpbmVyIGNhbiBiZSByZXN0YXJ0ZWQgb25seSBvbmNlIGV2ZXJ5IGBgcmVzdGFydEF0dGVtcHRQZXJpb2RgYCBzZWNvbmRzLiBJZiBhIGNvbnRhaW5lciBpc24ndCBhYmxlIHRvIHJ1biBmb3IgdGhpcyB0aW1lIHBlcmlvZCBhbmQgZXhpdHMgZWFybHksIGl0IHdpbGwgbm90IGJlIHJlc3RhcnRlZC4gWW91IGNhbiBzZXQgYSBtaW5pbXVtIGBgcmVzdGFydEF0dGVtcHRQZXJpb2RgYCBvZiA2MCBzZWNvbmRzIGFuZCBhIG1heGltdW0gYGByZXN0YXJ0QXR0ZW1wdFBlcmlvZGBgIG9mIDE4MDAgc2Vjb25kcy4gQnkgZGVmYXVsdCwgYSBjb250YWluZXIgbXVzdCBydW4gZm9yIDMwMCBzZWNvbmRzIGJlZm9yZSBpdCBjYW4gYmUgcmVzdGFydGVkLlxuICovXG5SZXN0YXJ0QXR0ZW1wdFBlcmlvZD86IG51bWJlclxuLyoqXG4gKiBTcGVjaWZpZXMgd2hldGhlciBhIHJlc3RhcnQgcG9saWN5IGlzIGVuYWJsZWQgZm9yIHRoZSBjb250YWluZXIuXG4gKi9cbkVuYWJsZWQ/OiBib29sZWFuXG59XG4vKipcbiAqIFRoZSBkZXRhaWxzIGZvciBhIHZvbHVtZSBtb3VudCBwb2ludCB0aGF0J3MgdXNlZCBpbiBhIGNvbnRhaW5lciBkZWZpbml0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vdW50UG9pbnQge1xuLyoqXG4gKiBJZiB0aGlzIHZhbHVlIGlzIGBgdHJ1ZWBgLCB0aGUgY29udGFpbmVyIGhhcyByZWFkLW9ubHkgYWNjZXNzIHRvIHRoZSB2b2x1bWUuIElmIHRoaXMgdmFsdWUgaXMgYGBmYWxzZWBgLCB0aGVuIHRoZSBjb250YWluZXIgY2FuIHdyaXRlIHRvIHRoZSB2b2x1bWUuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBgZmFsc2VgYC5cbiAqL1xuUmVhZE9ubHk/OiBib29sZWFuXG4vKipcbiAqIFRoZSBuYW1lIG9mIHRoZSB2b2x1bWUgdG8gbW91bnQuIE11c3QgYmUgYSB2b2x1bWUgbmFtZSByZWZlcmVuY2VkIGluIHRoZSBgYG5hbWVgYCBwYXJhbWV0ZXIgb2YgdGFzayBkZWZpbml0aW9uIGBgdm9sdW1lYGAuXG4gKi9cblNvdXJjZVZvbHVtZT86IHN0cmluZ1xuLyoqXG4gKiBUaGUgcGF0aCBvbiB0aGUgY29udGFpbmVyIHRvIG1vdW50IHRoZSBob3N0IHZvbHVtZSBhdC5cbiAqL1xuQ29udGFpbmVyUGF0aD86IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgYGBDb250YWluZXJEZXBlbmRlbmN5YGAgcHJvcGVydHkgc3BlY2lmaWVzIHRoZSBkZXBlbmRlbmNpZXMgZGVmaW5lZCBmb3IgY29udGFpbmVyIHN0YXJ0dXAgYW5kIHNodXRkb3duLiBBIGNvbnRhaW5lciBjYW4gY29udGFpbiBtdWx0aXBsZSBkZXBlbmRlbmNpZXMuIFdoZW4gYSBkZXBlbmRlbmN5IGlzIGRlZmluZWQgZm9yIGNvbnRhaW5lciBzdGFydHVwLCBmb3IgY29udGFpbmVyIHNodXRkb3duIGl0IGlzIHJldmVyc2VkLlxuICogIFlvdXIgQW1hem9uIEVDUyBjb250YWluZXIgaW5zdGFuY2VzIHJlcXVpcmUgYXQgbGVhc3QgdmVyc2lvbiAxLjI2LjAgb2YgdGhlIGNvbnRhaW5lciBhZ2VudCB0byBlbmFibGUgY29udGFpbmVyIGRlcGVuZGVuY2llcy4gSG93ZXZlciwgd2UgcmVjb21tZW5kIHVzaW5nIHRoZSBsYXRlc3QgY29udGFpbmVyIGFnZW50IHZlcnNpb24uIEZvciBpbmZvcm1hdGlvbiBhYm91dCBjaGVja2luZyB5b3VyIGFnZW50IHZlcnNpb24gYW5kIHVwZGF0aW5nIHRvIHRoZSBsYXRlc3QgdmVyc2lvbiwgc2VlIFtVcGRhdGluZyB0aGUgQW1hem9uIEVDUyBDb250YWluZXIgQWdlbnRdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2Vjcy1hZ2VudC11cGRhdGUuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLiBJZiB5b3UgYXJlIHVzaW5nIGFuIEFtYXpvbiBFQ1Mtb3B0aW1pemVkIExpbnV4IEFNSSwgeW91ciBpbnN0YW5jZSBuZWVkcyBhdCBsZWFzdCB2ZXJzaW9uIDEuMjYuMC0xIG9mIHRoZSBgYGVjcy1pbml0YGAgcGFja2FnZS4gSWYgeW91ciBjb250YWluZXIgaW5zdGFuY2VzIGFyZSBsYXVuY2hlZCBmcm9tIHZlcnNpb24gYGAyMDE5MDMwMWBgIG9yIGxhdGVyLCB0aGVuIHRoZXkgY29udGFpbiB0aGUgcmVxdWlyZWQgdmVyc2lvbnMgb2YgdGhlIGNvbnRhaW5lciBhZ2VudCBhbmQgYGBlY3MtaW5pdGBgLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtBbWF6b24gRUNTLW9wdGltaXplZCBMaW51eCBBTUldKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2Vjcy1vcHRpbWl6ZWRfQU1JLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICAgRm9yIHRhc2tzIHVzaW5nIHRoZSBGYXJnYXRlIGxhdW5jaCB0eXBlLCB0aGlzIHBhcmFtZXRlciByZXF1aXJlcyB0aGF0IHRoZSB0YXNrIG9yIHNlcnZpY2UgdXNlcyBwbGF0Zm9ybSB2ZXJzaW9uIDEuMy4wIG9yIGxhdGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRhaW5lckRlcGVuZGVuY3kge1xuLyoqXG4gKiBUaGUgZGVwZW5kZW5jeSBjb25kaXRpb24gb2YgdGhlIGNvbnRhaW5lci4gVGhlIGZvbGxvd2luZyBhcmUgdGhlIGF2YWlsYWJsZSBjb25kaXRpb25zIGFuZCB0aGVpciBiZWhhdmlvcjpcbiAqICAgKyAgYGBTVEFSVGBgIC0gVGhpcyBjb25kaXRpb24gZW11bGF0ZXMgdGhlIGJlaGF2aW9yIG9mIGxpbmtzIGFuZCB2b2x1bWVzIHRvZGF5LiBJdCB2YWxpZGF0ZXMgdGhhdCBhIGRlcGVuZGVudCBjb250YWluZXIgaXMgc3RhcnRlZCBiZWZvcmUgcGVybWl0dGluZyBvdGhlciBjb250YWluZXJzIHRvIHN0YXJ0LlxuICogICArICBgYENPTVBMRVRFYGAgLSBUaGlzIGNvbmRpdGlvbiB2YWxpZGF0ZXMgdGhhdCBhIGRlcGVuZGVudCBjb250YWluZXIgcnVucyB0byBjb21wbGV0aW9uIChleGl0cykgYmVmb3JlIHBlcm1pdHRpbmcgb3RoZXIgY29udGFpbmVycyB0byBzdGFydC4gVGhpcyBjYW4gYmUgdXNlZnVsIGZvciBub25lc3NlbnRpYWwgY29udGFpbmVycyB0aGF0IHJ1biBhIHNjcmlwdCBhbmQgdGhlbiBleGl0LiBUaGlzIGNvbmRpdGlvbiBjYW4ndCBiZSBzZXQgb24gYW4gZXNzZW50aWFsIGNvbnRhaW5lci5cbiAqICAgKyAgYGBTVUNDRVNTYGAgLSBUaGlzIGNvbmRpdGlvbiBpcyB0aGUgc2FtZSBhcyBgYENPTVBMRVRFYGAsIGJ1dCBpdCBhbHNvIHJlcXVpcmVzIHRoYXQgdGhlIGNvbnRhaW5lciBleGl0cyB3aXRoIGEgYGB6ZXJvYGAgc3RhdHVzLiBUaGlzIGNvbmRpdGlvbiBjYW4ndCBiZSBzZXQgb24gYW4gZXNzZW50aWFsIGNvbnRhaW5lci5cbiAqICAgKyAgYGBIRUFMVEhZYGAgLSBUaGlzIGNvbmRpdGlvbiB2YWxpZGF0ZXMgdGhhdCB0aGUgZGVwZW5kZW50IGNvbnRhaW5lciBwYXNzZXMgaXRzIERvY2tlciBoZWFsdGggY2hlY2sgYmVmb3JlIHBlcm1pdHRpbmcgb3RoZXIgY29udGFpbmVycyB0byBzdGFydC4gVGhpcyByZXF1aXJlcyB0aGF0IHRoZSBkZXBlbmRlbnQgY29udGFpbmVyIGhhcyBoZWFsdGggY2hlY2tzIGNvbmZpZ3VyZWQuIFRoaXMgY29uZGl0aW9uIGlzIGNvbmZpcm1lZCBvbmx5IGF0IHRhc2sgc3RhcnR1cC5cbiAqL1xuQ29uZGl0aW9uPzogc3RyaW5nXG4vKipcbiAqIFRoZSBuYW1lIG9mIGEgY29udGFpbmVyLlxuICovXG5Db250YWluZXJOYW1lPzogc3RyaW5nXG59XG4vKipcbiAqIFRoZSBgYFBvcnRNYXBwaW5nYGAgcHJvcGVydHkgc3BlY2lmaWVzIGEgcG9ydCBtYXBwaW5nLiBQb3J0IG1hcHBpbmdzIGFsbG93IGNvbnRhaW5lcnMgdG8gYWNjZXNzIHBvcnRzIG9uIHRoZSBob3N0IGNvbnRhaW5lciBpbnN0YW5jZSB0byBzZW5kIG9yIHJlY2VpdmUgdHJhZmZpYy4gUG9ydCBtYXBwaW5ncyBhcmUgc3BlY2lmaWVkIGFzIHBhcnQgb2YgdGhlIGNvbnRhaW5lciBkZWZpbml0aW9uLlxuICogIElmIHlvdSBhcmUgdXNpbmcgY29udGFpbmVycyBpbiBhIHRhc2sgd2l0aCB0aGUgYGBhd3N2cGNgYCBvciBgYGhvc3RgYCBuZXR3b3JrIG1vZGUsIGV4cG9zZWQgcG9ydHMgc2hvdWxkIGJlIHNwZWNpZmllZCB1c2luZyBgYGNvbnRhaW5lclBvcnRgYC4gVGhlIGBgaG9zdFBvcnRgYCBjYW4gYmUgbGVmdCBibGFuayBvciBpdCBtdXN0IGJlIHRoZSBzYW1lIHZhbHVlIGFzIHRoZSBgYGNvbnRhaW5lclBvcnRgYC5cbiAqICBBZnRlciBhIHRhc2sgcmVhY2hlcyB0aGUgYGBSVU5OSU5HYGAgc3RhdHVzLCBtYW51YWwgYW5kIGF1dG9tYXRpYyBob3N0IGFuZCBjb250YWluZXIgcG9ydCBhc3NpZ25tZW50cyBhcmUgdmlzaWJsZSBpbiB0aGUgYGBuZXR3b3JrQmluZGluZ3NgYCBzZWN0aW9uIG9mIFtEZXNjcmliZVRhc2tzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlVGFza3MuaHRtbCkgQVBJIHJlc3BvbnNlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQb3J0TWFwcGluZyB7XG4vKipcbiAqIFRoZSBhcHBsaWNhdGlvbiBwcm90b2NvbCB0aGF0J3MgdXNlZCBmb3IgdGhlIHBvcnQgbWFwcGluZy4gVGhpcyBwYXJhbWV0ZXIgb25seSBhcHBsaWVzIHRvIFNlcnZpY2UgQ29ubmVjdC4gV2UgcmVjb21tZW5kIHRoYXQgeW91IHNldCB0aGlzIHBhcmFtZXRlciB0byBiZSBjb25zaXN0ZW50IHdpdGggdGhlIHByb3RvY29sIHRoYXQgeW91ciBhcHBsaWNhdGlvbiB1c2VzLiBJZiB5b3Ugc2V0IHRoaXMgcGFyYW1ldGVyLCBBbWF6b24gRUNTIGFkZHMgcHJvdG9jb2wtc3BlY2lmaWMgY29ubmVjdGlvbiBoYW5kbGluZyB0byB0aGUgU2VydmljZSBDb25uZWN0IHByb3h5LiBJZiB5b3Ugc2V0IHRoaXMgcGFyYW1ldGVyLCBBbWF6b24gRUNTIGFkZHMgcHJvdG9jb2wtc3BlY2lmaWMgdGVsZW1ldHJ5IGluIHRoZSBBbWF6b24gRUNTIGNvbnNvbGUgYW5kIENsb3VkV2F0Y2guXG4gKiAgSWYgeW91IGRvbid0IHNldCBhIHZhbHVlIGZvciB0aGlzIHBhcmFtZXRlciwgdGhlbiBUQ1AgaXMgdXNlZC4gSG93ZXZlciwgQW1hem9uIEVDUyBkb2Vzbid0IGFkZCBwcm90b2NvbC1zcGVjaWZpYyB0ZWxlbWV0cnkgZm9yIFRDUC5cbiAqICBgYGFwcFByb3RvY29sYGAgaXMgaW1tdXRhYmxlIGluIGEgU2VydmljZSBDb25uZWN0IHNlcnZpY2UuIFVwZGF0aW5nIHRoaXMgZmllbGQgcmVxdWlyZXMgYSBzZXJ2aWNlIGRlbGV0aW9uIGFuZCByZWRlcGxveW1lbnQuXG4gKiAgVGFza3MgdGhhdCBydW4gaW4gYSBuYW1lc3BhY2UgY2FuIHVzZSBzaG9ydCBuYW1lcyB0byBjb25uZWN0IHRvIHNlcnZpY2VzIGluIHRoZSBuYW1lc3BhY2UuIFRhc2tzIGNhbiBjb25uZWN0IHRvIHNlcnZpY2VzIGFjcm9zcyBhbGwgb2YgdGhlIGNsdXN0ZXJzIGluIHRoZSBuYW1lc3BhY2UuIFRhc2tzIGNvbm5lY3QgdGhyb3VnaCBhIG1hbmFnZWQgcHJveHkgY29udGFpbmVyIHRoYXQgY29sbGVjdHMgbG9ncyBhbmQgbWV0cmljcyBmb3IgaW5jcmVhc2VkIHZpc2liaWxpdHkuIE9ubHkgdGhlIHRhc2tzIHRoYXQgQW1hem9uIEVDUyBzZXJ2aWNlcyBjcmVhdGUgYXJlIHN1cHBvcnRlZCB3aXRoIFNlcnZpY2UgQ29ubmVjdC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbU2VydmljZSBDb25uZWN0XShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9zZXJ2aWNlLWNvbm5lY3QuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5BcHBQcm90b2NvbD86IChcImh0dHBcIiB8IFwiaHR0cDJcIiB8IFwiZ3JwY1wiKVxuLyoqXG4gKiBUaGUgcG9ydCBudW1iZXIgcmFuZ2Ugb24gdGhlIGNvbnRhaW5lciB0aGF0J3MgYm91bmQgdG8gdGhlIGR5bmFtaWNhbGx5IG1hcHBlZCBob3N0IHBvcnQgcmFuZ2UuIFxuICogIFRoZSBmb2xsb3dpbmcgcnVsZXMgYXBwbHkgd2hlbiB5b3Ugc3BlY2lmeSBhIGBgY29udGFpbmVyUG9ydFJhbmdlYGA6XG4gKiAgICsgIFlvdSBtdXN0IHVzZSBlaXRoZXIgdGhlIGBgYnJpZGdlYGAgbmV0d29yayBtb2RlIG9yIHRoZSBgYGF3c3ZwY2BgIG5ldHdvcmsgbW9kZS5cbiAqICAgKyAgVGhpcyBwYXJhbWV0ZXIgaXMgYXZhaWxhYmxlIGZvciBib3RoIHRoZSBFQzIgYW5kIEZBUkdBVEVsb25nIGxhdW5jaCB0eXBlcy5cbiAqICAgKyAgVGhpcyBwYXJhbWV0ZXIgaXMgYXZhaWxhYmxlIGZvciBib3RoIHRoZSBMaW51eCBhbmQgV2luZG93cyBvcGVyYXRpbmcgc3lzdGVtcy5cbiAqICAgKyAgVGhlIGNvbnRhaW5lciBpbnN0YW5jZSBtdXN0IGhhdmUgYXQgbGVhc3QgdmVyc2lvbiAxLjY3LjAgb2YgdGhlIGNvbnRhaW5lciBhZ2VudCBhbmQgYXQgbGVhc3QgdmVyc2lvbiAxLjY3LjAtMSBvZiB0aGUgYGBlY3MtaW5pdGBgIHBhY2thZ2UgXG4gKiAgICsgIFlvdSBjYW4gc3BlY2lmeSBhIG1heGltdW0gb2YgMTAwIHBvcnQgcmFuZ2VzIHBlciBjb250YWluZXIuXG4gKiAgICsgIFlvdSBkbyBub3Qgc3BlY2lmeSBhIGBgaG9zdFBvcnRSYW5nZWBgLiBUaGUgdmFsdWUgb2YgdGhlIGBgaG9zdFBvcnRSYW5nZWBgIGlzIHNldCBhcyBmb2xsb3dzOlxuICogICArICBGb3IgY29udGFpbmVycyBpbiBhIHRhc2sgd2l0aCB0aGUgYGBhd3N2cGNgYCBuZXR3b3JrIG1vZGUsIHRoZSBgYGhvc3RQb3J0UmFuZ2VgYCBpcyBzZXQgdG8gdGhlIHNhbWUgdmFsdWUgYXMgdGhlIGBgY29udGFpbmVyUG9ydFJhbmdlYGAuIFRoaXMgaXMgYSBzdGF0aWMgbWFwcGluZyBzdHJhdGVneS5cbiAqICAgKyAgRm9yIGNvbnRhaW5lcnMgaW4gYSB0YXNrIHdpdGggdGhlIGBgYnJpZGdlYGAgbmV0d29yayBtb2RlLCB0aGUgQW1hem9uIEVDUyBhZ2VudCBmaW5kcyBvcGVuIGhvc3QgcG9ydHMgZnJvbSB0aGUgZGVmYXVsdCBlcGhlbWVyYWwgcmFuZ2UgYW5kIHBhc3NlcyBpdCB0byBkb2NrZXIgdG8gYmluZCB0aGVtIHRvIHRoZSBjb250YWluZXIgcG9ydHMuXG4gKiAgIFxuICogICArICBUaGUgYGBjb250YWluZXJQb3J0UmFuZ2VgYCB2YWxpZCB2YWx1ZXMgYXJlIGJldHdlZW4gMSBhbmQgNjU1MzUuXG4gKiAgICsgIEEgcG9ydCBjYW4gb25seSBiZSBpbmNsdWRlZCBpbiBvbmUgcG9ydCBtYXBwaW5nIHBlciBjb250YWluZXIuXG4gKiAgICsgIFlvdSBjYW5ub3Qgc3BlY2lmeSBvdmVybGFwcGluZyBwb3J0IHJhbmdlcy5cbiAqICAgKyAgVGhlIGZpcnN0IHBvcnQgaW4gdGhlIHJhbmdlIG11c3QgYmUgbGVzcyB0aGFuIGxhc3QgcG9ydCBpbiB0aGUgcmFuZ2UuXG4gKiAgICsgIERvY2tlciByZWNvbW1lbmRzIHRoYXQgeW91IHR1cm4gb2ZmIHRoZSBkb2NrZXItcHJveHkgaW4gdGhlIERvY2tlciBkYWVtb24gY29uZmlnIGZpbGUgd2hlbiB5b3UgaGF2ZSBhIGxhcmdlIG51bWJlciBvZiBwb3J0cy5cbiAqICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtJc3N1ZSAjMTExODVdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9odHRwczovL2dpdGh1Yi5jb20vbW9ieS9tb2J5L2lzc3Vlcy8xMTE4NSkgb24gdGhlIEdpdGh1YiB3ZWJzaXRlLlxuICogIEZvciBpbmZvcm1hdGlvbiBhYm91dCBob3cgdG8gdHVybiBvZmYgdGhlIGRvY2tlci1wcm94eSBpbiB0aGUgRG9ja2VyIGRhZW1vbiBjb25maWcgZmlsZSwgc2VlIFtEb2NrZXIgZGFlbW9uXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9ib290c3RyYXBfY29udGFpbmVyX2luc3RhbmNlLmh0bWwjYm9vdHN0cmFwX2RvY2tlcl9kYWVtb24pIGluIHRoZSAqQW1hem9uIEVDUyBEZXZlbG9wZXIgR3VpZGUqLlxuICogICBcbiAqICBZb3UgY2FuIGNhbGwgW0Rlc2NyaWJlVGFza3NdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVUYXNrcy5odG1sKSB0byB2aWV3IHRoZSBgYGhvc3RQb3J0UmFuZ2VgYCB3aGljaCBhcmUgdGhlIGhvc3QgcG9ydHMgdGhhdCBhcmUgYm91bmQgdG8gdGhlIGNvbnRhaW5lciBwb3J0cy5cbiAqL1xuQ29udGFpbmVyUG9ydFJhbmdlPzogc3RyaW5nXG4vKipcbiAqIFRoZSBwb3J0IG51bWJlciBvbiB0aGUgY29udGFpbmVyIGluc3RhbmNlIHRvIHJlc2VydmUgZm9yIHlvdXIgY29udGFpbmVyLlxuICogIElmIHlvdSBzcGVjaWZ5IGEgYGBjb250YWluZXJQb3J0UmFuZ2VgYCwgbGVhdmUgdGhpcyBmaWVsZCBlbXB0eSBhbmQgdGhlIHZhbHVlIG9mIHRoZSBgYGhvc3RQb3J0YGAgaXMgc2V0IGFzIGZvbGxvd3M6XG4gKiAgICsgIEZvciBjb250YWluZXJzIGluIGEgdGFzayB3aXRoIHRoZSBgYGF3c3ZwY2BgIG5ldHdvcmsgbW9kZSwgdGhlIGBgaG9zdFBvcnRgYCBpcyBzZXQgdG8gdGhlIHNhbWUgdmFsdWUgYXMgdGhlIGBgY29udGFpbmVyUG9ydGBgLiBUaGlzIGlzIGEgc3RhdGljIG1hcHBpbmcgc3RyYXRlZ3kuXG4gKiAgICsgIEZvciBjb250YWluZXJzIGluIGEgdGFzayB3aXRoIHRoZSBgYGJyaWRnZWBgIG5ldHdvcmsgbW9kZSwgdGhlIEFtYXpvbiBFQ1MgYWdlbnQgZmluZHMgb3BlbiBwb3J0cyBvbiB0aGUgaG9zdCBhbmQgYXV0b21hdGljYWxseSBiaW5kcyB0aGVtIHRvIHRoZSBjb250YWluZXIgcG9ydHMuIFRoaXMgaXMgYSBkeW5hbWljIG1hcHBpbmcgc3RyYXRlZ3kuXG4gKiAgIFxuICogIElmIHlvdSB1c2UgY29udGFpbmVycyBpbiBhIHRhc2sgd2l0aCB0aGUgYGBhd3N2cGNgYCBvciBgYGhvc3RgYCBuZXR3b3JrIG1vZGUsIHRoZSBgYGhvc3RQb3J0YGAgY2FuIGVpdGhlciBiZSBsZWZ0IGJsYW5rIG9yIHNldCB0byB0aGUgc2FtZSB2YWx1ZSBhcyB0aGUgYGBjb250YWluZXJQb3J0YGAuXG4gKiAgSWYgeW91IHVzZSBjb250YWluZXJzIGluIGEgdGFzayB3aXRoIHRoZSBgYGJyaWRnZWBgIG5ldHdvcmsgbW9kZSwgeW91IGNhbiBzcGVjaWZ5IGEgbm9uLXJlc2VydmVkIGhvc3QgcG9ydCBmb3IgeW91ciBjb250YWluZXIgcG9ydCBtYXBwaW5nLCBvciB5b3UgY2FuIG9taXQgdGhlIGBgaG9zdFBvcnRgYCAob3Igc2V0IGl0IHRvIGBgMGBgKSB3aGlsZSBzcGVjaWZ5aW5nIGEgYGBjb250YWluZXJQb3J0YGAgYW5kIHlvdXIgY29udGFpbmVyIGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBwb3J0IGluIHRoZSBlcGhlbWVyYWwgcG9ydCByYW5nZSBmb3IgeW91ciBjb250YWluZXIgaW5zdGFuY2Ugb3BlcmF0aW5nIHN5c3RlbSBhbmQgRG9ja2VyIHZlcnNpb24uXG4gKiAgVGhlIGRlZmF1bHQgZXBoZW1lcmFsIHBvcnQgcmFuZ2UgZm9yIERvY2tlciB2ZXJzaW9uIDEuNi4wIGFuZCBsYXRlciBpcyBsaXN0ZWQgb24gdGhlIGluc3RhbmNlIHVuZGVyIGBgL3Byb2Mvc3lzL25ldC9pcHY0L2lwX2xvY2FsX3BvcnRfcmFuZ2VgYC4gSWYgdGhpcyBrZXJuZWwgcGFyYW1ldGVyIGlzIHVuYXZhaWxhYmxlLCB0aGUgZGVmYXVsdCBlcGhlbWVyYWwgcG9ydCByYW5nZSBmcm9tIDQ5MTUzIHRocm91Z2ggNjU1MzUgKExpbnV4KSBvciA0OTE1MiB0aHJvdWdoIDY1NTM1IChXaW5kb3dzKSBpcyB1c2VkLiBEbyBub3QgYXR0ZW1wdCB0byBzcGVjaWZ5IGEgaG9zdCBwb3J0IGluIHRoZSBlcGhlbWVyYWwgcG9ydCByYW5nZSBhcyB0aGVzZSBhcmUgcmVzZXJ2ZWQgZm9yIGF1dG9tYXRpYyBhc3NpZ25tZW50LiBJbiBnZW5lcmFsLCBwb3J0cyBiZWxvdyAzMjc2OCBhcmUgb3V0c2lkZSBvZiB0aGUgZXBoZW1lcmFsIHBvcnQgcmFuZ2UuXG4gKiAgVGhlIGRlZmF1bHQgcmVzZXJ2ZWQgcG9ydHMgYXJlIDIyIGZvciBTU0gsIHRoZSBEb2NrZXIgcG9ydHMgMjM3NSBhbmQgMjM3NiwgYW5kIHRoZSBBbWF6b24gRUNTIGNvbnRhaW5lciBhZ2VudCBwb3J0cyA1MTY3OC01MTY4MC4gQW55IGhvc3QgcG9ydCB0aGF0IHdhcyBwcmV2aW91c2x5IHNwZWNpZmllZCBpbiBhIHJ1bm5pbmcgdGFzayBpcyBhbHNvIHJlc2VydmVkIHdoaWxlIHRoZSB0YXNrIGlzIHJ1bm5pbmcuIFRoYXQgaXMsIGFmdGVyIGEgdGFzayBzdG9wcywgdGhlIGhvc3QgcG9ydCBpcyByZWxlYXNlZC4gVGhlIGN1cnJlbnQgcmVzZXJ2ZWQgcG9ydHMgYXJlIGRpc3BsYXllZCBpbiB0aGUgYGByZW1haW5pbmdSZXNvdXJjZXNgYCBvZiBbRGVzY3JpYmVDb250YWluZXJJbnN0YW5jZXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVDb250YWluZXJJbnN0YW5jZXMuaHRtbCkgb3V0cHV0LiBBIGNvbnRhaW5lciBpbnN0YW5jZSBjYW4gaGF2ZSB1cCB0byAxMDAgcmVzZXJ2ZWQgcG9ydHMgYXQgYSB0aW1lLiBUaGlzIG51bWJlciBpbmNsdWRlcyB0aGUgZGVmYXVsdCByZXNlcnZlZCBwb3J0cy4gQXV0b21hdGljYWxseSBhc3NpZ25lZCBwb3J0cyBhcmVuJ3QgaW5jbHVkZWQgaW4gdGhlIDEwMCByZXNlcnZlZCBwb3J0cyBxdW90YS5cbiAqL1xuSG9zdFBvcnQ/OiBudW1iZXJcbi8qKlxuICogVGhlIHBvcnQgbnVtYmVyIG9uIHRoZSBjb250YWluZXIgdGhhdCdzIGJvdW5kIHRvIHRoZSB1c2VyLXNwZWNpZmllZCBvciBhdXRvbWF0aWNhbGx5IGFzc2lnbmVkIGhvc3QgcG9ydC5cbiAqICBJZiB5b3UgdXNlIGNvbnRhaW5lcnMgaW4gYSB0YXNrIHdpdGggdGhlIGBgYXdzdnBjYGAgb3IgYGBob3N0YGAgbmV0d29yayBtb2RlLCBzcGVjaWZ5IHRoZSBleHBvc2VkIHBvcnRzIHVzaW5nIGBgY29udGFpbmVyUG9ydGBgLlxuICogIElmIHlvdSB1c2UgY29udGFpbmVycyBpbiBhIHRhc2sgd2l0aCB0aGUgYGBicmlkZ2VgYCBuZXR3b3JrIG1vZGUgYW5kIHlvdSBzcGVjaWZ5IGEgY29udGFpbmVyIHBvcnQgYW5kIG5vdCBhIGhvc3QgcG9ydCwgeW91ciBjb250YWluZXIgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGhvc3QgcG9ydCBpbiB0aGUgZXBoZW1lcmFsIHBvcnQgcmFuZ2UuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgYGBob3N0UG9ydGBgLiBQb3J0IG1hcHBpbmdzIHRoYXQgYXJlIGF1dG9tYXRpY2FsbHkgYXNzaWduZWQgaW4gdGhpcyB3YXkgZG8gbm90IGNvdW50IHRvd2FyZCB0aGUgMTAwIHJlc2VydmVkIHBvcnRzIGxpbWl0IG9mIGEgY29udGFpbmVyIGluc3RhbmNlLlxuICovXG5Db250YWluZXJQb3J0PzogbnVtYmVyXG4vKipcbiAqIFRoZSBwcm90b2NvbCB1c2VkIGZvciB0aGUgcG9ydCBtYXBwaW5nLiBWYWxpZCB2YWx1ZXMgYXJlIGBgdGNwYGAgYW5kIGBgdWRwYGAuIFRoZSBkZWZhdWx0IGlzIGBgdGNwYGAuIGBgcHJvdG9jb2xgYCBpcyBpbW11dGFibGUgaW4gYSBTZXJ2aWNlIENvbm5lY3Qgc2VydmljZS4gVXBkYXRpbmcgdGhpcyBmaWVsZCByZXF1aXJlcyBhIHNlcnZpY2UgZGVsZXRpb24gYW5kIHJlZGVwbG95bWVudC5cbiAqL1xuUHJvdG9jb2w/OiBzdHJpbmdcbi8qKlxuICogVGhlIG5hbWUgdGhhdCdzIHVzZWQgZm9yIHRoZSBwb3J0IG1hcHBpbmcuIFRoaXMgcGFyYW1ldGVyIGlzIHRoZSBuYW1lIHRoYXQgeW91IHVzZSBpbiB0aGUgYGBzZXJ2aWNlQ29ubmVjdENvbmZpZ3VyYXRpb25gYCBhbmQgdGhlIGBgdnBjTGF0dGljZUNvbmZpZ3VyYXRpb25zYGAgb2YgYSBzZXJ2aWNlLiBUaGUgbmFtZSBjYW4gaW5jbHVkZSB1cCB0byA2NCBjaGFyYWN0ZXJzLiBUaGUgY2hhcmFjdGVycyBjYW4gaW5jbHVkZSBsb3dlcmNhc2UgbGV0dGVycywgbnVtYmVycywgdW5kZXJzY29yZXMgKF8pLCBhbmQgaHlwaGVucyAoLSkuIFRoZSBuYW1lIGNhbid0IHN0YXJ0IHdpdGggYSBoeXBoZW4uXG4gKi9cbk5hbWU/OiBzdHJpbmdcbn1cbi8qKlxuICogVGhlIGVwaGVtZXJhbCBzdG9yYWdlIHNldHRpbmdzIHRvIHVzZSBmb3IgdGFza3MgcnVuIHdpdGggdGhlIHRhc2sgZGVmaW5pdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFcGhlbWVyYWxTdG9yYWdlIHtcbi8qKlxuICogVGhlIHRvdGFsIGFtb3VudCwgaW4gR2lCLCBvZiBlcGhlbWVyYWwgc3RvcmFnZSB0byBzZXQgZm9yIHRoZSB0YXNrLiBUaGUgbWluaW11bSBzdXBwb3J0ZWQgdmFsdWUgaXMgYGAyMWBgIEdpQiBhbmQgdGhlIG1heGltdW0gc3VwcG9ydGVkIHZhbHVlIGlzIGBgMjAwYGAgR2lCLlxuICovXG5TaXplSW5HaUI/OiBudW1iZXJcbn1cbi8qKlxuICogVGhlIG1ldGFkYXRhIHRoYXQgeW91IGFwcGx5IHRvIGEgcmVzb3VyY2UgdG8gaGVscCB5b3UgY2F0ZWdvcml6ZSBhbmQgb3JnYW5pemUgdGhlbS4gRWFjaCB0YWcgY29uc2lzdHMgb2YgYSBrZXkgYW5kIGFuIG9wdGlvbmFsIHZhbHVlLiBZb3UgZGVmaW5lIHRoZW0uXG4gKiAgVGhlIGZvbGxvd2luZyBiYXNpYyByZXN0cmljdGlvbnMgYXBwbHkgdG8gdGFnczpcbiAqICAgKyAgTWF4aW11bSBudW1iZXIgb2YgdGFncyBwZXIgcmVzb3VyY2UgLSA1MFxuICogICArICBGb3IgZWFjaCByZXNvdXJjZSwgZWFjaCB0YWcga2V5IG11c3QgYmUgdW5pcXVlLCBhbmQgZWFjaCB0YWcga2V5IGNhbiBoYXZlIG9ubHkgb25lIHZhbHVlLlxuICogICArICBNYXhpbXVtIGtleSBsZW5ndGggLSAxMjggVW5pY29kZSBjaGFyYWN0ZXJzIGluIFVURi04XG4gKiAgICsgIE1heGltdW0gdmFsdWUgbGVuZ3RoIC0gMjU2IFVuaWNvZGUgY2hhcmFjdGVycyBpbiBVVEYtOFxuICogICArICBJZiB5b3VyIHRhZ2dpbmcgc2NoZW1hIGlzIHVzZWQgYWNyb3NzIG11bHRpcGxlIHNlcnZpY2VzIGFuZCByZXNvdXJjZXMsIHJlbWVtYmVyIHRoYXQgb3RoZXIgc2VydmljZXMgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIGFsbG93ZWQgY2hhcmFjdGVycy4gR2VuZXJhbGx5IGFsbG93ZWQgY2hhcmFjdGVycyBhcmU6IGxldHRlcnMsIG51bWJlcnMsIGFuZCBzcGFjZXMgcmVwcmVzZW50YWJsZSBpbiBVVEYtOCwgYW5kIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyczogKyAtID0gLiBfIDogLyBALlxuICogICArICBUYWcga2V5cyBhbmQgdmFsdWVzIGFyZSBjYXNlLXNlbnNpdGl2ZS5cbiAqICAgKyAgRG8gbm90IHVzZSBgYGF3czpgYCwgYGBBV1M6YGAsIG9yIGFueSB1cHBlciBvciBsb3dlcmNhc2UgY29tYmluYXRpb24gb2Ygc3VjaCBhcyBhIHByZWZpeCBmb3IgZWl0aGVyIGtleXMgb3IgdmFsdWVzIGFzIGl0IGlzIHJlc2VydmVkIGZvciBBV1MgdXNlLiBZb3UgY2Fubm90IGVkaXQgb3IgZGVsZXRlIHRhZyBrZXlzIG9yIHZhbHVlcyB3aXRoIHRoaXMgcHJlZml4LiBUYWdzIHdpdGggdGhpcyBwcmVmaXggZG8gbm90IGNvdW50IGFnYWluc3QgeW91ciB0YWdzIHBlciByZXNvdXJjZSBsaW1pdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYWcge1xuLyoqXG4gKiBUaGUgb3B0aW9uYWwgcGFydCBvZiBhIGtleS12YWx1ZSBwYWlyIHRoYXQgbWFrZSB1cCBhIHRhZy4gQSBgYHZhbHVlYGAgYWN0cyBhcyBhIGRlc2NyaXB0b3Igd2l0aGluIGEgdGFnIGNhdGVnb3J5IChrZXkpLlxuICovXG5WYWx1ZT86IHN0cmluZ1xuLyoqXG4gKiBPbmUgcGFydCBvZiBhIGtleS12YWx1ZSBwYWlyIHRoYXQgbWFrZSB1cCBhIHRhZy4gQSBgYGtleWBgIGlzIGEgZ2VuZXJhbCBsYWJlbCB0aGF0IGFjdHMgbGlrZSBhIGNhdGVnb3J5IGZvciBtb3JlIHNwZWNpZmljIHRhZyB2YWx1ZXMuXG4gKi9cbktleT86IHN0cmluZ1xufVxuIl19
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzLWVjcy10YXNrZGVmaW5pdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImF3cy1lY3MtdGFza2RlZmluaXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUmVnaXN0ZXJzIGEgbmV3IHRhc2sgZGVmaW5pdGlvbiBmcm9tIHRoZSBzdXBwbGllZCBgYGZhbWlseWBgIGFuZCBgYGNvbnRhaW5lckRlZmluaXRpb25zYGAuIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGRhdGEgdm9sdW1lcyB0byB5b3VyIGNvbnRhaW5lcnMgd2l0aCB0aGUgYGB2b2x1bWVzYGAgcGFyYW1ldGVyLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0YXNrIGRlZmluaXRpb24gcGFyYW1ldGVycyBhbmQgZGVmYXVsdHMsIHNlZSBbQW1hem9uIEVDUyBUYXNrIERlZmluaXRpb25zXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS90YXNrX2RlZmludGlvbnMuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICogIFlvdSBjYW4gc3BlY2lmeSBhIHJvbGUgZm9yIHlvdXIgdGFzayB3aXRoIHRoZSBgYHRhc2tSb2xlQXJuYGAgcGFyYW1ldGVyLiBXaGVuIHlvdSBzcGVjaWZ5IGEgcm9sZSBmb3IgYSB0YXNrLCBpdHMgY29udGFpbmVycyBjYW4gdGhlbiB1c2UgdGhlIGxhdGVzdCB2ZXJzaW9ucyBvZiB0aGUgQ0xJIG9yIFNES3MgdG8gbWFrZSBBUEkgcmVxdWVzdHMgdG8gdGhlIEFXUyBzZXJ2aWNlcyB0aGF0IGFyZSBzcGVjaWZpZWQgaW4gdGhlIHBvbGljeSB0aGF0J3MgYXNzb2NpYXRlZCB3aXRoIHRoZSByb2xlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtJQU0gUm9sZXMgZm9yIFRhc2tzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS90YXNrLWlhbS1yb2xlcy5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKiAgWW91IGNhbiBzcGVjaWZ5IGEgRG9ja2VyIG5ldHdvcmtpbmcgbW9kZSBmb3IgdGhlIGNvbnRhaW5lcnMgaW4geW91ciB0YXNrIGRlZmluaXRpb24gd2l0aCB0aGUgYGBuZXR3b3JrTW9kZWBgIHBhcmFtZXRlci4gSWYgeW91IHNwZWNpZnkgdGhlIGBgYXdzdnBjYGAgbmV0d29yayBtb2RlLCB0aGUgdGFzayBpcyBhbGxvY2F0ZWQgYW4gZWxhc3RpYyBuZXR3b3JrIGludGVyZmFjZSwgYW5kIHlvdSBtdXN0IHNwZWNpZnkgYSBbTmV0d29ya0NvbmZpZ3VyYXRpb25dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTmV0d29ya0NvbmZpZ3VyYXRpb24uaHRtbCkgd2hlbiB5b3UgY3JlYXRlIGEgc2VydmljZSBvciBydW4gYSB0YXNrIHdpdGggdGhlIHRhc2sgZGVmaW5pdGlvbi4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbVGFzayBOZXR3b3JraW5nXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS90YXNrLW5ldHdvcmtpbmcuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICogICBJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUgb3IgZXhhbXBsZXMsIHRoZSBBdXRob3JpemF0aW9uIGhlYWRlciBjb250ZW50cyAoYGBBVVRIUEFSQU1TYGApIG11c3QgYmUgcmVwbGFjZWQgd2l0aCBhbiBBV1MgU2lnbmF0dXJlIFZlcnNpb24gNCBzaWduYXR1cmUuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1NpZ25hdHVyZSBWZXJzaW9uIDQgU2lnbmluZyBQcm9jZXNzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2VuZXJhbC9sYXRlc3QvZ3Ivc2lnbmF0dXJlLXZlcnNpb24tNC5odG1sKSBpbiB0aGUgKkdlbmVyYWwgUmVmZXJlbmNlKi5cbiAqICBZb3Ugb25seSBuZWVkIHRvIGxlYXJuIGhvdyB0byBzaWduIEhUVFAgcmVxdWVzdHMgaWYgeW91IGludGVuZCB0byBjcmVhdGUgdGhlbSBtYW51YWxseS4gV2hlbiB5b3UgdXNlIHRoZSBbXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xpLykgb3Igb25lIG9mIHRoZSBbU0RLc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3Rvb2xzLykgdG8gbWFrZSByZXF1ZXN0cyB0byBBV1MsIHRoZXNlIHRvb2xzIGF1dG9tYXRpY2FsbHkgc2lnbiB0aGUgcmVxdWVzdHMgZm9yIHlvdSwgd2l0aCB0aGUgYWNjZXNzIGtleSB0aGF0IHlvdSBzcGVjaWZ5IHdoZW4geW91IGNvbmZpZ3VyZSB0aGUgdG9vbHMuIFdoZW4geW91IHVzZSB0aGVzZSB0b29scywgeW91IGRvbid0IGhhdmUgdG8gc2lnbiByZXF1ZXN0cyB5b3Vyc2VsZi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBfQVdTX0VDU19UQVNLREVGSU5JVElPTiB7XG4vKipcbiAqIFRoZSBzaG9ydCBuYW1lIG9yIGZ1bGwgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIElBTWxvbmcgcm9sZSB0aGF0IGdyYW50cyBjb250YWluZXJzIGluIHRoZSB0YXNrIHBlcm1pc3Npb24gdG8gY2FsbCBBV1MgQVBJcyBvbiB5b3VyIGJlaGFsZi4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQW1hem9uIEVDUyBUYXNrIFJvbGVdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3Rhc2staWFtLXJvbGVzLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICBJQU0gcm9sZXMgZm9yIHRhc2tzIG9uIFdpbmRvd3MgcmVxdWlyZSB0aGF0IHRoZSBgYC1FbmFibGVUYXNrSUFNUm9sZWBgIG9wdGlvbiBpcyBzZXQgd2hlbiB5b3UgbGF1bmNoIHRoZSBBbWF6b24gRUNTLW9wdGltaXplZCBXaW5kb3dzIEFNSS4gWW91ciBjb250YWluZXJzIG11c3QgYWxzbyBydW4gc29tZSBjb25maWd1cmF0aW9uIGNvZGUgdG8gdXNlIHRoZSBmZWF0dXJlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtXaW5kb3dzIElBTSByb2xlcyBmb3IgdGFza3NdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3dpbmRvd3NfdGFza19JQU1fcm9sZXMuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICogICBTdHJpbmcgdmFsaWRhdGlvbiBpcyBkb25lIG9uIHRoZSBFQ1Mgc2lkZS4gSWYgYW4gaW52YWxpZCBzdHJpbmcgdmFsdWUgaXMgZ2l2ZW4gZm9yIGBgVGFza1JvbGVBcm5gYCwgaXQgbWF5IGNhdXNlIHRoZSBDbG91ZGZvcm1hdGlvbiBqb2IgdG8gaGFuZy5cbiAqL1xuVGFza1JvbGVBcm4/OiBzdHJpbmdcbi8qKlxuICogVGhlIElQQyByZXNvdXJjZSBuYW1lc3BhY2UgdG8gdXNlIGZvciB0aGUgY29udGFpbmVycyBpbiB0aGUgdGFzay4gVGhlIHZhbGlkIHZhbHVlcyBhcmUgYGBob3N0YGAsIGBgdGFza2BgLCBvciBgYG5vbmVgYC4gSWYgYGBob3N0YGAgaXMgc3BlY2lmaWVkLCB0aGVuIGFsbCBjb250YWluZXJzIHdpdGhpbiB0aGUgdGFza3MgdGhhdCBzcGVjaWZpZWQgdGhlIGBgaG9zdGBgIElQQyBtb2RlIG9uIHRoZSBzYW1lIGNvbnRhaW5lciBpbnN0YW5jZSBzaGFyZSB0aGUgc2FtZSBJUEMgcmVzb3VyY2VzIHdpdGggdGhlIGhvc3QgQW1hem9uIEVDMiBpbnN0YW5jZS4gSWYgYGB0YXNrYGAgaXMgc3BlY2lmaWVkLCBhbGwgY29udGFpbmVycyB3aXRoaW4gdGhlIHNwZWNpZmllZCB0YXNrIHNoYXJlIHRoZSBzYW1lIElQQyByZXNvdXJjZXMuIElmIGBgbm9uZWBgIGlzIHNwZWNpZmllZCwgdGhlbiBJUEMgcmVzb3VyY2VzIHdpdGhpbiB0aGUgY29udGFpbmVycyBvZiBhIHRhc2sgYXJlIHByaXZhdGUgYW5kIG5vdCBzaGFyZWQgd2l0aCBvdGhlciBjb250YWluZXJzIGluIGEgdGFzayBvciBvbiB0aGUgY29udGFpbmVyIGluc3RhbmNlLiBJZiBubyB2YWx1ZSBpcyBzcGVjaWZpZWQsIHRoZW4gdGhlIElQQyByZXNvdXJjZSBuYW1lc3BhY2Ugc2hhcmluZyBkZXBlbmRzIG9uIHRoZSBEb2NrZXIgZGFlbW9uIHNldHRpbmcgb24gdGhlIGNvbnRhaW5lciBpbnN0YW5jZS5cbiAqICBJZiB0aGUgYGBob3N0YGAgSVBDIG1vZGUgaXMgdXNlZCwgYmUgYXdhcmUgdGhhdCB0aGVyZSBpcyBhIGhlaWdodGVuZWQgcmlzayBvZiB1bmRlc2lyZWQgSVBDIG5hbWVzcGFjZSBleHBvc2UuXG4gKiAgSWYgeW91IGFyZSBzZXR0aW5nIG5hbWVzcGFjZWQga2VybmVsIHBhcmFtZXRlcnMgdXNpbmcgYGBzeXN0ZW1Db250cm9sc2BgIGZvciB0aGUgY29udGFpbmVycyBpbiB0aGUgdGFzaywgdGhlIGZvbGxvd2luZyB3aWxsIGFwcGx5IHRvIHlvdXIgSVBDIHJlc291cmNlIG5hbWVzcGFjZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbU3lzdGVtIENvbnRyb2xzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS90YXNrX2RlZmluaXRpb25fcGFyYW1ldGVycy5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKiAgICsgIEZvciB0YXNrcyB0aGF0IHVzZSB0aGUgYGBob3N0YGAgSVBDIG1vZGUsIElQQyBuYW1lc3BhY2UgcmVsYXRlZCBgYHN5c3RlbUNvbnRyb2xzYGAgYXJlIG5vdCBzdXBwb3J0ZWQuXG4gKiAgICsgIEZvciB0YXNrcyB0aGF0IHVzZSB0aGUgYGB0YXNrYGAgSVBDIG1vZGUsIElQQyBuYW1lc3BhY2UgcmVsYXRlZCBgYHN5c3RlbUNvbnRyb2xzYGAgd2lsbCBhcHBseSB0byBhbGwgY29udGFpbmVycyB3aXRoaW4gYSB0YXNrLlxuICogICBcbiAqICAgVGhpcyBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZCBmb3IgV2luZG93cyBjb250YWluZXJzIG9yIHRhc2tzIHJ1biBvbiBGQVJHQVRFbG9uZy5cbiAqL1xuSXBjTW9kZT86IHN0cmluZ1xuSW5mZXJlbmNlQWNjZWxlcmF0b3JzPzogSW5mZXJlbmNlQWNjZWxlcmF0b3JbXVxuLyoqXG4gKiBUaGUgYW1vdW50IChpbiBNaUIpIG9mIG1lbW9yeSB1c2VkIGJ5IHRoZSB0YXNrLlxuICogIElmIHlvdXIgdGFza3MgcnVucyBvbiBBbWF6b24gRUMyIGluc3RhbmNlcywgeW91IG11c3Qgc3BlY2lmeSBlaXRoZXIgYSB0YXNrLWxldmVsIG1lbW9yeSB2YWx1ZSBvciBhIGNvbnRhaW5lci1sZXZlbCBtZW1vcnkgdmFsdWUuIFRoaXMgZmllbGQgaXMgb3B0aW9uYWwgYW5kIGFueSB2YWx1ZSBjYW4gYmUgdXNlZC4gSWYgYSB0YXNrLWxldmVsIG1lbW9yeSB2YWx1ZSBpcyBzcGVjaWZpZWQsIHRoZSBjb250YWluZXItbGV2ZWwgbWVtb3J5IHZhbHVlIGlzIG9wdGlvbmFsLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29udGFpbmVyLWxldmVsIG1lbW9yeSBhbmQgbWVtb3J5IHJlc2VydmF0aW9uLCBzZWUgW0NvbnRhaW5lckRlZmluaXRpb25dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ29udGFpbmVyRGVmaW5pdGlvbi5odG1sKS5cbiAqICBJZiB5b3VyIHRhc2tzIHJ1bnMgb24gRkFSR0FURWxvbmcsIHRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIFlvdSBtdXN0IHVzZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMuIFRoZSB2YWx1ZSB5b3UgY2hvb3NlIGRldGVybWluZXMgeW91ciByYW5nZSBvZiB2YWxpZCB2YWx1ZXMgZm9yIHRoZSBgYGNwdWBgIHBhcmFtZXRlci5cbiAqICAgKyAgNTEyICgwLjUgR0IpLCAxMDI0ICgxIEdCKSwgMjA0OCAoMiBHQikgLSBBdmFpbGFibGUgYGBjcHVgYCB2YWx1ZXM6IDI1NiAoLjI1IHZDUFUpXG4gKiAgICsgIDEwMjQgKDEgR0IpLCAyMDQ4ICgyIEdCKSwgMzA3MiAoMyBHQiksIDQwOTYgKDQgR0IpIC0gQXZhaWxhYmxlIGBgY3B1YGAgdmFsdWVzOiA1MTIgKC41IHZDUFUpXG4gKiAgICsgIDIwNDggKDIgR0IpLCAzMDcyICgzIEdCKSwgNDA5NiAoNCBHQiksIDUxMjAgKDUgR0IpLCA2MTQ0ICg2IEdCKSwgNzE2OCAoNyBHQiksIDgxOTIgKDggR0IpIC0gQXZhaWxhYmxlIGBgY3B1YGAgdmFsdWVzOiAxMDI0ICgxIHZDUFUpXG4gKiAgICsgIEJldHdlZW4gNDA5NiAoNCBHQikgYW5kIDE2Mzg0ICgxNiBHQikgaW4gaW5jcmVtZW50cyBvZiAxMDI0ICgxIEdCKSAtIEF2YWlsYWJsZSBgYGNwdWBgIHZhbHVlczogMjA0OCAoMiB2Q1BVKVxuICogICArICBCZXR3ZWVuIDgxOTIgKDggR0IpIGFuZCAzMDcyMCAoMzAgR0IpIGluIGluY3JlbWVudHMgb2YgMTAyNCAoMSBHQikgLSBBdmFpbGFibGUgYGBjcHVgYCB2YWx1ZXM6IDQwOTYgKDQgdkNQVSlcbiAqICAgKyAgQmV0d2VlbiAxNiBHQiBhbmQgNjAgR0IgaW4gNCBHQiBpbmNyZW1lbnRzIC0gQXZhaWxhYmxlIGBgY3B1YGAgdmFsdWVzOiA4MTkyICg4IHZDUFUpXG4gKiAgVGhpcyBvcHRpb24gcmVxdWlyZXMgTGludXggcGxhdGZvcm0gYGAxLjQuMGBgIG9yIGxhdGVyLlxuICogICArICBCZXR3ZWVuIDMyR0IgYW5kIDEyMCBHQiBpbiA4IEdCIGluY3JlbWVudHMgLSBBdmFpbGFibGUgYGBjcHVgYCB2YWx1ZXM6IDE2Mzg0ICgxNiB2Q1BVKVxuICogIFRoaXMgb3B0aW9uIHJlcXVpcmVzIExpbnV4IHBsYXRmb3JtIGBgMS40LjBgYCBvciBsYXRlci5cbiAqL1xuTWVtb3J5Pzogc3RyaW5nXG4vKipcbiAqIEFuIGFycmF5IG9mIHBsYWNlbWVudCBjb25zdHJhaW50IG9iamVjdHMgdG8gdXNlIGZvciB0YXNrcy5cbiAqICAgVGhpcyBwYXJhbWV0ZXIgaXNuJ3Qgc3VwcG9ydGVkIGZvciB0YXNrcyBydW4gb24gRkFSR0FURWxvbmcuXG4gKi9cblBsYWNlbWVudENvbnN0cmFpbnRzPzogVGFza0RlZmluaXRpb25QbGFjZW1lbnRDb25zdHJhaW50W11cbi8qKlxuICogVGhlIG51bWJlciBvZiBgYGNwdWBgIHVuaXRzIHVzZWQgYnkgdGhlIHRhc2suIElmIHlvdSB1c2UgdGhlIEVDMiBsYXVuY2ggdHlwZSwgdGhpcyBmaWVsZCBpcyBvcHRpb25hbC4gQW55IHZhbHVlIGNhbiBiZSB1c2VkLiBJZiB5b3UgdXNlIHRoZSBGYXJnYXRlIGxhdW5jaCB0eXBlLCB0aGlzIGZpZWxkIGlzIHJlcXVpcmVkLiBZb3UgbXVzdCB1c2Ugb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzLiBUaGUgdmFsdWUgdGhhdCB5b3UgY2hvb3NlIGRldGVybWluZXMgeW91ciByYW5nZSBvZiB2YWxpZCB2YWx1ZXMgZm9yIHRoZSBgYG1lbW9yeWBgIHBhcmFtZXRlci5cbiAqICBJZiB5b3UncmUgdXNpbmcgdGhlIEVDMiBsYXVuY2ggdHlwZSBvciB0aGUgZXh0ZXJuYWwgbGF1bmNoIHR5cGUsIHRoaXMgZmllbGQgaXMgb3B0aW9uYWwuIFN1cHBvcnRlZCB2YWx1ZXMgYXJlIGJldHdlZW4gYGAxMjhgYCBDUFUgdW5pdHMgKGBgMC4xMjVgYCB2Q1BVcykgYW5kIGBgMTk2NjA4YGAgQ1BVIHVuaXRzIChgYDE5MmBgIHZDUFVzKS4gXG4gKiAgVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBmb3IgRmFyZ2F0ZS4gRm9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSB2YWxpZCB2YWx1ZXMsIHNlZSBbVGFzayBzaXplXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS90YXNrX2RlZmluaXRpb25fcGFyYW1ldGVycy5odG1sI3Rhc2tfc2l6ZSkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5DcHU/OiBzdHJpbmdcbi8qKlxuICogVGhlIHRhc2sgbGF1bmNoIHR5cGVzIHRoZSB0YXNrIGRlZmluaXRpb24gd2FzIHZhbGlkYXRlZCBhZ2FpbnN0LiBUaGUgdmFsaWQgdmFsdWVzIGFyZSBgYEVDMmBgLCBgYEZBUkdBVEVgYCwgYW5kIGBgRVhURVJOQUxgYC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQW1hem9uIEVDUyBsYXVuY2ggdHlwZXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2xhdW5jaF90eXBlcy5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKi9cblJlcXVpcmVzQ29tcGF0aWJpbGl0aWVzPzogc3RyaW5nW11cbi8qKlxuICogVGhlIERvY2tlciBuZXR3b3JraW5nIG1vZGUgdG8gdXNlIGZvciB0aGUgY29udGFpbmVycyBpbiB0aGUgdGFzay4gVGhlIHZhbGlkIHZhbHVlcyBhcmUgYGBub25lYGAsIGBgYnJpZGdlYGAsIGBgYXdzdnBjYGAsIGFuZCBgYGhvc3RgYC4gSWYgbm8gbmV0d29yayBtb2RlIGlzIHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgaXMgYGBicmlkZ2VgYC5cbiAqICBGb3IgQW1hem9uIEVDUyB0YXNrcyBvbiBGYXJnYXRlLCB0aGUgYGBhd3N2cGNgYCBuZXR3b3JrIG1vZGUgaXMgcmVxdWlyZWQuIEZvciBBbWF6b24gRUNTIHRhc2tzIG9uIEFtYXpvbiBFQzIgTGludXggaW5zdGFuY2VzLCBhbnkgbmV0d29yayBtb2RlIGNhbiBiZSB1c2VkLiBGb3IgQW1hem9uIEVDUyB0YXNrcyBvbiBBbWF6b24gRUMyIFdpbmRvd3MgaW5zdGFuY2VzLCBgYDxkZWZhdWx0PmBgIG9yIGBgYXdzdnBjYGAgY2FuIGJlIHVzZWQuIElmIHRoZSBuZXR3b3JrIG1vZGUgaXMgc2V0IHRvIGBgbm9uZWBgLCB5b3UgY2Fubm90IHNwZWNpZnkgcG9ydCBtYXBwaW5ncyBpbiB5b3VyIGNvbnRhaW5lciBkZWZpbml0aW9ucywgYW5kIHRoZSB0YXNrcyBjb250YWluZXJzIGRvIG5vdCBoYXZlIGV4dGVybmFsIGNvbm5lY3Rpdml0eS4gVGhlIGBgaG9zdGBgIGFuZCBgYGF3c3ZwY2BgIG5ldHdvcmsgbW9kZXMgb2ZmZXIgdGhlIGhpZ2hlc3QgbmV0d29ya2luZyBwZXJmb3JtYW5jZSBmb3IgY29udGFpbmVycyBiZWNhdXNlIHRoZXkgdXNlIHRoZSBFQzIgbmV0d29yayBzdGFjayBpbnN0ZWFkIG9mIHRoZSB2aXJ0dWFsaXplZCBuZXR3b3JrIHN0YWNrIHByb3ZpZGVkIGJ5IHRoZSBgYGJyaWRnZWBgIG1vZGUuXG4gKiAgV2l0aCB0aGUgYGBob3N0YGAgYW5kIGBgYXdzdnBjYGAgbmV0d29yayBtb2RlcywgZXhwb3NlZCBjb250YWluZXIgcG9ydHMgYXJlIG1hcHBlZCBkaXJlY3RseSB0byB0aGUgY29ycmVzcG9uZGluZyBob3N0IHBvcnQgKGZvciB0aGUgYGBob3N0YGAgbmV0d29yayBtb2RlKSBvciB0aGUgYXR0YWNoZWQgZWxhc3RpYyBuZXR3b3JrIGludGVyZmFjZSBwb3J0IChmb3IgdGhlIGBgYXdzdnBjYGAgbmV0d29yayBtb2RlKSwgc28geW91IGNhbm5vdCB0YWtlIGFkdmFudGFnZSBvZiBkeW5hbWljIGhvc3QgcG9ydCBtYXBwaW5ncy4gXG4gKiAgIFdoZW4gdXNpbmcgdGhlIGBgaG9zdGBgIG5ldHdvcmsgbW9kZSwgeW91IHNob3VsZCBub3QgcnVuIGNvbnRhaW5lcnMgdXNpbmcgdGhlIHJvb3QgdXNlciAoVUlEIDApLiBJdCBpcyBjb25zaWRlcmVkIGJlc3QgcHJhY3RpY2UgdG8gdXNlIGEgbm9uLXJvb3QgdXNlci5cbiAqICAgSWYgdGhlIG5ldHdvcmsgbW9kZSBpcyBgYGF3c3ZwY2BgLCB0aGUgdGFzayBpcyBhbGxvY2F0ZWQgYW4gZWxhc3RpYyBuZXR3b3JrIGludGVyZmFjZSwgYW5kIHlvdSBtdXN0IHNwZWNpZnkgYSBbTmV0d29ya0NvbmZpZ3VyYXRpb25dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTmV0d29ya0NvbmZpZ3VyYXRpb24uaHRtbCkgdmFsdWUgd2hlbiB5b3UgY3JlYXRlIGEgc2VydmljZSBvciBydW4gYSB0YXNrIHdpdGggdGhlIHRhc2sgZGVmaW5pdGlvbi4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbVGFzayBOZXR3b3JraW5nXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS90YXNrLW5ldHdvcmtpbmcuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICogIElmIHRoZSBuZXR3b3JrIG1vZGUgaXMgYGBob3N0YGAsIHlvdSBjYW5ub3QgcnVuIG11bHRpcGxlIGluc3RhbnRpYXRpb25zIG9mIHRoZSBzYW1lIHRhc2sgb24gYSBzaW5nbGUgY29udGFpbmVyIGluc3RhbmNlIHdoZW4gcG9ydCBtYXBwaW5ncyBhcmUgdXNlZC5cbiAqL1xuTmV0d29ya01vZGU/OiBzdHJpbmdcbi8qKlxuICogVGhlIHByb2Nlc3MgbmFtZXNwYWNlIHRvIHVzZSBmb3IgdGhlIGNvbnRhaW5lcnMgaW4gdGhlIHRhc2suIFRoZSB2YWxpZCB2YWx1ZXMgYXJlIGBgaG9zdGBgIG9yIGBgdGFza2BgLiBPbiBGYXJnYXRlIGZvciBMaW51eCBjb250YWluZXJzLCB0aGUgb25seSB2YWxpZCB2YWx1ZSBpcyBgYHRhc2tgYC4gRm9yIGV4YW1wbGUsIG1vbml0b3Jpbmcgc2lkZWNhcnMgbWlnaHQgbmVlZCBgYHBpZE1vZGVgYCB0byBhY2Nlc3MgaW5mb3JtYXRpb24gYWJvdXQgb3RoZXIgY29udGFpbmVycyBydW5uaW5nIGluIHRoZSBzYW1lIHRhc2suXG4gKiAgSWYgYGBob3N0YGAgaXMgc3BlY2lmaWVkLCBhbGwgY29udGFpbmVycyB3aXRoaW4gdGhlIHRhc2tzIHRoYXQgc3BlY2lmaWVkIHRoZSBgYGhvc3RgYCBQSUQgbW9kZSBvbiB0aGUgc2FtZSBjb250YWluZXIgaW5zdGFuY2Ugc2hhcmUgdGhlIHNhbWUgcHJvY2VzcyBuYW1lc3BhY2Ugd2l0aCB0aGUgaG9zdCBBbWF6b24gRUMyIGluc3RhbmNlLlxuICogIElmIGBgdGFza2BgIGlzIHNwZWNpZmllZCwgYWxsIGNvbnRhaW5lcnMgd2l0aGluIHRoZSBzcGVjaWZpZWQgdGFzayBzaGFyZSB0aGUgc2FtZSBwcm9jZXNzIG5hbWVzcGFjZS5cbiAqICBJZiBubyB2YWx1ZSBpcyBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IGlzIGEgcHJpdmF0ZSBuYW1lc3BhY2UgZm9yIGVhY2ggY29udGFpbmVyLlxuICogIElmIHRoZSBgYGhvc3RgYCBQSUQgbW9kZSBpcyB1c2VkLCB0aGVyZSdzIGEgaGVpZ2h0ZW5lZCByaXNrIG9mIHVuZGVzaXJlZCBwcm9jZXNzIG5hbWVzcGFjZSBleHBvc3VyZS5cbiAqICAgVGhpcyBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZCBmb3IgV2luZG93cyBjb250YWluZXJzLlxuICogICAgVGhpcyBwYXJhbWV0ZXIgaXMgb25seSBzdXBwb3J0ZWQgZm9yIHRhc2tzIHRoYXQgYXJlIGhvc3RlZCBvbiBGQVJHQVRFbG9uZyBpZiB0aGUgdGFza3MgYXJlIHVzaW5nIHBsYXRmb3JtIHZlcnNpb24gYGAxLjQuMGBgIG9yIGxhdGVyIChMaW51eCkuIFRoaXMgaXNuJ3Qgc3VwcG9ydGVkIGZvciBXaW5kb3dzIGNvbnRhaW5lcnMgb24gRmFyZ2F0ZS5cbiAqL1xuUGlkTW9kZT86IHN0cmluZ1xuLyoqXG4gKiBFbmFibGVzIGZhdWx0IGluamVjdGlvbiBhbmQgYWxsb3dzIGZvciBmYXVsdCBpbmplY3Rpb24gcmVxdWVzdHMgdG8gYmUgYWNjZXB0ZWQgZnJvbSB0aGUgdGFzaydzIGNvbnRhaW5lcnMuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBgZmFsc2VgYC5cbiAqL1xuRW5hYmxlRmF1bHRJbmplY3Rpb24/OiBib29sZWFuXG4vKipcbiAqIFRoZSBBbWF6b24gUmVzb3VyY2UgTmFtZSAoQVJOKSBvZiB0aGUgdGFzayBleGVjdXRpb24gcm9sZSB0aGF0IGdyYW50cyB0aGUgQW1hem9uIEVDUyBjb250YWluZXIgYWdlbnQgcGVybWlzc2lvbiB0byBtYWtlIEFXUyBBUEkgY2FsbHMgb24geW91ciBiZWhhbGYuIEZvciBpbmZvcm1hdGlvbmFib3V0IHRoZSByZXF1aXJlZCBJQU0gcm9sZXMgZm9yIEFtYXpvbiBFQ1MsIHNlZSBbSUFNIHJvbGVzIGZvciBBbWF6b24gRUNTXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9zZWN1cml0eS1lY3MtaWFtLXJvbGUtb3ZlcnZpZXcuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5FeGVjdXRpb25Sb2xlQXJuPzogc3RyaW5nXG5SdW50aW1lUGxhdGZvcm0/OiBSdW50aW1lUGxhdGZvcm1cblByb3h5Q29uZmlndXJhdGlvbj86IFByb3h5Q29uZmlndXJhdGlvblxuLyoqXG4gKiBUaGUgbGlzdCBvZiBkYXRhIHZvbHVtZSBkZWZpbml0aW9ucyBmb3IgdGhlIHRhc2suIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1VzaW5nIGRhdGEgdm9sdW1lcyBpbiB0YXNrc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvdXNpbmdfZGF0YV92b2x1bWVzLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICAgVGhlIGBgaG9zdGBgIGFuZCBgYHNvdXJjZVBhdGhgYCBwYXJhbWV0ZXJzIGFyZW4ndCBzdXBwb3J0ZWQgZm9yIHRhc2tzIHJ1biBvbiBGQVJHQVRFbG9uZy5cbiAqL1xuVm9sdW1lcz86IFZvbHVtZVtdXG4vKipcbiAqIEEgbGlzdCBvZiBjb250YWluZXIgZGVmaW5pdGlvbnMgaW4gSlNPTiBmb3JtYXQgdGhhdCBkZXNjcmliZSB0aGUgZGlmZmVyZW50IGNvbnRhaW5lcnMgdGhhdCBtYWtlIHVwIHlvdXIgdGFzay4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgY29udGFpbmVyIGRlZmluaXRpb24gcGFyYW1ldGVycyBhbmQgZGVmYXVsdHMsIHNlZSBbQW1hem9uIEVDUyBUYXNrIERlZmluaXRpb25zXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS90YXNrX2RlZmludGlvbnMuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5Db250YWluZXJEZWZpbml0aW9ucz86IENvbnRhaW5lckRlZmluaXRpb25bXVxuLyoqXG4gKiBUaGUgbmFtZSBvZiBhIGZhbWlseSB0aGF0IHRoaXMgdGFzayBkZWZpbml0aW9uIGlzIHJlZ2lzdGVyZWQgdG8uIFVwIHRvIDI1NSBsZXR0ZXJzICh1cHBlcmNhc2UgYW5kIGxvd2VyY2FzZSksIG51bWJlcnMsIGh5cGhlbnMsIGFuZCB1bmRlcnNjb3JlcyBhcmUgYWxsb3dlZC5cbiAqICBBIGZhbWlseSBncm91cHMgbXVsdGlwbGUgdmVyc2lvbnMgb2YgYSB0YXNrIGRlZmluaXRpb24uIEFtYXpvbiBFQ1MgZ2l2ZXMgdGhlIGZpcnN0IHRhc2sgZGVmaW5pdGlvbiB0aGF0IHlvdSByZWdpc3RlcmVkIHRvIGEgZmFtaWx5IGEgcmV2aXNpb24gbnVtYmVyIG9mIDEuIEFtYXpvbiBFQ1MgZ2l2ZXMgc2VxdWVudGlhbCByZXZpc2lvbiBudW1iZXJzIHRvIGVhY2ggdGFzayBkZWZpbml0aW9uIHRoYXQgeW91IGFkZC5cbiAqICAgVG8gdXNlIHJldmlzaW9uIG51bWJlcnMgd2hlbiB5b3UgdXBkYXRlIGEgdGFzayBkZWZpbml0aW9uLCBzcGVjaWZ5IHRoaXMgcHJvcGVydHkuIElmIHlvdSBkb24ndCBzcGVjaWZ5IGEgdmFsdWUsIENGTmxvbmcgZ2VuZXJhdGVzIGEgbmV3IHRhc2sgZGVmaW5pdGlvbiBlYWNoIHRpbWUgdGhhdCB5b3UgdXBkYXRlIGl0LlxuICovXG5GYW1pbHk/OiBzdHJpbmdcbkVwaGVtZXJhbFN0b3JhZ2U/OiBFcGhlbWVyYWxTdG9yYWdlXG4vKipcbiAqIFRoZSBtZXRhZGF0YSB0aGF0IHlvdSBhcHBseSB0byB0aGUgdGFzayBkZWZpbml0aW9uIHRvIGhlbHAgeW91IGNhdGVnb3JpemUgYW5kIG9yZ2FuaXplIHRoZW0uIEVhY2ggdGFnIGNvbnNpc3RzIG9mIGEga2V5IGFuZCBhbiBvcHRpb25hbCB2YWx1ZS4gWW91IGRlZmluZSBib3RoIG9mIHRoZW0uXG4gKiAgVGhlIGZvbGxvd2luZyBiYXNpYyByZXN0cmljdGlvbnMgYXBwbHkgdG8gdGFnczpcbiAqICAgKyAgTWF4aW11bSBudW1iZXIgb2YgdGFncyBwZXIgcmVzb3VyY2UgLSA1MFxuICogICArICBGb3IgZWFjaCByZXNvdXJjZSwgZWFjaCB0YWcga2V5IG11c3QgYmUgdW5pcXVlLCBhbmQgZWFjaCB0YWcga2V5IGNhbiBoYXZlIG9ubHkgb25lIHZhbHVlLlxuICogICArICBNYXhpbXVtIGtleSBsZW5ndGggLSAxMjggVW5pY29kZSBjaGFyYWN0ZXJzIGluIFVURi04XG4gKiAgICsgIE1heGltdW0gdmFsdWUgbGVuZ3RoIC0gMjU2IFVuaWNvZGUgY2hhcmFjdGVycyBpbiBVVEYtOFxuICogICArICBJZiB5b3VyIHRhZ2dpbmcgc2NoZW1hIGlzIHVzZWQgYWNyb3NzIG11bHRpcGxlIHNlcnZpY2VzIGFuZCByZXNvdXJjZXMsIHJlbWVtYmVyIHRoYXQgb3RoZXIgc2VydmljZXMgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIGFsbG93ZWQgY2hhcmFjdGVycy4gR2VuZXJhbGx5IGFsbG93ZWQgY2hhcmFjdGVycyBhcmU6IGxldHRlcnMsIG51bWJlcnMsIGFuZCBzcGFjZXMgcmVwcmVzZW50YWJsZSBpbiBVVEYtOCwgYW5kIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyczogKyAtID0gLiBfIDogLyBALlxuICogICArICBUYWcga2V5cyBhbmQgdmFsdWVzIGFyZSBjYXNlLXNlbnNpdGl2ZS5cbiAqICAgKyAgRG8gbm90IHVzZSBgYGF3czpgYCwgYGBBV1M6YGAsIG9yIGFueSB1cHBlciBvciBsb3dlcmNhc2UgY29tYmluYXRpb24gb2Ygc3VjaCBhcyBhIHByZWZpeCBmb3IgZWl0aGVyIGtleXMgb3IgdmFsdWVzIGFzIGl0IGlzIHJlc2VydmVkIGZvciBBV1MgdXNlLiBZb3UgY2Fubm90IGVkaXQgb3IgZGVsZXRlIHRhZyBrZXlzIG9yIHZhbHVlcyB3aXRoIHRoaXMgcHJlZml4LiBUYWdzIHdpdGggdGhpcyBwcmVmaXggZG8gbm90IGNvdW50IGFnYWluc3QgeW91ciB0YWdzIHBlciByZXNvdXJjZSBsaW1pdC5cbiAqL1xuVGFncz86IFRhZ1tdXG5UYXNrRGVmaW5pdGlvbkFybj86IHN0cmluZ1xufVxuZXhwb3J0IGludGVyZmFjZSBJbmZlcmVuY2VBY2NlbGVyYXRvciB7XG5EZXZpY2VUeXBlPzogc3RyaW5nXG5EZXZpY2VOYW1lPzogc3RyaW5nXG59XG4vKipcbiAqIFRoZSBjb25zdHJhaW50IG9uIHRhc2sgcGxhY2VtZW50IGluIHRoZSB0YXNrIGRlZmluaXRpb24uIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1Rhc2sgcGxhY2VtZW50IGNvbnN0cmFpbnRzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS90YXNrLXBsYWNlbWVudC1jb25zdHJhaW50cy5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKiAgIFRhc2sgcGxhY2VtZW50IGNvbnN0cmFpbnRzIGFyZW4ndCBzdXBwb3J0ZWQgZm9yIHRhc2tzIHJ1biBvbiBGQVJHQVRFbG9uZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYXNrRGVmaW5pdGlvblBsYWNlbWVudENvbnN0cmFpbnQge1xuLyoqXG4gKiBUaGUgdHlwZSBvZiBjb25zdHJhaW50LiBUaGUgYGBNZW1iZXJPZmBgIGNvbnN0cmFpbnQgcmVzdHJpY3RzIHNlbGVjdGlvbiB0byBiZSBmcm9tIGEgZ3JvdXAgb2YgdmFsaWQgY2FuZGlkYXRlcy5cbiAqL1xuVHlwZTogc3RyaW5nXG4vKipcbiAqIEEgY2x1c3RlciBxdWVyeSBsYW5ndWFnZSBleHByZXNzaW9uIHRvIGFwcGx5IHRvIHRoZSBjb25zdHJhaW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtDbHVzdGVyIHF1ZXJ5IGxhbmd1YWdlXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9jbHVzdGVyLXF1ZXJ5LWxhbmd1YWdlLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuRXhwcmVzc2lvbj86IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgb3BlcmF0aW5nIHN5c3RlbSB0aGF0IHlvdXIgdGFza3MgZGVmaW5pdGlvbnMgcnVuIG9uLiBBIHBsYXRmb3JtIGZhbWlseSBpcyBzcGVjaWZpZWQgb25seSBmb3IgdGFza3MgdXNpbmcgdGhlIEZhcmdhdGUgbGF1bmNoIHR5cGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVudGltZVBsYXRmb3JtIHtcbi8qKlxuICogVGhlIG9wZXJhdGluZyBzeXN0ZW0uXG4gKi9cbk9wZXJhdGluZ1N5c3RlbUZhbWlseT86IHN0cmluZ1xuLyoqXG4gKiBUaGUgQ1BVIGFyY2hpdGVjdHVyZS5cbiAqICBZb3UgY2FuIHJ1biB5b3VyIExpbnV4IHRhc2tzIG9uIGFuIEFSTS1iYXNlZCBwbGF0Zm9ybSBieSBzZXR0aW5nIHRoZSB2YWx1ZSB0byBgYEFSTTY0YGAuIFRoaXMgb3B0aW9uIGlzIGF2YWlsYWJsZSBmb3IgdGFza3MgdGhhdCBydW4gb24gTGludXggQW1hem9uIEVDMiBpbnN0YW5jZSBvciBMaW51eCBjb250YWluZXJzIG9uIEZhcmdhdGUuXG4gKi9cbkNwdUFyY2hpdGVjdHVyZT86IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgY29uZmlndXJhdGlvbiBkZXRhaWxzIGZvciB0aGUgQXBwIE1lc2ggcHJveHkuXG4gKiAgWW91ciBBbWF6b24gRUNTIGNvbnRhaW5lciBpbnN0YW5jZXMgcmVxdWlyZSBhdCBsZWFzdCB2ZXJzaW9uIDEuMjYuMCBvZiB0aGUgY29udGFpbmVyIGFnZW50IGFuZCBhdCBsZWFzdCB2ZXJzaW9uIDEuMjYuMC0xIG9mIHRoZSBgYGVjcy1pbml0YGAgcGFja2FnZSB0byB1c2UgYSBwcm94eSBjb25maWd1cmF0aW9uLiBJZiB5b3VyIGNvbnRhaW5lciBpbnN0YW5jZXMgYXJlIGxhdW5jaGVkIGZyb20gdGhlIEFtYXpvbiBFQ1Mgb3B0aW1pemVkIEFNSSB2ZXJzaW9uIGBgMjAxOTAzMDFgYCBvciBsYXRlciwgdGhleSBjb250YWluIHRoZSByZXF1aXJlZCB2ZXJzaW9ucyBvZiB0aGUgY29udGFpbmVyIGFnZW50IGFuZCBgYGVjcy1pbml0YGAuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0FtYXpvbiBFQ1Mtb3B0aW1pemVkIExpbnV4IEFNSV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvZWNzLW9wdGltaXplZF9BTUkuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb3h5Q29uZmlndXJhdGlvbiB7XG4vKipcbiAqIFRoZSBzZXQgb2YgbmV0d29yayBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgdG8gcHJvdmlkZSB0aGUgQ29udGFpbmVyIE5ldHdvcmsgSW50ZXJmYWNlIChDTkkpIHBsdWdpbiwgc3BlY2lmaWVkIGFzIGtleS12YWx1ZSBwYWlycy5cbiAqICAgKyAgYGBJZ25vcmVkVUlEYGAgLSAoUmVxdWlyZWQpIFRoZSB1c2VyIElEIChVSUQpIG9mIHRoZSBwcm94eSBjb250YWluZXIgYXMgZGVmaW5lZCBieSB0aGUgYGB1c2VyYGAgcGFyYW1ldGVyIGluIGEgY29udGFpbmVyIGRlZmluaXRpb24uIFRoaXMgaXMgdXNlZCB0byBlbnN1cmUgdGhlIHByb3h5IGlnbm9yZXMgaXRzIG93biB0cmFmZmljLiBJZiBgYElnbm9yZWRHSURgYCBpcyBzcGVjaWZpZWQsIHRoaXMgZmllbGQgY2FuIGJlIGVtcHR5LlxuICogICArICBgYElnbm9yZWRHSURgYCAtIChSZXF1aXJlZCkgVGhlIGdyb3VwIElEIChHSUQpIG9mIHRoZSBwcm94eSBjb250YWluZXIgYXMgZGVmaW5lZCBieSB0aGUgYGB1c2VyYGAgcGFyYW1ldGVyIGluIGEgY29udGFpbmVyIGRlZmluaXRpb24uIFRoaXMgaXMgdXNlZCB0byBlbnN1cmUgdGhlIHByb3h5IGlnbm9yZXMgaXRzIG93biB0cmFmZmljLiBJZiBgYElnbm9yZWRVSURgYCBpcyBzcGVjaWZpZWQsIHRoaXMgZmllbGQgY2FuIGJlIGVtcHR5LlxuICogICArICBgYEFwcFBvcnRzYGAgLSAoUmVxdWlyZWQpIFRoZSBsaXN0IG9mIHBvcnRzIHRoYXQgdGhlIGFwcGxpY2F0aW9uIHVzZXMuIE5ldHdvcmsgdHJhZmZpYyB0byB0aGVzZSBwb3J0cyBpcyBmb3J3YXJkZWQgdG8gdGhlIGBgUHJveHlJbmdyZXNzUG9ydGBgIGFuZCBgYFByb3h5RWdyZXNzUG9ydGBgLlxuICogICArICBgYFByb3h5SW5ncmVzc1BvcnRgYCAtIChSZXF1aXJlZCkgU3BlY2lmaWVzIHRoZSBwb3J0IHRoYXQgaW5jb21pbmcgdHJhZmZpYyB0byB0aGUgYGBBcHBQb3J0c2BgIGlzIGRpcmVjdGVkIHRvLlxuICogICArICBgYFByb3h5RWdyZXNzUG9ydGBgIC0gKFJlcXVpcmVkKSBTcGVjaWZpZXMgdGhlIHBvcnQgdGhhdCBvdXRnb2luZyB0cmFmZmljIGZyb20gdGhlIGBgQXBwUG9ydHNgYCBpcyBkaXJlY3RlZCB0by5cbiAqICAgKyAgYGBFZ3Jlc3NJZ25vcmVkUG9ydHNgYCAtIChSZXF1aXJlZCkgVGhlIGVncmVzcyB0cmFmZmljIGdvaW5nIHRvIHRoZSBzcGVjaWZpZWQgcG9ydHMgaXMgaWdub3JlZCBhbmQgbm90IHJlZGlyZWN0ZWQgdG8gdGhlIGBgUHJveHlFZ3Jlc3NQb3J0YGAuIEl0IGNhbiBiZSBhbiBlbXB0eSBsaXN0LlxuICogICArICBgYEVncmVzc0lnbm9yZWRJUHNgYCAtIChSZXF1aXJlZCkgVGhlIGVncmVzcyB0cmFmZmljIGdvaW5nIHRvIHRoZSBzcGVjaWZpZWQgSVAgYWRkcmVzc2VzIGlzIGlnbm9yZWQgYW5kIG5vdCByZWRpcmVjdGVkIHRvIHRoZSBgYFByb3h5RWdyZXNzUG9ydGBgLiBJdCBjYW4gYmUgYW4gZW1wdHkgbGlzdC5cbiAqL1xuUHJveHlDb25maWd1cmF0aW9uUHJvcGVydGllcz86IEtleVZhbHVlUGFpcltdXG4vKipcbiAqIFRoZSBwcm94eSB0eXBlLiBUaGUgb25seSBzdXBwb3J0ZWQgdmFsdWUgaXMgYGBBUFBNRVNIYGAuXG4gKi9cblR5cGU/OiBzdHJpbmdcbi8qKlxuICogVGhlIG5hbWUgb2YgdGhlIGNvbnRhaW5lciB0aGF0IHdpbGwgc2VydmUgYXMgdGhlIEFwcCBNZXNoIHByb3h5LlxuICovXG5Db250YWluZXJOYW1lOiBzdHJpbmdcbn1cbi8qKlxuICogQSBrZXktdmFsdWUgcGFpciBvYmplY3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgS2V5VmFsdWVQYWlyIHtcbi8qKlxuICogVGhlIHZhbHVlIG9mIHRoZSBrZXktdmFsdWUgcGFpci4gRm9yIGVudmlyb25tZW50IHZhcmlhYmxlcywgdGhpcyBpcyB0aGUgdmFsdWUgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICovXG5WYWx1ZT86IHN0cmluZ1xuLyoqXG4gKiBUaGUgbmFtZSBvZiB0aGUga2V5LXZhbHVlIHBhaXIuIEZvciBlbnZpcm9ubWVudCB2YXJpYWJsZXMsIHRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICovXG5OYW1lPzogc3RyaW5nXG59XG4vKipcbiAqIFRoZSBkYXRhIHZvbHVtZSBjb25maWd1cmF0aW9uIGZvciB0YXNrcyBsYXVuY2hlZCB1c2luZyB0aGlzIHRhc2sgZGVmaW5pdGlvbi4gU3BlY2lmeWluZyBhIHZvbHVtZSBjb25maWd1cmF0aW9uIGluIGEgdGFzayBkZWZpbml0aW9uIGlzIG9wdGlvbmFsLiBUaGUgdm9sdW1lIGNvbmZpZ3VyYXRpb24gbWF5IGNvbnRhaW4gbXVsdGlwbGUgdm9sdW1lcyBidXQgb25seSBvbmUgdm9sdW1lIGNvbmZpZ3VyZWQgYXQgbGF1bmNoIGlzIHN1cHBvcnRlZC4gRWFjaCB2b2x1bWUgZGVmaW5lZCBpbiB0aGUgdm9sdW1lIGNvbmZpZ3VyYXRpb24gbWF5IG9ubHkgc3BlY2lmeSBhIGBgbmFtZWBgIGFuZCBvbmUgb2YgZWl0aGVyIGBgY29uZmlndXJlZEF0TGF1bmNoYGAsIGBgZG9ja2VyVm9sdW1lQ29uZmlndXJhdGlvbmBgLCBgYGVmc1ZvbHVtZUNvbmZpZ3VyYXRpb25gYCwgYGBmc3hXaW5kb3dzRmlsZVNlcnZlclZvbHVtZUNvbmZpZ3VyYXRpb25gYCwgb3IgYGBob3N0YGAuIElmIGFuIGVtcHR5IHZvbHVtZSBjb25maWd1cmF0aW9uIGlzIHNwZWNpZmllZCwgYnkgZGVmYXVsdCBBbWF6b24gRUNTIHVzZXMgYSBob3N0IHZvbHVtZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbVXNpbmcgZGF0YSB2b2x1bWVzIGluIHRhc2tzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS91c2luZ19kYXRhX3ZvbHVtZXMuaHRtbCkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVm9sdW1lIHtcbkVGU1ZvbHVtZUNvbmZpZ3VyYXRpb24/OiBFRlNWb2x1bWVDb25maWd1cmF0aW9uXG5Ib3N0PzogSG9zdFZvbHVtZVByb3BlcnRpZXNcbi8qKlxuICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHZvbHVtZSBzaG91bGQgYmUgY29uZmlndXJlZCBhdCBsYXVuY2ggdGltZS4gVGhpcyBpcyB1c2VkIHRvIGNyZWF0ZSBBbWF6b24gRUJTIHZvbHVtZXMgZm9yIHN0YW5kYWxvbmUgdGFza3Mgb3IgdGFza3MgY3JlYXRlZCBhcyBwYXJ0IG9mIGEgc2VydmljZS4gRWFjaCB0YXNrIGRlZmluaXRpb24gcmV2aXNpb24gbWF5IG9ubHkgaGF2ZSBvbmUgdm9sdW1lIGNvbmZpZ3VyZWQgYXQgbGF1bmNoIGluIHRoZSB2b2x1bWUgY29uZmlndXJhdGlvbi5cbiAqICBUbyBjb25maWd1cmUgYSB2b2x1bWUgYXQgbGF1bmNoIHRpbWUsIHVzZSB0aGlzIHRhc2sgZGVmaW5pdGlvbiByZXZpc2lvbiBhbmQgc3BlY2lmeSBhIGBgdm9sdW1lQ29uZmlndXJhdGlvbnNgYCBvYmplY3Qgd2hlbiBjYWxsaW5nIHRoZSBgYENyZWF0ZVNlcnZpY2VgYCwgYGBVcGRhdGVTZXJ2aWNlYGAsIGBgUnVuVGFza2BgIG9yIGBgU3RhcnRUYXNrYGAgQVBJcy5cbiAqL1xuQ29uZmlndXJlZEF0TGF1bmNoPzogYm9vbGVhblxuRG9ja2VyVm9sdW1lQ29uZmlndXJhdGlvbj86IERvY2tlclZvbHVtZUNvbmZpZ3VyYXRpb25cbkZTeFdpbmRvd3NGaWxlU2VydmVyVm9sdW1lQ29uZmlndXJhdGlvbj86IEZTeFdpbmRvd3NGaWxlU2VydmVyVm9sdW1lQ29uZmlndXJhdGlvblxuLyoqXG4gKiBUaGUgbmFtZSBvZiB0aGUgdm9sdW1lLiBVcCB0byAyNTUgbGV0dGVycyAodXBwZXJjYXNlIGFuZCBsb3dlcmNhc2UpLCBudW1iZXJzLCB1bmRlcnNjb3JlcywgYW5kIGh5cGhlbnMgYXJlIGFsbG93ZWQuXG4gKiAgV2hlbiB1c2luZyBhIHZvbHVtZSBjb25maWd1cmVkIGF0IGxhdW5jaCwgdGhlIGBgbmFtZWBgIGlzIHJlcXVpcmVkIGFuZCBtdXN0IGFsc28gYmUgc3BlY2lmaWVkIGFzIHRoZSB2b2x1bWUgbmFtZSBpbiB0aGUgYGBTZXJ2aWNlVm9sdW1lQ29uZmlndXJhdGlvbmBgIG9yIGBgVGFza1ZvbHVtZUNvbmZpZ3VyYXRpb25gYCBwYXJhbWV0ZXIgd2hlbiBjcmVhdGluZyB5b3VyIHNlcnZpY2Ugb3Igc3RhbmRhbG9uZSB0YXNrLlxuICogIEZvciBhbGwgb3RoZXIgdHlwZXMgb2Ygdm9sdW1lcywgdGhpcyBuYW1lIGlzIHJlZmVyZW5jZWQgaW4gdGhlIGBgc291cmNlVm9sdW1lYGAgcGFyYW1ldGVyIG9mIHRoZSBgYG1vdW50UG9pbnRzYGAgb2JqZWN0IGluIHRoZSBjb250YWluZXIgZGVmaW5pdGlvbi5cbiAqICBXaGVuIGEgdm9sdW1lIGlzIHVzaW5nIHRoZSBgYGVmc1ZvbHVtZUNvbmZpZ3VyYXRpb25gYCwgdGhlIG5hbWUgaXMgcmVxdWlyZWQuXG4gKi9cbk5hbWU/OiBzdHJpbmdcbn1cbi8qKlxuICogVGhpcyBwYXJhbWV0ZXIgaXMgc3BlY2lmaWVkIHdoZW4geW91IHVzZSBhbiBBbWF6b24gRWxhc3RpYyBGaWxlIFN5c3RlbSBmaWxlIHN5c3RlbSBmb3IgdGFzayBzdG9yYWdlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVGU1ZvbHVtZUNvbmZpZ3VyYXRpb24ge1xuLyoqXG4gKiBUaGUgQW1hem9uIEVGUyBmaWxlIHN5c3RlbSBJRCB0byB1c2UuXG4gKi9cbkZpbGVzeXN0ZW1JZDogc3RyaW5nXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0byB1c2UgZW5jcnlwdGlvbiBmb3IgQW1hem9uIEVGUyBkYXRhIGluIHRyYW5zaXQgYmV0d2VlbiB0aGUgQW1hem9uIEVDUyBob3N0IGFuZCB0aGUgQW1hem9uIEVGUyBzZXJ2ZXIuIFRyYW5zaXQgZW5jcnlwdGlvbiBtdXN0IGJlIHR1cm5lZCBvbiBpZiBBbWF6b24gRUZTIElBTSBhdXRob3JpemF0aW9uIGlzIHVzZWQuIElmIHRoaXMgcGFyYW1ldGVyIGlzIG9taXR0ZWQsIHRoZSBkZWZhdWx0IHZhbHVlIG9mIGBgRElTQUJMRURgYCBpcyB1c2VkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtFbmNyeXB0aW5nIGRhdGEgaW4gdHJhbnNpdF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Vmcy9sYXRlc3QvdWcvZW5jcnlwdGlvbi1pbi10cmFuc2l0Lmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgRmlsZSBTeXN0ZW0gVXNlciBHdWlkZSouXG4gKi9cblRyYW5zaXRFbmNyeXB0aW9uPzogKFwiRU5BQkxFRFwiIHwgXCJESVNBQkxFRFwiKVxuQXV0aG9yaXphdGlvbkNvbmZpZz86IEF1dGhvcml6YXRpb25Db25maWdcbi8qKlxuICogVGhlIGRpcmVjdG9yeSB3aXRoaW4gdGhlIEFtYXpvbiBFRlMgZmlsZSBzeXN0ZW0gdG8gbW91bnQgYXMgdGhlIHJvb3QgZGlyZWN0b3J5IGluc2lkZSB0aGUgaG9zdC4gSWYgdGhpcyBwYXJhbWV0ZXIgaXMgb21pdHRlZCwgdGhlIHJvb3Qgb2YgdGhlIEFtYXpvbiBFRlMgdm9sdW1lIHdpbGwgYmUgdXNlZC4gU3BlY2lmeWluZyBgYC9gYCB3aWxsIGhhdmUgdGhlIHNhbWUgZWZmZWN0IGFzIG9taXR0aW5nIHRoaXMgcGFyYW1ldGVyLlxuICogICBJZiBhbiBFRlMgYWNjZXNzIHBvaW50IGlzIHNwZWNpZmllZCBpbiB0aGUgYGBhdXRob3JpemF0aW9uQ29uZmlnYGAsIHRoZSByb290IGRpcmVjdG9yeSBwYXJhbWV0ZXIgbXVzdCBlaXRoZXIgYmUgb21pdHRlZCBvciBzZXQgdG8gYGAvYGAgd2hpY2ggd2lsbCBlbmZvcmNlIHRoZSBwYXRoIHNldCBvbiB0aGUgRUZTIGFjY2VzcyBwb2ludC5cbiAqL1xuUm9vdERpcmVjdG9yeT86IHN0cmluZ1xuLyoqXG4gKiBUaGUgcG9ydCB0byB1c2Ugd2hlbiBzZW5kaW5nIGVuY3J5cHRlZCBkYXRhIGJldHdlZW4gdGhlIEFtYXpvbiBFQ1MgaG9zdCBhbmQgdGhlIEFtYXpvbiBFRlMgc2VydmVyLiBJZiB5b3UgZG8gbm90IHNwZWNpZnkgYSB0cmFuc2l0IGVuY3J5cHRpb24gcG9ydCwgaXQgd2lsbCB1c2UgdGhlIHBvcnQgc2VsZWN0aW9uIHN0cmF0ZWd5IHRoYXQgdGhlIEFtYXpvbiBFRlMgbW91bnQgaGVscGVyIHVzZXMuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0VGUyBtb3VudCBoZWxwZXJdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9lZnMvbGF0ZXN0L3VnL2Vmcy1tb3VudC1oZWxwZXIuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBGaWxlIFN5c3RlbSBVc2VyIEd1aWRlKi5cbiAqL1xuVHJhbnNpdEVuY3J5cHRpb25Qb3J0PzogbnVtYmVyXG59XG4vKipcbiAqIFRoZSBhdXRob3JpemF0aW9uIGNvbmZpZ3VyYXRpb24gZGV0YWlscyBmb3IgdGhlIEFtYXpvbiBFRlMgZmlsZSBzeXN0ZW0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aG9yaXphdGlvbkNvbmZpZyB7XG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0byB1c2UgdGhlIEFtYXpvbiBFQ1MgdGFzayByb2xlIGRlZmluZWQgaW4gYSB0YXNrIGRlZmluaXRpb24gd2hlbiBtb3VudGluZyB0aGUgQW1hem9uIEVGUyBmaWxlIHN5c3RlbS4gSWYgaXQgaXMgdHVybmVkIG9uLCB0cmFuc2l0IGVuY3J5cHRpb24gbXVzdCBiZSB0dXJuZWQgb24gaW4gdGhlIGBgRUZTVm9sdW1lQ29uZmlndXJhdGlvbmBgLiBJZiB0aGlzIHBhcmFtZXRlciBpcyBvbWl0dGVkLCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBgYERJU0FCTEVEYGAgaXMgdXNlZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbVXNpbmcgQW1hem9uIEVGUyBhY2Nlc3MgcG9pbnRzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9lZnMtdm9sdW1lcy5odG1sI2Vmcy12b2x1bWUtYWNjZXNzcG9pbnRzKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKi9cbklBTT86IChcIkVOQUJMRURcIiB8IFwiRElTQUJMRURcIilcbi8qKlxuICogVGhlIEFtYXpvbiBFRlMgYWNjZXNzIHBvaW50IElEIHRvIHVzZS4gSWYgYW4gYWNjZXNzIHBvaW50IGlzIHNwZWNpZmllZCwgdGhlIHJvb3QgZGlyZWN0b3J5IHZhbHVlIHNwZWNpZmllZCBpbiB0aGUgYGBFRlNWb2x1bWVDb25maWd1cmF0aW9uYGAgbXVzdCBlaXRoZXIgYmUgb21pdHRlZCBvciBzZXQgdG8gYGAvYGAgd2hpY2ggd2lsbCBlbmZvcmNlIHRoZSBwYXRoIHNldCBvbiB0aGUgRUZTIGFjY2VzcyBwb2ludC4gSWYgYW4gYWNjZXNzIHBvaW50IGlzIHVzZWQsIHRyYW5zaXQgZW5jcnlwdGlvbiBtdXN0IGJlIG9uIGluIHRoZSBgYEVGU1ZvbHVtZUNvbmZpZ3VyYXRpb25gYC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbV29ya2luZyB3aXRoIEFtYXpvbiBFRlMgYWNjZXNzIHBvaW50c10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Vmcy9sYXRlc3QvdWcvZWZzLWFjY2Vzcy1wb2ludHMuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBGaWxlIFN5c3RlbSBVc2VyIEd1aWRlKi5cbiAqL1xuQWNjZXNzUG9pbnRJZD86IHN0cmluZ1xufVxuLyoqXG4gKiBUaGlzIHBhcmFtZXRlciBpcyBzcGVjaWZpZWQgd2hlbiB5b3UgdXNlIGJpbmQgbW91bnQgaG9zdCB2b2x1bWVzLiBUaGUgY29udGVudHMgb2YgdGhlIGBgaG9zdGBgIHBhcmFtZXRlciBkZXRlcm1pbmUgd2hldGhlciB5b3VyIGJpbmQgbW91bnQgaG9zdCB2b2x1bWUgcGVyc2lzdHMgb24gdGhlIGhvc3QgY29udGFpbmVyIGluc3RhbmNlIGFuZCB3aGVyZSBpdCdzIHN0b3JlZC4gSWYgdGhlIGBgaG9zdGBgIHBhcmFtZXRlciBpcyBlbXB0eSwgdGhlbiB0aGUgRG9ja2VyIGRhZW1vbiBhc3NpZ25zIGEgaG9zdCBwYXRoIGZvciB5b3VyIGRhdGEgdm9sdW1lLiBIb3dldmVyLCB0aGUgZGF0YSBpc24ndCBndWFyYW50ZWVkIHRvIHBlcnNpc3QgYWZ0ZXIgdGhlIGNvbnRhaW5lcnMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIGl0IHN0b3AgcnVubmluZy5cbiAqICBXaW5kb3dzIGNvbnRhaW5lcnMgY2FuIG1vdW50IHdob2xlIGRpcmVjdG9yaWVzIG9uIHRoZSBzYW1lIGRyaXZlIGFzIGBgJGVudjpQcm9ncmFtRGF0YWBgLiBXaW5kb3dzIGNvbnRhaW5lcnMgY2FuJ3QgbW91bnQgZGlyZWN0b3JpZXMgb24gYSBkaWZmZXJlbnQgZHJpdmUsIGFuZCBtb3VudCBwb2ludCBjYW4ndCBiZSBhY3Jvc3MgZHJpdmVzLiBGb3IgZXhhbXBsZSwgeW91IGNhbiBtb3VudCBgYEM6XFxteVxccGF0aDpDOlxcbXlcXHBhdGhgYCBhbmQgYGBEOlxcOkQ6XFxgYCwgYnV0IG5vdCBgYEQ6XFxteVxccGF0aDpDOlxcbXlcXHBhdGhgYCBvciBgYEQ6XFw6QzpcXG15XFxwYXRoYGAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSG9zdFZvbHVtZVByb3BlcnRpZXMge1xuLyoqXG4gKiBXaGVuIHRoZSBgYGhvc3RgYCBwYXJhbWV0ZXIgaXMgdXNlZCwgc3BlY2lmeSBhIGBgc291cmNlUGF0aGBgIHRvIGRlY2xhcmUgdGhlIHBhdGggb24gdGhlIGhvc3QgY29udGFpbmVyIGluc3RhbmNlIHRoYXQncyBwcmVzZW50ZWQgdG8gdGhlIGNvbnRhaW5lci4gSWYgdGhpcyBwYXJhbWV0ZXIgaXMgZW1wdHksIHRoZW4gdGhlIERvY2tlciBkYWVtb24gaGFzIGFzc2lnbmVkIGEgaG9zdCBwYXRoIGZvciB5b3UuIElmIHRoZSBgYGhvc3RgYCBwYXJhbWV0ZXIgY29udGFpbnMgYSBgYHNvdXJjZVBhdGhgYCBmaWxlIGxvY2F0aW9uLCB0aGVuIHRoZSBkYXRhIHZvbHVtZSBwZXJzaXN0cyBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uIG9uIHRoZSBob3N0IGNvbnRhaW5lciBpbnN0YW5jZSB1bnRpbCB5b3UgZGVsZXRlIGl0IG1hbnVhbGx5LiBJZiB0aGUgYGBzb3VyY2VQYXRoYGAgdmFsdWUgZG9lc24ndCBleGlzdCBvbiB0aGUgaG9zdCBjb250YWluZXIgaW5zdGFuY2UsIHRoZSBEb2NrZXIgZGFlbW9uIGNyZWF0ZXMgaXQuIElmIHRoZSBsb2NhdGlvbiBkb2VzIGV4aXN0LCB0aGUgY29udGVudHMgb2YgdGhlIHNvdXJjZSBwYXRoIGZvbGRlciBhcmUgZXhwb3J0ZWQuXG4gKiAgSWYgeW91J3JlIHVzaW5nIHRoZSBGYXJnYXRlIGxhdW5jaCB0eXBlLCB0aGUgYGBzb3VyY2VQYXRoYGAgcGFyYW1ldGVyIGlzIG5vdCBzdXBwb3J0ZWQuXG4gKi9cblNvdXJjZVBhdGg/OiBzdHJpbmdcbn1cbi8qKlxuICogVGhpcyBwYXJhbWV0ZXIgaXMgc3BlY2lmaWVkIHdoZW4geW91IHVzZSBEb2NrZXIgdm9sdW1lcy5cbiAqICBXaW5kb3dzIGNvbnRhaW5lcnMgb25seSBzdXBwb3J0IHRoZSB1c2Ugb2YgdGhlIGBgbG9jYWxgYCBkcml2ZXIuIFRvIHVzZSBiaW5kIG1vdW50cywgc3BlY2lmeSB0aGUgYGBob3N0YGAgcGFyYW1ldGVyIGluc3RlYWQuXG4gKiAgIERvY2tlciB2b2x1bWVzIGFyZW4ndCBzdXBwb3J0ZWQgYnkgdGFza3MgcnVuIG9uIEZBUkdBVEVsb25nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERvY2tlclZvbHVtZUNvbmZpZ3VyYXRpb24ge1xuLyoqXG4gKiBBIG1hcCBvZiBEb2NrZXIgZHJpdmVyLXNwZWNpZmljIG9wdGlvbnMgcGFzc2VkIHRocm91Z2guIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBEcml2ZXJPcHRzYGAgaW4gdGhlIGRvY2tlciBjcmVhdGUtdm9sdW1lIGNvbW1hbmQgYW5kIHRoZSBgYHh4b3B0YGAgb3B0aW9uIHRvIGRvY2tlciB2b2x1bWUgY3JlYXRlLlxuICovXG5Ecml2ZXJPcHRzPzoge1xuLyoqXG4gKiBUaGlzIGludGVyZmFjZSB3YXMgcmVmZXJlbmNlZCBieSBgdW5kZWZpbmVkYCdzIEpTT04tU2NoZW1hIGRlZmluaXRpb25cbiAqIHZpYSB0aGUgYHBhdHRlcm5Qcm9wZXJ0eWAgXCIuezEsfVwiLlxuICovXG5bazogc3RyaW5nXTogc3RyaW5nXG59XG4vKipcbiAqIFRoZSBzY29wZSBmb3IgdGhlIERvY2tlciB2b2x1bWUgdGhhdCBkZXRlcm1pbmVzIGl0cyBsaWZlY3ljbGUuIERvY2tlciB2b2x1bWVzIHRoYXQgYXJlIHNjb3BlZCB0byBhIGBgdGFza2BgIGFyZSBhdXRvbWF0aWNhbGx5IHByb3Zpc2lvbmVkIHdoZW4gdGhlIHRhc2sgc3RhcnRzIGFuZCBkZXN0cm95ZWQgd2hlbiB0aGUgdGFzayBzdG9wcy4gRG9ja2VyIHZvbHVtZXMgdGhhdCBhcmUgc2NvcGVkIGFzIGBgc2hhcmVkYGAgcGVyc2lzdCBhZnRlciB0aGUgdGFzayBzdG9wcy5cbiAqL1xuU2NvcGU/OiBzdHJpbmdcbi8qKlxuICogSWYgdGhpcyB2YWx1ZSBpcyBgYHRydWVgYCwgdGhlIERvY2tlciB2b2x1bWUgaXMgY3JlYXRlZCBpZiBpdCBkb2Vzbid0IGFscmVhZHkgZXhpc3QuXG4gKiAgIFRoaXMgZmllbGQgaXMgb25seSB1c2VkIGlmIHRoZSBgYHNjb3BlYGAgaXMgYGBzaGFyZWRgYC5cbiAqL1xuQXV0b3Byb3Zpc2lvbj86IGJvb2xlYW5cbi8qKlxuICogVGhlIERvY2tlciB2b2x1bWUgZHJpdmVyIHRvIHVzZS4gVGhlIGRyaXZlciB2YWx1ZSBtdXN0IG1hdGNoIHRoZSBkcml2ZXIgbmFtZSBwcm92aWRlZCBieSBEb2NrZXIgYmVjYXVzZSBpdCBpcyB1c2VkIGZvciB0YXNrIHBsYWNlbWVudC4gSWYgdGhlIGRyaXZlciB3YXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBEb2NrZXIgcGx1Z2luIENMSSwgdXNlIGBgZG9ja2VyIHBsdWdpbiBsc2BgIHRvIHJldHJpZXZlIHRoZSBkcml2ZXIgbmFtZSBmcm9tIHlvdXIgY29udGFpbmVyIGluc3RhbmNlLiBJZiB0aGUgZHJpdmVyIHdhcyBpbnN0YWxsZWQgdXNpbmcgYW5vdGhlciBtZXRob2QsIHVzZSBEb2NrZXIgcGx1Z2luIGRpc2NvdmVyeSB0byByZXRyaWV2ZSB0aGUgZHJpdmVyIG5hbWUuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBEcml2ZXJgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgeHhkcml2ZXJgYCBvcHRpb24gdG8gZG9ja2VyIHZvbHVtZSBjcmVhdGUuXG4gKi9cbkRyaXZlcj86IHN0cmluZ1xuLyoqXG4gKiBDdXN0b20gbWV0YWRhdGEgdG8gYWRkIHRvIHlvdXIgRG9ja2VyIHZvbHVtZS4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYExhYmVsc2BgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kIGFuZCB0aGUgYGB4eGxhYmVsYGAgb3B0aW9uIHRvIGRvY2tlciB2b2x1bWUgY3JlYXRlLlxuICovXG5MYWJlbHM/OiB7XG4vKipcbiAqIFRoaXMgaW50ZXJmYWNlIHdhcyByZWZlcmVuY2VkIGJ5IGB1bmRlZmluZWRgJ3MgSlNPTi1TY2hlbWEgZGVmaW5pdGlvblxuICogdmlhIHRoZSBgcGF0dGVyblByb3BlcnR5YCBcIi57MSx9XCIuXG4gKi9cbltrOiBzdHJpbmddOiBzdHJpbmdcbn1cbn1cbi8qKlxuICogVGhpcyBwYXJhbWV0ZXIgaXMgc3BlY2lmaWVkIHdoZW4geW91IHVzZSBBbWF6b24gRlN4IGZvciBXaW5kb3dzIEZpbGUgU2VydmVyIGZpbGUgc3lzdGVtIGZvciB0YXNrIHN0b3JhZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRlN4V2luZG93c0ZpbGVTZXJ2ZXJWb2x1bWVDb25maWd1cmF0aW9uIHtcbkF1dGhvcml6YXRpb25Db25maWc/OiBGU3hBdXRob3JpemF0aW9uQ29uZmlnXG4vKipcbiAqIFRoZSBBbWF6b24gRlN4IGZvciBXaW5kb3dzIEZpbGUgU2VydmVyIGZpbGUgc3lzdGVtIElEIHRvIHVzZS5cbiAqL1xuRmlsZVN5c3RlbUlkOiBzdHJpbmdcbi8qKlxuICogVGhlIGRpcmVjdG9yeSB3aXRoaW4gdGhlIEFtYXpvbiBGU3ggZm9yIFdpbmRvd3MgRmlsZSBTZXJ2ZXIgZmlsZSBzeXN0ZW0gdG8gbW91bnQgYXMgdGhlIHJvb3QgZGlyZWN0b3J5IGluc2lkZSB0aGUgaG9zdC5cbiAqL1xuUm9vdERpcmVjdG9yeTogc3RyaW5nXG59XG4vKipcbiAqIFRoZSBhdXRob3JpemF0aW9uIGNvbmZpZ3VyYXRpb24gZGV0YWlscyBmb3IgdGhlIEFtYXpvbiBGU3ggZm9yIFdpbmRvd3MgRmlsZSBTZXJ2ZXIgZmlsZSBzeXN0ZW0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRlN4QXV0aG9yaXphdGlvbkNvbmZpZyB7XG4vKipcbiAqIFRoZSBhdXRob3JpemF0aW9uIGNyZWRlbnRpYWwgb3B0aW9uIHRvIHVzZS4gVGhlIGF1dGhvcml6YXRpb24gY3JlZGVudGlhbCBvcHRpb25zIGNhbiBiZSBwcm92aWRlZCB1c2luZyBlaXRoZXIgdGhlIEFtYXpvbiBSZXNvdXJjZSBOYW1lIChBUk4pIG9mIGFuIEFTTWxvbmcgc2VjcmV0IG9yIFNTTSBQYXJhbWV0ZXIgU3RvcmUgcGFyYW1ldGVyLiBUaGUgQVJOIHJlZmVycyB0byB0aGUgc3RvcmVkIGNyZWRlbnRpYWxzLlxuICovXG5DcmVkZW50aWFsc1BhcmFtZXRlcjogc3RyaW5nXG4vKipcbiAqIEEgZnVsbHkgcXVhbGlmaWVkIGRvbWFpbiBuYW1lIGhvc3RlZCBieSBhbiBbXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGlyZWN0b3J5c2VydmljZS9sYXRlc3QvYWRtaW4tZ3VpZGUvZGlyZWN0b3J5X21pY3Jvc29mdF9hZC5odG1sKSBNYW5hZ2VkIE1pY3Jvc29mdCBBRCAoQWN0aXZlIERpcmVjdG9yeSkgb3Igc2VsZi1ob3N0ZWQgQUQgb24gQW1hem9uIEVDMi5cbiAqL1xuRG9tYWluOiBzdHJpbmdcbn1cbi8qKlxuICogVGhlIGBgQ29udGFpbmVyRGVmaW5pdGlvbmBgIHByb3BlcnR5IHNwZWNpZmllcyBhIGNvbnRhaW5lciBkZWZpbml0aW9uLiBDb250YWluZXIgZGVmaW5pdGlvbnMgYXJlIHVzZWQgaW4gdGFzayBkZWZpbml0aW9ucyB0byBkZXNjcmliZSB0aGUgZGlmZmVyZW50IGNvbnRhaW5lcnMgdGhhdCBhcmUgbGF1bmNoZWQgYXMgcGFydCBvZiBhIHRhc2suXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGFpbmVyRGVmaW5pdGlvbiB7XG4vKipcbiAqIFRoZSB1c2VyIHRvIHVzZSBpbnNpZGUgdGhlIGNvbnRhaW5lci4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYFVzZXJgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS11c2VyYGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKiAgIFdoZW4gcnVubmluZyB0YXNrcyB1c2luZyB0aGUgYGBob3N0YGAgbmV0d29yayBtb2RlLCBkb24ndCBydW4gY29udGFpbmVycyB1c2luZyB0aGUgcm9vdCB1c2VyIChVSUQgMCkuIFdlIHJlY29tbWVuZCB1c2luZyBhIG5vbi1yb290IHVzZXIgZm9yIGJldHRlciBzZWN1cml0eS5cbiAqICAgWW91IGNhbiBzcGVjaWZ5IHRoZSBgYHVzZXJgYCB1c2luZyB0aGUgZm9sbG93aW5nIGZvcm1hdHMuIElmIHNwZWNpZnlpbmcgYSBVSUQgb3IgR0lELCB5b3UgbXVzdCBzcGVjaWZ5IGl0IGFzIGEgcG9zaXRpdmUgaW50ZWdlci5cbiAqICAgKyAgIGBgdXNlcmBgIFxuICogICArICAgYGB1c2VyOmdyb3VwYGAgXG4gKiAgICsgICBgYHVpZGBgIFxuICogICArICAgYGB1aWQ6Z2lkYGAgXG4gKiAgICsgICBgYHVzZXI6Z2lkYGAgXG4gKiAgICsgICBgYHVpZDpncm91cGBgIFxuICogICBcbiAqICAgVGhpcyBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZCBmb3IgV2luZG93cyBjb250YWluZXJzLlxuICovXG5Vc2VyPzogc3RyaW5nXG4vKipcbiAqIFRoZSBzZWNyZXRzIHRvIHBhc3MgdG8gdGhlIGNvbnRhaW5lci4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbU3BlY2lmeWluZyBTZW5zaXRpdmUgRGF0YV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvc3BlY2lmeWluZy1zZW5zaXRpdmUtZGF0YS5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKi9cblNlY3JldHM/OiBTZWNyZXRbXVxuLyoqXG4gKiBUaGUgYW1vdW50IChpbiBNaUIpIG9mIG1lbW9yeSB0byBwcmVzZW50IHRvIHRoZSBjb250YWluZXIuIElmIHlvdXIgY29udGFpbmVyIGF0dGVtcHRzIHRvIGV4Y2VlZCB0aGUgbWVtb3J5IHNwZWNpZmllZCBoZXJlLCB0aGUgY29udGFpbmVyIGlzIGtpbGxlZC4gVGhlIHRvdGFsIGFtb3VudCBvZiBtZW1vcnkgcmVzZXJ2ZWQgZm9yIGFsbCBjb250YWluZXJzIHdpdGhpbiBhIHRhc2sgbXVzdCBiZSBsb3dlciB0aGFuIHRoZSB0YXNrIGBgbWVtb3J5YGAgdmFsdWUsIGlmIG9uZSBpcyBzcGVjaWZpZWQuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBNZW1vcnlgYCBpbiB0aGUgW0NyZWF0ZSBhIGNvbnRhaW5lcl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2h0dHBzOi8vZG9jcy5kb2NrZXIuY29tL2VuZ2luZS9hcGkvdjEuMzUvI29wZXJhdGlvbi9Db250YWluZXJDcmVhdGUpIHNlY3Rpb24gb2YgdGhlIFtEb2NrZXIgUmVtb3RlIEFQSV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2h0dHBzOi8vZG9jcy5kb2NrZXIuY29tL2VuZ2luZS9hcGkvdjEuMzUvKSBhbmQgdGhlIGBgLS1tZW1vcnlgYCBvcHRpb24gdG8gW2RvY2tlciBydW5dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9odHRwczovL2RvY3MuZG9ja2VyLmNvbS9lbmdpbmUvcmVmZXJlbmNlL3J1bi8jc2VjdXJpdHktY29uZmlndXJhdGlvbikuXG4gKiAgSWYgdXNpbmcgdGhlIEZhcmdhdGUgbGF1bmNoIHR5cGUsIHRoaXMgcGFyYW1ldGVyIGlzIG9wdGlvbmFsLlxuICogIElmIHVzaW5nIHRoZSBFQzIgbGF1bmNoIHR5cGUsIHlvdSBtdXN0IHNwZWNpZnkgZWl0aGVyIGEgdGFzay1sZXZlbCBtZW1vcnkgdmFsdWUgb3IgYSBjb250YWluZXItbGV2ZWwgbWVtb3J5IHZhbHVlLiBJZiB5b3Ugc3BlY2lmeSBib3RoIGEgY29udGFpbmVyLWxldmVsIGBgbWVtb3J5YGAgYW5kIGBgbWVtb3J5UmVzZXJ2YXRpb25gYCB2YWx1ZSwgYGBtZW1vcnlgYCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBgYG1lbW9yeVJlc2VydmF0aW9uYGAuIElmIHlvdSBzcGVjaWZ5IGBgbWVtb3J5UmVzZXJ2YXRpb25gYCwgdGhlbiB0aGF0IHZhbHVlIGlzIHN1YnRyYWN0ZWQgZnJvbSB0aGUgYXZhaWxhYmxlIG1lbW9yeSByZXNvdXJjZXMgZm9yIHRoZSBjb250YWluZXIgaW5zdGFuY2Ugd2hlcmUgdGhlIGNvbnRhaW5lciBpcyBwbGFjZWQuIE90aGVyd2lzZSwgdGhlIHZhbHVlIG9mIGBgbWVtb3J5YGAgaXMgdXNlZC5cbiAqICBUaGUgRG9ja2VyIDIwLjEwLjAgb3IgbGF0ZXIgZGFlbW9uIHJlc2VydmVzIGEgbWluaW11bSBvZiA2IE1pQiBvZiBtZW1vcnkgZm9yIGEgY29udGFpbmVyLCBzbyB5b3Ugc2hvdWxkIG5vdCBzcGVjaWZ5IGZld2VyIHRoYW4gNiBNaUIgb2YgbWVtb3J5IGZvciB5b3VyIGNvbnRhaW5lcnMuXG4gKiAgVGhlIERvY2tlciAxOS4wMy4xMy1jZSBvciBlYXJsaWVyIGRhZW1vbiByZXNlcnZlcyBhIG1pbmltdW0gb2YgNCBNaUIgb2YgbWVtb3J5IGZvciBhIGNvbnRhaW5lciwgc28geW91IHNob3VsZCBub3Qgc3BlY2lmeSBmZXdlciB0aGFuIDQgTWlCIG9mIG1lbW9yeSBmb3IgeW91ciBjb250YWluZXJzLlxuICovXG5NZW1vcnk/OiBudW1iZXJcbi8qKlxuICogV2hlbiB0aGlzIHBhcmFtZXRlciBpcyB0cnVlLCB0aGUgY29udGFpbmVyIGlzIGdpdmVuIGVsZXZhdGVkIHByaXZpbGVnZXMgb24gdGhlIGhvc3QgY29udGFpbmVyIGluc3RhbmNlIChzaW1pbGFyIHRvIHRoZSBgYHJvb3RgYCB1c2VyKS4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYFByaXZpbGVnZWRgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS1wcml2aWxlZ2VkYGAgb3B0aW9uIHRvIGRvY2tlciBydW5cbiAqICAgVGhpcyBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZCBmb3IgV2luZG93cyBjb250YWluZXJzIG9yIHRhc2tzIHJ1biBvbiBGQVJHQVRFbG9uZy5cbiAqL1xuUHJpdmlsZWdlZD86IGJvb2xlYW5cbkhlYWx0aENoZWNrPzogSGVhbHRoQ2hlY2tcbi8qKlxuICogVGltZSBkdXJhdGlvbiAoaW4gc2Vjb25kcykgdG8gd2FpdCBiZWZvcmUgZ2l2aW5nIHVwIG9uIHJlc29sdmluZyBkZXBlbmRlbmNpZXMgZm9yIGEgY29udGFpbmVyLiBGb3IgZXhhbXBsZSwgeW91IHNwZWNpZnkgdHdvIGNvbnRhaW5lcnMgaW4gYSB0YXNrIGRlZmluaXRpb24gd2l0aCBjb250YWluZXJBIGhhdmluZyBhIGRlcGVuZGVuY3kgb24gY29udGFpbmVyQiByZWFjaGluZyBhIGBgQ09NUExFVEVgYCwgYGBTVUNDRVNTYGAsIG9yIGBgSEVBTFRIWWBgIHN0YXR1cy4gSWYgYSBgYHN0YXJ0VGltZW91dGBgIHZhbHVlIGlzIHNwZWNpZmllZCBmb3IgY29udGFpbmVyQiBhbmQgaXQgZG9lc24ndCByZWFjaCB0aGUgZGVzaXJlZCBzdGF0dXMgd2l0aGluIHRoYXQgdGltZSB0aGVuIGNvbnRhaW5lckEgZ2l2ZXMgdXAgYW5kIG5vdCBzdGFydC4gVGhpcyByZXN1bHRzIGluIHRoZSB0YXNrIHRyYW5zaXRpb25pbmcgdG8gYSBgYFNUT1BQRURgYCBzdGF0ZS5cbiAqICAgV2hlbiB0aGUgYGBFQ1NfQ09OVEFJTkVSX1NUQVJUX1RJTUVPVVRgYCBjb250YWluZXIgYWdlbnQgY29uZmlndXJhdGlvbiB2YXJpYWJsZSBpcyB1c2VkLCBpdCdzIGVuZm9yY2VkIGluZGVwZW5kZW50bHkgZnJvbSB0aGlzIHN0YXJ0IHRpbWVvdXQgdmFsdWUuXG4gKiAgIEZvciB0YXNrcyB1c2luZyB0aGUgRmFyZ2F0ZSBsYXVuY2ggdHlwZSwgdGhlIHRhc2sgb3Igc2VydmljZSByZXF1aXJlcyB0aGUgZm9sbG93aW5nIHBsYXRmb3JtczpcbiAqICAgKyAgTGludXggcGxhdGZvcm0gdmVyc2lvbiBgYDEuMy4wYGAgb3IgbGF0ZXIuXG4gKiAgICsgIFdpbmRvd3MgcGxhdGZvcm0gdmVyc2lvbiBgYDEuMC4wYGAgb3IgbGF0ZXIuXG4gKiAgIFxuICogIEZvciB0YXNrcyB1c2luZyB0aGUgRUMyIGxhdW5jaCB0eXBlLCB5b3VyIGNvbnRhaW5lciBpbnN0YW5jZXMgcmVxdWlyZSBhdCBsZWFzdCB2ZXJzaW9uIGBgMS4yNi4wYGAgb2YgdGhlIGNvbnRhaW5lciBhZ2VudCB0byB1c2UgYSBjb250YWluZXIgc3RhcnQgdGltZW91dCB2YWx1ZS4gSG93ZXZlciwgd2UgcmVjb21tZW5kIHVzaW5nIHRoZSBsYXRlc3QgY29udGFpbmVyIGFnZW50IHZlcnNpb24uIEZvciBpbmZvcm1hdGlvbiBhYm91dCBjaGVja2luZyB5b3VyIGFnZW50IHZlcnNpb24gYW5kIHVwZGF0aW5nIHRvIHRoZSBsYXRlc3QgdmVyc2lvbiwgc2VlIFtVcGRhdGluZyB0aGUgQW1hem9uIEVDUyBDb250YWluZXIgQWdlbnRdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2Vjcy1hZ2VudC11cGRhdGUuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLiBJZiB5b3UncmUgdXNpbmcgYW4gQW1hem9uIEVDUy1vcHRpbWl6ZWQgTGludXggQU1JLCB5b3VyIGluc3RhbmNlIG5lZWRzIGF0IGxlYXN0IHZlcnNpb24gYGAxLjI2LjAtMWBgIG9mIHRoZSBgYGVjcy1pbml0YGAgcGFja2FnZS4gSWYgeW91ciBjb250YWluZXIgaW5zdGFuY2VzIGFyZSBsYXVuY2hlZCBmcm9tIHZlcnNpb24gYGAyMDE5MDMwMWBgIG9yIGxhdGVyLCB0aGVuIHRoZXkgY29udGFpbiB0aGUgcmVxdWlyZWQgdmVyc2lvbnMgb2YgdGhlIGNvbnRhaW5lciBhZ2VudCBhbmQgYGBlY3MtaW5pdGBgLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtBbWF6b24gRUNTLW9wdGltaXplZCBMaW51eCBBTUldKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2Vjcy1vcHRpbWl6ZWRfQU1JLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICBUaGUgdmFsaWQgdmFsdWVzIGZvciBGYXJnYXRlIGFyZSAyLTEyMCBzZWNvbmRzLlxuICovXG5TdGFydFRpbWVvdXQ/OiBudW1iZXJcbi8qKlxuICogRGF0YSB2b2x1bWVzIHRvIG1vdW50IGZyb20gYW5vdGhlciBjb250YWluZXIuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBWb2x1bWVzRnJvbWBgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kIGFuZCB0aGUgYGAtLXZvbHVtZXMtZnJvbWBgIG9wdGlvbiB0byBkb2NrZXIgcnVuLlxuICovXG5Wb2x1bWVzRnJvbT86IFZvbHVtZUZyb21bXVxuLyoqXG4gKiBUaGUgbnVtYmVyIG9mIGBgY3B1YGAgdW5pdHMgcmVzZXJ2ZWQgZm9yIHRoZSBjb250YWluZXIuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBDcHVTaGFyZXNgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZGFuZCB0aGUgYGAtLWNwdS1zaGFyZXNgYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi5cbiAqICBUaGlzIGZpZWxkIGlzIG9wdGlvbmFsIGZvciB0YXNrcyB1c2luZyB0aGUgRmFyZ2F0ZSBsYXVuY2ggdHlwZSwgYW5kIHRoZSBvbmx5IHJlcXVpcmVtZW50IGlzIHRoYXQgdGhlIHRvdGFsIGFtb3VudCBvZiBDUFUgcmVzZXJ2ZWQgZm9yIGFsbCBjb250YWluZXJzIHdpdGhpbiBhIHRhc2sgYmUgbG93ZXIgdGhhbiB0aGUgdGFzay1sZXZlbCBgYGNwdWBgIHZhbHVlLlxuICogICBZb3UgY2FuIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIENQVSB1bml0cyB0aGF0IGFyZSBhdmFpbGFibGUgcGVyIEVDMiBpbnN0YW5jZSB0eXBlIGJ5IG11bHRpcGx5aW5nIHRoZSB2Q1BVcyBsaXN0ZWQgZm9yIHRoYXQgaW5zdGFuY2UgdHlwZSBvbiB0aGUgW0FtYXpvbiBFQzIgSW5zdGFuY2VzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZWMyL2luc3RhbmNlLXR5cGVzLykgZGV0YWlsIHBhZ2UgYnkgMSwwMjQuXG4gKiAgIExpbnV4IGNvbnRhaW5lcnMgc2hhcmUgdW5hbGxvY2F0ZWQgQ1BVIHVuaXRzIHdpdGggb3RoZXIgY29udGFpbmVycyBvbiB0aGUgY29udGFpbmVyIGluc3RhbmNlIHdpdGggdGhlIHNhbWUgcmF0aW8gYXMgdGhlaXIgYWxsb2NhdGVkIGFtb3VudC4gRm9yIGV4YW1wbGUsIGlmIHlvdSBydW4gYSBzaW5nbGUtY29udGFpbmVyIHRhc2sgb24gYSBzaW5nbGUtY29yZSBpbnN0YW5jZSB0eXBlIHdpdGggNTEyIENQVSB1bml0cyBzcGVjaWZpZWQgZm9yIHRoYXQgY29udGFpbmVyLCBhbmQgdGhhdCdzIHRoZSBvbmx5IHRhc2sgcnVubmluZyBvbiB0aGUgY29udGFpbmVyIGluc3RhbmNlLCB0aGF0IGNvbnRhaW5lciBjb3VsZCB1c2UgdGhlIGZ1bGwgMSwwMjQgQ1BVIHVuaXQgc2hhcmUgYXQgYW55IGdpdmVuIHRpbWUuIEhvd2V2ZXIsIGlmIHlvdSBsYXVuY2hlZCBhbm90aGVyIGNvcHkgb2YgdGhlIHNhbWUgdGFzayBvbiB0aGF0IGNvbnRhaW5lciBpbnN0YW5jZSwgZWFjaCB0YXNrIGlzIGd1YXJhbnRlZWQgYSBtaW5pbXVtIG9mIDUxMiBDUFUgdW5pdHMgd2hlbiBuZWVkZWQuIE1vcmVvdmVyLCBlYWNoIGNvbnRhaW5lciBjb3VsZCBmbG9hdCB0byBoaWdoZXIgQ1BVIHVzYWdlIGlmIHRoZSBvdGhlciBjb250YWluZXIgd2FzIG5vdCB1c2luZyBpdC4gSWYgYm90aCB0YXNrcyB3ZXJlIDEwMCUgYWN0aXZlIGFsbCBvZiB0aGUgdGltZSwgdGhleSB3b3VsZCBiZSBsaW1pdGVkIHRvIDUxMiBDUFUgdW5pdHMuXG4gKiAgT24gTGludXggY29udGFpbmVyIGluc3RhbmNlcywgdGhlIERvY2tlciBkYWVtb24gb24gdGhlIGNvbnRhaW5lciBpbnN0YW5jZSB1c2VzIHRoZSBDUFUgdmFsdWUgdG8gY2FsY3VsYXRlIHRoZSByZWxhdGl2ZSBDUFUgc2hhcmUgcmF0aW9zIGZvciBydW5uaW5nIGNvbnRhaW5lcnMuIFRoZSBtaW5pbXVtIHZhbGlkIENQVSBzaGFyZSB2YWx1ZSB0aGF0IHRoZSBMaW51eCBrZXJuZWwgYWxsb3dzIGlzIDIsIGFuZCB0aGUgbWF4aW11bSB2YWxpZCBDUFUgc2hhcmUgdmFsdWUgdGhhdCB0aGUgTGludXgga2VybmVsIGFsbG93cyBpcyAyNjIxNDQuIEhvd2V2ZXIsIHRoZSBDUFUgcGFyYW1ldGVyIGlzbid0IHJlcXVpcmVkLCBhbmQgeW91IGNhbiB1c2UgQ1BVIHZhbHVlcyBiZWxvdyAyIG9yIGFib3ZlIDI2MjE0NCBpbiB5b3VyIGNvbnRhaW5lciBkZWZpbml0aW9ucy4gRm9yIENQVSB2YWx1ZXMgYmVsb3cgMiAoaW5jbHVkaW5nIG51bGwpIG9yIGFib3ZlIDI2MjE0NCwgdGhlIGJlaGF2aW9yIHZhcmllcyBiYXNlZCBvbiB5b3VyIEFtYXpvbiBFQ1MgY29udGFpbmVyIGFnZW50IHZlcnNpb246XG4gKiAgICsgICpBZ2VudCB2ZXJzaW9ucyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMS4xLjA6KiBOdWxsIGFuZCB6ZXJvIENQVSB2YWx1ZXMgYXJlIHBhc3NlZCB0byBEb2NrZXIgYXMgMCwgd2hpY2ggRG9ja2VyIHRoZW4gY29udmVydHMgdG8gMSwwMjQgQ1BVIHNoYXJlcy4gQ1BVIHZhbHVlcyBvZiAxIGFyZSBwYXNzZWQgdG8gRG9ja2VyIGFzIDEsIHdoaWNoIHRoZSBMaW51eCBrZXJuZWwgY29udmVydHMgdG8gdHdvIENQVSBzaGFyZXMuXG4gKiAgICsgICpBZ2VudCB2ZXJzaW9ucyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMS4yLjA6KiBOdWxsLCB6ZXJvLCBhbmQgQ1BVIHZhbHVlcyBvZiAxIGFyZSBwYXNzZWQgdG8gRG9ja2VyIGFzIDIuXG4gKiAgICsgICpBZ2VudCB2ZXJzaW9ucyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMS44NC4wOiogQ1BVIHZhbHVlcyBncmVhdGVyIHRoYW4gMjU2IHZDUFUgYXJlIHBhc3NlZCB0byBEb2NrZXIgYXMgMjU2LCB3aGljaCBpcyBlcXVpdmFsZW50IHRvIDI2MjE0NCBDUFUgc2hhcmVzLlxuICogICBcbiAqICBPbiBXaW5kb3dzIGNvbnRhaW5lciBpbnN0YW5jZXMsIHRoZSBDUFUgbGltaXQgaXMgZW5mb3JjZWQgYXMgYW4gYWJzb2x1dGUgbGltaXQsIG9yIGEgcXVvdGEuIFdpbmRvd3MgY29udGFpbmVycyBvbmx5IGhhdmUgYWNjZXNzIHRvIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIENQVSB0aGF0J3MgZGVzY3JpYmVkIGluIHRoZSB0YXNrIGRlZmluaXRpb24uIEEgbnVsbCBvciB6ZXJvIENQVSB2YWx1ZSBpcyBwYXNzZWQgdG8gRG9ja2VyIGFzIGBgMGBgLCB3aGljaCBXaW5kb3dzIGludGVycHJldHMgYXMgMSUgb2Ygb25lIENQVS5cbiAqL1xuQ3B1PzogbnVtYmVyXG4vKipcbiAqIEVhcmx5IHZlcnNpb25zIG9mIHRoZSBBbWF6b24gRUNTIGNvbnRhaW5lciBhZ2VudCBkb24ndCBwcm9wZXJseSBoYW5kbGUgYGBlbnRyeVBvaW50YGAgcGFyYW1ldGVycy4gSWYgeW91IGhhdmUgcHJvYmxlbXMgdXNpbmcgYGBlbnRyeVBvaW50YGAsIHVwZGF0ZSB5b3VyIGNvbnRhaW5lciBhZ2VudCBvciBlbnRlciB5b3VyIGNvbW1hbmRzIGFuZCBhcmd1bWVudHMgYXMgYGBjb21tYW5kYGAgYXJyYXkgaXRlbXMgaW5zdGVhZC5cbiAqICAgVGhlIGVudHJ5IHBvaW50IHRoYXQncyBwYXNzZWQgdG8gdGhlIGNvbnRhaW5lci4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYEVudHJ5cG9pbnRgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS1lbnRyeXBvaW50YGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKi9cbkVudHJ5UG9pbnQ/OiBzdHJpbmdbXVxuLyoqXG4gKiBBIGxpc3Qgb2YgRE5TIHNlcnZlcnMgdGhhdCBhcmUgcHJlc2VudGVkIHRvIHRoZSBjb250YWluZXIuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBEbnNgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS1kbnNgYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi5cbiAqICAgVGhpcyBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZCBmb3IgV2luZG93cyBjb250YWluZXJzLlxuICovXG5EbnNTZXJ2ZXJzPzogc3RyaW5nW11cbi8qKlxuICogV2hlbiB0aGlzIHBhcmFtZXRlciBpcyB0cnVlLCB0aGUgY29udGFpbmVyIGlzIGdpdmVuIHJlYWQtb25seSBhY2Nlc3MgdG8gaXRzIHJvb3QgZmlsZSBzeXN0ZW0uIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBSZWFkb25seVJvb3Rmc2BgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kIGFuZCB0aGUgYGAtLXJlYWQtb25seWBgIG9wdGlvbiB0byBkb2NrZXIgcnVuLlxuICogICBUaGlzIHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkIGZvciBXaW5kb3dzIGNvbnRhaW5lcnMuXG4gKi9cblJlYWRvbmx5Um9vdEZpbGVzeXN0ZW0/OiBib29sZWFuXG4vKipcbiAqIFRoZSBpbWFnZSB1c2VkIHRvIHN0YXJ0IGEgY29udGFpbmVyLiBUaGlzIHN0cmluZyBpcyBwYXNzZWQgZGlyZWN0bHkgdG8gdGhlIERvY2tlciBkYWVtb24uIEJ5IGRlZmF1bHQsIGltYWdlcyBpbiB0aGUgRG9ja2VyIEh1YiByZWdpc3RyeSBhcmUgYXZhaWxhYmxlLiBPdGhlciByZXBvc2l0b3JpZXMgYXJlIHNwZWNpZmllZCB3aXRoIGVpdGhlciBgYHJlcG9zaXRvcnktdXJsL2ltYWdlOnRhZ2BgIG9yIGBgcmVwb3NpdG9yeS11cmwvaW1hZ2VAZGlnZXN0YGAuIEZvciBpbWFnZXMgdXNpbmcgdGFncyAocmVwb3NpdG9yeS11cmwvaW1hZ2U6dGFnKSwgdXAgdG8gMjU1IGNoYXJhY3RlcnMgdG90YWwgYXJlIGFsbG93ZWQsIGluY2x1ZGluZyBsZXR0ZXJzICh1cHBlcmNhc2UgYW5kIGxvd2VyY2FzZSksIG51bWJlcnMsIGh5cGhlbnMsIHVuZGVyc2NvcmVzLCBjb2xvbnMsIHBlcmlvZHMsIGZvcndhcmQgc2xhc2hlcywgYW5kIG51bWJlciBzaWducyAoIykuIEZvciBpbWFnZXMgdXNpbmcgZGlnZXN0cyAocmVwb3NpdG9yeS11cmwvaW1hZ2VAZGlnZXN0KSwgdGhlIDI1NSBjaGFyYWN0ZXIgbGltaXQgYXBwbGllcyBvbmx5IHRvIHRoZSByZXBvc2l0b3J5IFVSTCBhbmQgaW1hZ2UgbmFtZSAoZXZlcnl0aGluZyBiZWZvcmUgdGhlIEAgc2lnbikuIFRoZSBvbmx5IHN1cHBvcnRlZCBoYXNoIGZ1bmN0aW9uIGlzIHNoYTI1NiwgYW5kIHRoZSBoYXNoIHZhbHVlIGFmdGVyIHNoYTI1NjogbXVzdCBiZSBleGFjdGx5IDY0IGNoYXJhY3RlcnMgKG9ubHkgbGV0dGVycyBBLUYsIGEtZiwgYW5kIG51bWJlcnMgMC05IGFyZSBhbGxvd2VkKS4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYEltYWdlYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYElNQUdFYGAgcGFyYW1ldGVyIG9mIGRvY2tlciBydW4uXG4gKiAgICsgIFdoZW4gYSBuZXcgdGFzayBzdGFydHMsIHRoZSBBbWF6b24gRUNTIGNvbnRhaW5lciBhZ2VudCBwdWxscyB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIHNwZWNpZmllZCBpbWFnZSBhbmQgdGFnIGZvciB0aGUgY29udGFpbmVyIHRvIHVzZS4gSG93ZXZlciwgc3Vic2VxdWVudCB1cGRhdGVzIHRvIGEgcmVwb3NpdG9yeSBpbWFnZSBhcmVuJ3QgcHJvcGFnYXRlZCB0byBhbHJlYWR5IHJ1bm5pbmcgdGFza3MuXG4gKiAgICsgIEltYWdlcyBpbiBBbWF6b24gRUNSIHJlcG9zaXRvcmllcyBjYW4gYmUgc3BlY2lmaWVkIGJ5IGVpdGhlciB1c2luZyB0aGUgZnVsbCBgYHJlZ2lzdHJ5L3JlcG9zaXRvcnk6dGFnYGAgb3IgYGByZWdpc3RyeS9yZXBvc2l0b3J5QGRpZ2VzdGBgLiBGb3IgZXhhbXBsZSwgYGAwMTIzNDU2Nzg5MTAuZGtyLmVjci48cmVnaW9uLW5hbWU+LmFtYXpvbmF3cy5jb20vPHJlcG9zaXRvcnktbmFtZT46bGF0ZXN0YGAgb3IgYGAwMTIzNDU2Nzg5MTAuZGtyLmVjci48cmVnaW9uLW5hbWU+LmFtYXpvbmF3cy5jb20vPHJlcG9zaXRvcnktbmFtZT5Ac2hhMjU2Ojk0YWZkMWYyZTY0ZDkwOGJjOTBkYmNhMDAzNWE1YjU2N0VYQU1QTEVgYC4gXG4gKiAgICsgIEltYWdlcyBpbiBvZmZpY2lhbCByZXBvc2l0b3JpZXMgb24gRG9ja2VyIEh1YiB1c2UgYSBzaW5nbGUgbmFtZSAoZm9yIGV4YW1wbGUsIGBgdWJ1bnR1YGAgb3IgYGBtb25nb2BgKS5cbiAqICAgKyAgSW1hZ2VzIGluIG90aGVyIHJlcG9zaXRvcmllcyBvbiBEb2NrZXIgSHViIGFyZSBxdWFsaWZpZWQgd2l0aCBhbiBvcmdhbml6YXRpb24gbmFtZSAoZm9yIGV4YW1wbGUsIGBgYW1hem9uL2FtYXpvbi1lY3MtYWdlbnRgYCkuXG4gKiAgICsgIEltYWdlcyBpbiBvdGhlciBvbmxpbmUgcmVwb3NpdG9yaWVzIGFyZSBxdWFsaWZpZWQgZnVydGhlciBieSBhIGRvbWFpbiBuYW1lIChmb3IgZXhhbXBsZSwgYGBxdWF5LmlvL2Fzc2VtYmx5bGluZS91YnVudHVgYCkuXG4gKi9cbkltYWdlOiBzdHJpbmdcbi8qKlxuICogSWYgdGhlIGBgZXNzZW50aWFsYGAgcGFyYW1ldGVyIG9mIGEgY29udGFpbmVyIGlzIG1hcmtlZCBhcyBgYHRydWVgYCwgYW5kIHRoYXQgY29udGFpbmVyIGZhaWxzIG9yIHN0b3BzIGZvciBhbnkgcmVhc29uLCBhbGwgb3RoZXIgY29udGFpbmVycyB0aGF0IGFyZSBwYXJ0IG9mIHRoZSB0YXNrIGFyZSBzdG9wcGVkLiBJZiB0aGUgYGBlc3NlbnRpYWxgYCBwYXJhbWV0ZXIgb2YgYSBjb250YWluZXIgaXMgbWFya2VkIGFzIGBgZmFsc2VgYCwgaXRzIGZhaWx1cmUgZG9lc24ndCBhZmZlY3QgdGhlIHJlc3Qgb2YgdGhlIGNvbnRhaW5lcnMgaW4gYSB0YXNrLiBJZiB0aGlzIHBhcmFtZXRlciBpcyBvbWl0dGVkLCBhIGNvbnRhaW5lciBpcyBhc3N1bWVkIHRvIGJlIGVzc2VudGlhbC5cbiAqICBBbGwgdGFza3MgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBlc3NlbnRpYWwgY29udGFpbmVyLiBJZiB5b3UgaGF2ZSBhbiBhcHBsaWNhdGlvbiB0aGF0J3MgY29tcG9zZWQgb2YgbXVsdGlwbGUgY29udGFpbmVycywgZ3JvdXAgY29udGFpbmVycyB0aGF0IGFyZSB1c2VkIGZvciBhIGNvbW1vbiBwdXJwb3NlIGludG8gY29tcG9uZW50cywgYW5kIHNlcGFyYXRlIHRoZSBkaWZmZXJlbnQgY29tcG9uZW50cyBpbnRvIG11bHRpcGxlIHRhc2sgZGVmaW5pdGlvbnMuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0FwcGxpY2F0aW9uIEFyY2hpdGVjdHVyZV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvYXBwbGljYXRpb25fYXJjaGl0ZWN0dXJlLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuRXNzZW50aWFsPzogYm9vbGVhblxuTG9nQ29uZmlndXJhdGlvbj86IExvZ0NvbmZpZ3VyYXRpb25cbi8qKlxuICogVGhlIHR5cGUgYW5kIGFtb3VudCBvZiBhIHJlc291cmNlIHRvIGFzc2lnbiB0byBhIGNvbnRhaW5lci4gVGhlIG9ubHkgc3VwcG9ydGVkIHJlc291cmNlIGlzIGEgR1BVLlxuICovXG5SZXNvdXJjZVJlcXVpcmVtZW50cz86IFJlc291cmNlUmVxdWlyZW1lbnRbXVxuLyoqXG4gKiBBIGxpc3Qgb2YgZmlsZXMgY29udGFpbmluZyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIHBhc3MgdG8gYSBjb250YWluZXIuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gdGhlIGBgLS1lbnYtZmlsZWBgIG9wdGlvbiB0byBkb2NrZXIgcnVuLlxuICogIFlvdSBjYW4gc3BlY2lmeSB1cCB0byB0ZW4gZW52aXJvbm1lbnQgZmlsZXMuIFRoZSBmaWxlIG11c3QgaGF2ZSBhIGBgLmVudmBgIGZpbGUgZXh0ZW5zaW9uLiBFYWNoIGxpbmUgaW4gYW4gZW52aXJvbm1lbnQgZmlsZSBjb250YWlucyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpbiBgYFZBUklBQkxFPVZBTFVFYGAgZm9ybWF0LiBMaW5lcyBiZWdpbm5pbmcgd2l0aCBgYCNgYCBhcmUgdHJlYXRlZCBhcyBjb21tZW50cyBhbmQgYXJlIGlnbm9yZWQuXG4gKiAgSWYgdGhlcmUgYXJlIGVudmlyb25tZW50IHZhcmlhYmxlcyBzcGVjaWZpZWQgdXNpbmcgdGhlIGBgZW52aXJvbm1lbnRgYCBwYXJhbWV0ZXIgaW4gYSBjb250YWluZXIgZGVmaW5pdGlvbiwgdGhleSB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aGUgdmFyaWFibGVzIGNvbnRhaW5lZCB3aXRoaW4gYW4gZW52aXJvbm1lbnQgZmlsZS4gSWYgbXVsdGlwbGUgZW52aXJvbm1lbnQgZmlsZXMgYXJlIHNwZWNpZmllZCB0aGF0IGNvbnRhaW4gdGhlIHNhbWUgdmFyaWFibGUsIHRoZXkncmUgcHJvY2Vzc2VkIGZyb20gdGhlIHRvcCBkb3duLiBXZSByZWNvbW1lbmQgdGhhdCB5b3UgdXNlIHVuaXF1ZSB2YXJpYWJsZSBuYW1lcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbU3BlY2lmeWluZyBFbnZpcm9ubWVudCBWYXJpYWJsZXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3Rhc2tkZWYtZW52ZmlsZXMuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5FbnZpcm9ubWVudEZpbGVzPzogRW52aXJvbm1lbnRGaWxlW11cbi8qKlxuICogVGhlIG5hbWUgb2YgYSBjb250YWluZXIuIElmIHlvdSdyZSBsaW5raW5nIG11bHRpcGxlIGNvbnRhaW5lcnMgdG9nZXRoZXIgaW4gYSB0YXNrIGRlZmluaXRpb24sIHRoZSBgYG5hbWVgYCBvZiBvbmUgY29udGFpbmVyIGNhbiBiZSBlbnRlcmVkIGluIHRoZSBgYGxpbmtzYGAgb2YgYW5vdGhlciBjb250YWluZXIgdG8gY29ubmVjdCB0aGUgY29udGFpbmVycy4gVXAgdG8gMjU1IGxldHRlcnMgKHVwcGVyY2FzZSBhbmQgbG93ZXJjYXNlKSwgbnVtYmVycywgdW5kZXJzY29yZXMsIGFuZCBoeXBoZW5zIGFyZSBhbGxvd2VkLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgbmFtZWBgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kIGFuZCB0aGUgYGAtLW5hbWVgYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi5cbiAqL1xuTmFtZTogc3RyaW5nXG5GaXJlbGVuc0NvbmZpZ3VyYXRpb24/OiBGaXJlbGVuc0NvbmZpZ3VyYXRpb25cbi8qKlxuICogQSBsaXN0IG9mIHN0cmluZ3MgdG8gcHJvdmlkZSBjdXN0b20gY29uZmlndXJhdGlvbiBmb3IgbXVsdGlwbGUgc2VjdXJpdHkgc3lzdGVtcy4gVGhpcyBmaWVsZCBpc24ndCB2YWxpZCBmb3IgY29udGFpbmVycyBpbiB0YXNrcyB1c2luZyB0aGUgRmFyZ2F0ZSBsYXVuY2ggdHlwZS5cbiAqICBGb3IgTGludXggdGFza3Mgb24gRUMyLCB0aGlzIHBhcmFtZXRlciBjYW4gYmUgdXNlZCB0byByZWZlcmVuY2UgY3VzdG9tIGxhYmVscyBmb3IgU0VMaW51eCBhbmQgQXBwQXJtb3IgbXVsdGktbGV2ZWwgc2VjdXJpdHkgc3lzdGVtcy5cbiAqICBGb3IgYW55IHRhc2tzIG9uIEVDMiwgdGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHVzZWQgdG8gcmVmZXJlbmNlIGEgY3JlZGVudGlhbCBzcGVjIGZpbGUgdGhhdCBjb25maWd1cmVzIGEgY29udGFpbmVyIGZvciBBY3RpdmUgRGlyZWN0b3J5IGF1dGhlbnRpY2F0aW9uLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtVc2luZyBnTVNBcyBmb3IgV2luZG93cyBDb250YWluZXJzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS93aW5kb3dzLWdtc2EuaHRtbCkgYW5kIFtVc2luZyBnTVNBcyBmb3IgTGludXggQ29udGFpbmVyc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvbGludXgtZ21zYS5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKiAgVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYFNlY3VyaXR5T3B0YGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYC0tc2VjdXJpdHktb3B0YGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKiAgIFRoZSBBbWF6b24gRUNTIGNvbnRhaW5lciBhZ2VudCBydW5uaW5nIG9uIGEgY29udGFpbmVyIGluc3RhbmNlIG11c3QgcmVnaXN0ZXIgd2l0aCB0aGUgYGBFQ1NfU0VMSU5VWF9DQVBBQkxFPXRydWVgYCBvciBgYEVDU19BUFBBUk1PUl9DQVBBQkxFPXRydWVgYCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYmVmb3JlIGNvbnRhaW5lcnMgcGxhY2VkIG9uIHRoYXQgaW5zdGFuY2UgY2FuIHVzZSB0aGVzZSBzZWN1cml0eSBvcHRpb25zLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtBbWF6b24gRUNTIENvbnRhaW5lciBBZ2VudCBDb25maWd1cmF0aW9uXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9lY3MtYWdlbnQtY29uZmlnLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICAgVmFsaWQgdmFsdWVzOiBcIm5vLW5ldy1wcml2aWxlZ2VzXCIgfCBcImFwcGFybW9yOlBST0ZJTEVcIiB8IFwibGFiZWw6dmFsdWVcIiB8IFwiY3JlZGVudGlhbHNwZWM6Q3JlZGVudGlhbFNwZWNGaWxlUGF0aFwiXG4gKi9cbkRvY2tlclNlY3VyaXR5T3B0aW9ucz86IHN0cmluZ1tdXG4vKipcbiAqIEEgbGlzdCBvZiBuYW1lc3BhY2VkIGtlcm5lbCBwYXJhbWV0ZXJzIHRvIHNldCBpbiB0aGUgY29udGFpbmVyLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgU3lzY3Rsc2BgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kIGFuZCB0aGUgYGAtLXN5c2N0bGBgIG9wdGlvbiB0byBkb2NrZXIgcnVuLiBGb3IgZXhhbXBsZSwgeW91IGNhbiBjb25maWd1cmUgYGBuZXQuaXB2NC50Y3Bfa2VlcGFsaXZlX3RpbWVgYCBzZXR0aW5nIHRvIG1haW50YWluIGxvbmdlciBsaXZlZCBjb25uZWN0aW9ucy5cbiAqL1xuU3lzdGVtQ29udHJvbHM/OiBTeXN0ZW1Db250cm9sW11cbi8qKlxuICogV2hlbiB0aGlzIHBhcmFtZXRlciBpcyBgYHRydWVgYCwgeW91IGNhbiBkZXBsb3kgY29udGFpbmVyaXplZCBhcHBsaWNhdGlvbnMgdGhhdCByZXF1aXJlIGBgc3RkaW5gYCBvciBhIGBgdHR5YGAgdG8gYmUgYWxsb2NhdGVkLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgT3BlblN0ZGluYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYC0taW50ZXJhY3RpdmVgYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi5cbiAqL1xuSW50ZXJhY3RpdmU/OiBib29sZWFuXG4vKipcbiAqIEEgbGlzdCBvZiBETlMgc2VhcmNoIGRvbWFpbnMgdGhhdCBhcmUgcHJlc2VudGVkIHRvIHRoZSBjb250YWluZXIuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBEbnNTZWFyY2hgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS1kbnMtc2VhcmNoYGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKiAgIFRoaXMgcGFyYW1ldGVyIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIFdpbmRvd3MgY29udGFpbmVycy5cbiAqL1xuRG5zU2VhcmNoRG9tYWlucz86IHN0cmluZ1tdXG4vKipcbiAqIEEgbGlzdCBvZiBBUk5zIGluIFNTTSBvciBBbWF6b24gUzMgdG8gYSBjcmVkZW50aWFsIHNwZWMgKGBgQ3JlZFNwZWNgYCkgZmlsZSB0aGF0IGNvbmZpZ3VyZXMgdGhlIGNvbnRhaW5lciBmb3IgQWN0aXZlIERpcmVjdG9yeSBhdXRoZW50aWNhdGlvbi4gV2UgcmVjb21tZW5kIHRoYXQgeW91IHVzZSB0aGlzIHBhcmFtZXRlciBpbnN0ZWFkIG9mIHRoZSBgYGRvY2tlclNlY3VyaXR5T3B0aW9uc2BgLiBUaGUgbWF4aW11bSBudW1iZXIgb2YgQVJOcyBpcyAxLlxuICogIFRoZXJlIGFyZSB0d28gZm9ybWF0cyBmb3IgZWFjaCBBUk4uXG4gKiAgICsgY3JlZGVudGlhbHNwZWNkb21haW5sZXNzOk15QVJOIFlvdSB1c2UgY3JlZGVudGlhbHNwZWNkb21haW5sZXNzOk15QVJOIHRvIHByb3ZpZGUgYSBDcmVkU3BlYyB3aXRoIGFuIGFkZGl0aW9uYWwgc2VjdGlvbiBmb3IgYSBzZWNyZXQgaW4gLiBZb3UgcHJvdmlkZSB0aGUgbG9naW4gY3JlZGVudGlhbHMgdG8gdGhlIGRvbWFpbiBpbiB0aGUgc2VjcmV0LiBFYWNoIHRhc2sgdGhhdCBydW5zIG9uIGFueSBjb250YWluZXIgaW5zdGFuY2UgY2FuIGpvaW4gZGlmZmVyZW50IGRvbWFpbnMuIFlvdSBjYW4gdXNlIHRoaXMgZm9ybWF0IHdpdGhvdXQgam9pbmluZyB0aGUgY29udGFpbmVyIGluc3RhbmNlIHRvIGEgZG9tYWluLiArIGNyZWRlbnRpYWxzcGVjOk15QVJOIFlvdSB1c2UgY3JlZGVudGlhbHNwZWM6TXlBUk4gdG8gcHJvdmlkZSBhIENyZWRTcGVjIGZvciBhIHNpbmdsZSBkb21haW4uIFlvdSBtdXN0IGpvaW4gdGhlIGNvbnRhaW5lciBpbnN0YW5jZSB0byB0aGUgZG9tYWluIGJlZm9yZSB5b3Ugc3RhcnQgYW55IHRhc2tzIHRoYXQgdXNlIHRoaXMgdGFzayBkZWZpbml0aW9uLiBcbiAqICBJbiBib3RoIGZvcm1hdHMsIHJlcGxhY2UgYGBNeUFSTmBgIHdpdGggdGhlIEFSTiBpbiBTU00gb3IgQW1hem9uIFMzLlxuICogIElmIHlvdSBwcm92aWRlIGEgYGBjcmVkZW50aWFsc3BlY2RvbWFpbmxlc3M6TXlBUk5gYCwgdGhlIGBgY3JlZHNwZWNgYCBtdXN0IHByb3ZpZGUgYSBBUk4gaW4gQVNNbG9uZyBmb3IgYSBzZWNyZXQgY29udGFpbmluZyB0aGUgdXNlcm5hbWUsIHBhc3N3b3JkLCBhbmQgdGhlIGRvbWFpbiB0byBjb25uZWN0IHRvLiBGb3IgYmV0dGVyIHNlY3VyaXR5LCB0aGUgaW5zdGFuY2UgaXNuJ3Qgam9pbmVkIHRvIHRoZSBkb21haW4gZm9yIGRvbWFpbmxlc3MgYXV0aGVudGljYXRpb24uIE90aGVyIGFwcGxpY2F0aW9ucyBvbiB0aGUgaW5zdGFuY2UgY2FuJ3QgdXNlIHRoZSBkb21haW5sZXNzIGNyZWRlbnRpYWxzLiBZb3UgY2FuIHVzZSB0aGlzIHBhcmFtZXRlciB0byBydW4gdGFza3Mgb24gdGhlIHNhbWUgaW5zdGFuY2UsIGV2ZW4gaXQgdGhlIHRhc2tzIG5lZWQgdG8gam9pbiBkaWZmZXJlbnQgZG9tYWlucy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbVXNpbmcgZ01TQXMgZm9yIFdpbmRvd3MgQ29udGFpbmVyc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvd2luZG93cy1nbXNhLmh0bWwpIGFuZCBbVXNpbmcgZ01TQXMgZm9yIExpbnV4IENvbnRhaW5lcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2xpbnV4LWdtc2EuaHRtbCkuXG4gKi9cbkNyZWRlbnRpYWxTcGVjcz86IHN0cmluZ1tdXG4vKipcbiAqIEEgbGlzdCBvZiBgYHVsaW1pdHNgYCB0byBzZXQgaW4gdGhlIGNvbnRhaW5lci4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYFVsaW1pdHNgYCBpbiB0aGUgW0NyZWF0ZSBhIGNvbnRhaW5lcl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2h0dHBzOi8vZG9jcy5kb2NrZXIuY29tL2VuZ2luZS9hcGkvdjEuMzUvI29wZXJhdGlvbi9Db250YWluZXJDcmVhdGUpIHNlY3Rpb24gb2YgdGhlIFtEb2NrZXIgUmVtb3RlIEFQSV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2h0dHBzOi8vZG9jcy5kb2NrZXIuY29tL2VuZ2luZS9hcGkvdjEuMzUvKSBhbmQgdGhlIGBgLS11bGltaXRgYCBvcHRpb24gdG8gW2RvY2tlciBydW5dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9odHRwczovL2RvY3MuZG9ja2VyLmNvbS9lbmdpbmUvcmVmZXJlbmNlL3J1bi8pLiBWYWxpZCBuYW1pbmcgdmFsdWVzIGFyZSBkaXNwbGF5ZWQgaW4gdGhlIFtVbGltaXRdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfVWxpbWl0Lmh0bWwpIGRhdGEgdHlwZS4gVGhpcyBwYXJhbWV0ZXIgcmVxdWlyZXMgdmVyc2lvbiAxLjE4IG9mIHRoZSBEb2NrZXIgUmVtb3RlIEFQSSBvciBncmVhdGVyIG9uIHlvdXIgY29udGFpbmVyIGluc3RhbmNlLiBUbyBjaGVjayB0aGUgRG9ja2VyIFJlbW90ZSBBUEkgdmVyc2lvbiBvbiB5b3VyIGNvbnRhaW5lciBpbnN0YW5jZSwgbG9nIGluIHRvIHlvdXIgY29udGFpbmVyIGluc3RhbmNlIGFuZCBydW4gdGhlIGZvbGxvd2luZyBjb21tYW5kOiBgYHN1ZG8gZG9ja2VyIHZlcnNpb24gLS1mb3JtYXQgJ3t7LlNlcnZlci5BUElWZXJzaW9ufX0nYGBcbiAqICAgVGhpcyBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZCBmb3IgV2luZG93cyBjb250YWluZXJzLlxuICovXG5VbGltaXRzPzogVWxpbWl0W11cbi8qKlxuICogVGltZSBkdXJhdGlvbiAoaW4gc2Vjb25kcykgdG8gd2FpdCBiZWZvcmUgdGhlIGNvbnRhaW5lciBpcyBmb3JjZWZ1bGx5IGtpbGxlZCBpZiBpdCBkb2Vzbid0IGV4aXQgbm9ybWFsbHkgb24gaXRzIG93bi5cbiAqICBGb3IgdGFza3MgdXNpbmcgdGhlIEZhcmdhdGUgbGF1bmNoIHR5cGUsIHRoZSB0YXNrIG9yIHNlcnZpY2UgcmVxdWlyZXMgdGhlIGZvbGxvd2luZyBwbGF0Zm9ybXM6XG4gKiAgICsgIExpbnV4IHBsYXRmb3JtIHZlcnNpb24gYGAxLjMuMGBgIG9yIGxhdGVyLlxuICogICArICBXaW5kb3dzIHBsYXRmb3JtIHZlcnNpb24gYGAxLjAuMGBgIG9yIGxhdGVyLlxuICogICBcbiAqICBGb3IgdGFza3MgdGhhdCB1c2UgdGhlIEZhcmdhdGUgbGF1bmNoIHR5cGUsIHRoZSBtYXggc3RvcCB0aW1lb3V0IHZhbHVlIGlzIDEyMCBzZWNvbmRzIGFuZCBpZiB0aGUgcGFyYW1ldGVyIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IHZhbHVlIG9mIDMwIHNlY29uZHMgaXMgdXNlZC5cbiAqICBGb3IgdGFza3MgdGhhdCB1c2UgdGhlIEVDMiBsYXVuY2ggdHlwZSwgaWYgdGhlIGBgc3RvcFRpbWVvdXRgYCBwYXJhbWV0ZXIgaXNuJ3Qgc3BlY2lmaWVkLCB0aGUgdmFsdWUgc2V0IGZvciB0aGUgQW1hem9uIEVDUyBjb250YWluZXIgYWdlbnQgY29uZmlndXJhdGlvbiB2YXJpYWJsZSBgYEVDU19DT05UQUlORVJfU1RPUF9USU1FT1VUYGAgaXMgdXNlZC4gSWYgbmVpdGhlciB0aGUgYGBzdG9wVGltZW91dGBgIHBhcmFtZXRlciBvciB0aGUgYGBFQ1NfQ09OVEFJTkVSX1NUT1BfVElNRU9VVGBgIGFnZW50IGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgYXJlIHNldCwgdGhlbiB0aGUgZGVmYXVsdCB2YWx1ZXMgb2YgMzAgc2Vjb25kcyBmb3IgTGludXggY29udGFpbmVycyBhbmQgMzAgc2Vjb25kcyBvbiBXaW5kb3dzIGNvbnRhaW5lcnMgYXJlIHVzZWQuIFlvdXIgY29udGFpbmVyIGluc3RhbmNlcyByZXF1aXJlIGF0IGxlYXN0IHZlcnNpb24gMS4yNi4wIG9mIHRoZSBjb250YWluZXIgYWdlbnQgdG8gdXNlIGEgY29udGFpbmVyIHN0b3AgdGltZW91dCB2YWx1ZS4gSG93ZXZlciwgd2UgcmVjb21tZW5kIHVzaW5nIHRoZSBsYXRlc3QgY29udGFpbmVyIGFnZW50IHZlcnNpb24uIEZvciBpbmZvcm1hdGlvbiBhYm91dCBjaGVja2luZyB5b3VyIGFnZW50IHZlcnNpb24gYW5kIHVwZGF0aW5nIHRvIHRoZSBsYXRlc3QgdmVyc2lvbiwgc2VlIFtVcGRhdGluZyB0aGUgQW1hem9uIEVDUyBDb250YWluZXIgQWdlbnRdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2Vjcy1hZ2VudC11cGRhdGUuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLiBJZiB5b3UncmUgdXNpbmcgYW4gQW1hem9uIEVDUy1vcHRpbWl6ZWQgTGludXggQU1JLCB5b3VyIGluc3RhbmNlIG5lZWRzIGF0IGxlYXN0IHZlcnNpb24gMS4yNi4wLTEgb2YgdGhlIGBgZWNzLWluaXRgYCBwYWNrYWdlLiBJZiB5b3VyIGNvbnRhaW5lciBpbnN0YW5jZXMgYXJlIGxhdW5jaGVkIGZyb20gdmVyc2lvbiBgYDIwMTkwMzAxYGAgb3IgbGF0ZXIsIHRoZW4gdGhleSBjb250YWluIHRoZSByZXF1aXJlZCB2ZXJzaW9ucyBvZiB0aGUgY29udGFpbmVyIGFnZW50IGFuZCBgYGVjcy1pbml0YGAuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0FtYXpvbiBFQ1Mtb3B0aW1pemVkIExpbnV4IEFNSV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvZWNzLW9wdGltaXplZF9BTUkuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICogIFRoZSB2YWxpZCB2YWx1ZXMgZm9yIEZhcmdhdGUgYXJlIDItMTIwIHNlY29uZHMuXG4gKi9cblN0b3BUaW1lb3V0PzogbnVtYmVyXG4vKipcbiAqIFRoZSB3b3JraW5nIGRpcmVjdG9yeSB0byBydW4gY29tbWFuZHMgaW5zaWRlIHRoZSBjb250YWluZXIgaW4uIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBXb3JraW5nRGlyYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYC0td29ya2RpcmBgIG9wdGlvbiB0byBkb2NrZXIgcnVuLlxuICovXG5Xb3JraW5nRGlyZWN0b3J5Pzogc3RyaW5nXG4vKipcbiAqIFRoZSBzb2Z0IGxpbWl0IChpbiBNaUIpIG9mIG1lbW9yeSB0byByZXNlcnZlIGZvciB0aGUgY29udGFpbmVyLiBXaGVuIHN5c3RlbSBtZW1vcnkgaXMgdW5kZXIgaGVhdnkgY29udGVudGlvbiwgRG9ja2VyIGF0dGVtcHRzIHRvIGtlZXAgdGhlIGNvbnRhaW5lciBtZW1vcnkgdG8gdGhpcyBzb2Z0IGxpbWl0LiBIb3dldmVyLCB5b3VyIGNvbnRhaW5lciBjYW4gY29uc3VtZSBtb3JlIG1lbW9yeSB3aGVuIGl0IG5lZWRzIHRvLCB1cCB0byBlaXRoZXIgdGhlIGhhcmQgbGltaXQgc3BlY2lmaWVkIHdpdGggdGhlIGBgbWVtb3J5YGAgcGFyYW1ldGVyIChpZiBhcHBsaWNhYmxlKSwgb3IgYWxsIG9mIHRoZSBhdmFpbGFibGUgbWVtb3J5IG9uIHRoZSBjb250YWluZXIgaW5zdGFuY2UsIHdoaWNoZXZlciBjb21lcyBmaXJzdC4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYE1lbW9yeVJlc2VydmF0aW9uYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYC0tbWVtb3J5LXJlc2VydmF0aW9uYGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKiAgSWYgYSB0YXNrLWxldmVsIG1lbW9yeSB2YWx1ZSBpcyBub3Qgc3BlY2lmaWVkLCB5b3UgbXVzdCBzcGVjaWZ5IGEgbm9uLXplcm8gaW50ZWdlciBmb3Igb25lIG9yIGJvdGggb2YgYGBtZW1vcnlgYCBvciBgYG1lbW9yeVJlc2VydmF0aW9uYGAgaW4gYSBjb250YWluZXIgZGVmaW5pdGlvbi4gSWYgeW91IHNwZWNpZnkgYm90aCwgYGBtZW1vcnlgYCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBgYG1lbW9yeVJlc2VydmF0aW9uYGAuIElmIHlvdSBzcGVjaWZ5IGBgbWVtb3J5UmVzZXJ2YXRpb25gYCwgdGhlbiB0aGF0IHZhbHVlIGlzIHN1YnRyYWN0ZWQgZnJvbSB0aGUgYXZhaWxhYmxlIG1lbW9yeSByZXNvdXJjZXMgZm9yIHRoZSBjb250YWluZXIgaW5zdGFuY2Ugd2hlcmUgdGhlIGNvbnRhaW5lciBpcyBwbGFjZWQuIE90aGVyd2lzZSwgdGhlIHZhbHVlIG9mIGBgbWVtb3J5YGAgaXMgdXNlZC5cbiAqICBGb3IgZXhhbXBsZSwgaWYgeW91ciBjb250YWluZXIgbm9ybWFsbHkgdXNlcyAxMjggTWlCIG9mIG1lbW9yeSwgYnV0IG9jY2FzaW9uYWxseSBidXJzdHMgdG8gMjU2IE1pQiBvZiBtZW1vcnkgZm9yIHNob3J0IHBlcmlvZHMgb2YgdGltZSwgeW91IGNhbiBzZXQgYSBgYG1lbW9yeVJlc2VydmF0aW9uYGAgb2YgMTI4IE1pQiwgYW5kIGEgYGBtZW1vcnlgYCBoYXJkIGxpbWl0IG9mIDMwMCBNaUIuIFRoaXMgY29uZmlndXJhdGlvbiB3b3VsZCBhbGxvdyB0aGUgY29udGFpbmVyIHRvIG9ubHkgcmVzZXJ2ZSAxMjggTWlCIG9mIG1lbW9yeSBmcm9tIHRoZSByZW1haW5pbmcgcmVzb3VyY2VzIG9uIHRoZSBjb250YWluZXIgaW5zdGFuY2UsIGJ1dCBhbHNvIGFsbG93IHRoZSBjb250YWluZXIgdG8gY29uc3VtZSBtb3JlIG1lbW9yeSByZXNvdXJjZXMgd2hlbiBuZWVkZWQuXG4gKiAgVGhlIERvY2tlciAyMC4xMC4wIG9yIGxhdGVyIGRhZW1vbiByZXNlcnZlcyBhIG1pbmltdW0gb2YgNiBNaUIgb2YgbWVtb3J5IGZvciBhIGNvbnRhaW5lci4gU28sIGRvbid0IHNwZWNpZnkgbGVzcyB0aGFuIDYgTWlCIG9mIG1lbW9yeSBmb3IgeW91ciBjb250YWluZXJzLiBcbiAqICBUaGUgRG9ja2VyIDE5LjAzLjEzLWNlIG9yIGVhcmxpZXIgZGFlbW9uIHJlc2VydmVzIGEgbWluaW11bSBvZiA0IE1pQiBvZiBtZW1vcnkgZm9yIGEgY29udGFpbmVyLiBTbywgZG9uJ3Qgc3BlY2lmeSBsZXNzIHRoYW4gNCBNaUIgb2YgbWVtb3J5IGZvciB5b3VyIGNvbnRhaW5lcnMuXG4gKi9cbk1lbW9yeVJlc2VydmF0aW9uPzogbnVtYmVyXG5SZXBvc2l0b3J5Q3JlZGVudGlhbHM/OiBSZXBvc2l0b3J5Q3JlZGVudGlhbHNcbi8qKlxuICogQSBsaXN0IG9mIGhvc3RuYW1lcyBhbmQgSVAgYWRkcmVzcyBtYXBwaW5ncyB0byBhcHBlbmQgdG8gdGhlIGBgL2V0Yy9ob3N0c2BgIGZpbGUgb24gdGhlIGNvbnRhaW5lci4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYEV4dHJhSG9zdHNgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS1hZGQtaG9zdGBgIG9wdGlvbiB0byBkb2NrZXIgcnVuLlxuICogICBUaGlzIHBhcmFtZXRlciBpc24ndCBzdXBwb3J0ZWQgZm9yIFdpbmRvd3MgY29udGFpbmVycyBvciB0YXNrcyB0aGF0IHVzZSB0aGUgYGBhd3N2cGNgYCBuZXR3b3JrIG1vZGUuXG4gKi9cbkV4dHJhSG9zdHM/OiBIb3N0RW50cnlbXVxuLyoqXG4gKiBUaGUgaG9zdG5hbWUgdG8gdXNlIGZvciB5b3VyIGNvbnRhaW5lci4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYEhvc3RuYW1lYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYC0taG9zdG5hbWVgYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi5cbiAqICAgVGhlIGBgaG9zdG5hbWVgYCBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZCBpZiB5b3UncmUgdXNpbmcgdGhlIGBgYXdzdnBjYGAgbmV0d29yayBtb2RlLlxuICovXG5Ib3N0bmFtZT86IHN0cmluZ1xuTGludXhQYXJhbWV0ZXJzPzogTGludXhQYXJhbWV0ZXJzXG4vKipcbiAqIFNwZWNpZmllcyB3aGV0aGVyIEFtYXpvbiBFQ1Mgd2lsbCByZXNvbHZlIHRoZSBjb250YWluZXIgaW1hZ2UgdGFnIHByb3ZpZGVkIGluIHRoZSBjb250YWluZXIgZGVmaW5pdGlvbiB0byBhbiBpbWFnZSBkaWdlc3QuIEJ5IGRlZmF1bHQsIHRoZSB2YWx1ZSBpcyBgYGVuYWJsZWRgYC4gSWYgeW91IHNldCB0aGUgdmFsdWUgZm9yIGEgY29udGFpbmVyIGFzIGBgZGlzYWJsZWRgYCwgQW1hem9uIEVDUyB3aWxsIG5vdCByZXNvbHZlIHRoZSBwcm92aWRlZCBjb250YWluZXIgaW1hZ2UgdGFnIHRvIGEgZGlnZXN0IGFuZCB3aWxsIHVzZSB0aGUgb3JpZ2luYWwgaW1hZ2UgVVJJIHNwZWNpZmllZCBpbiB0aGUgY29udGFpbmVyIGRlZmluaXRpb24gZm9yIGRlcGxveW1lbnQuIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGNvbnRhaW5lciBpbWFnZSByZXNvbHV0aW9uLCBzZWUgW0NvbnRhaW5lciBpbWFnZSByZXNvbHV0aW9uXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9kZXBsb3ltZW50LXR5cGUtZWNzLmh0bWwjZGVwbG95bWVudC1jb250YWluZXItaW1hZ2Utc3RhYmlsaXR5KSBpbiB0aGUgKkFtYXpvbiBFQ1MgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuVmVyc2lvbkNvbnNpc3RlbmN5PzogKFwiZW5hYmxlZFwiIHwgXCJkaXNhYmxlZFwiKVxuUmVzdGFydFBvbGljeT86IFJlc3RhcnRQb2xpY3lcbi8qKlxuICogV2hlbiB0aGlzIHBhcmFtZXRlciBpcyB0cnVlLCBuZXR3b3JraW5nIGlzIG9mZiB3aXRoaW4gdGhlIGNvbnRhaW5lci4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYE5ldHdvcmtEaXNhYmxlZGBgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kLlxuICogICBUaGlzIHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkIGZvciBXaW5kb3dzIGNvbnRhaW5lcnMuXG4gKi9cbkRpc2FibGVOZXR3b3JraW5nPzogYm9vbGVhblxuLyoqXG4gKiBXaGVuIHRoaXMgcGFyYW1ldGVyIGlzIGBgdHJ1ZWBgLCBhIFRUWSBpcyBhbGxvY2F0ZWQuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBUdHlgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS10dHlgYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi5cbiAqL1xuUHNldWRvVGVybWluYWw/OiBib29sZWFuXG4vKipcbiAqIFRoZSBtb3VudCBwb2ludHMgZm9yIGRhdGEgdm9sdW1lcyBpbiB5b3VyIGNvbnRhaW5lci5cbiAqICBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgVm9sdW1lc2BgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kIGFuZCB0aGUgYGAtLXZvbHVtZWBgIG9wdGlvbiB0byBkb2NrZXIgcnVuLlxuICogIFdpbmRvd3MgY29udGFpbmVycyBjYW4gbW91bnQgd2hvbGUgZGlyZWN0b3JpZXMgb24gdGhlIHNhbWUgZHJpdmUgYXMgYGAkZW52OlByb2dyYW1EYXRhYGAuIFdpbmRvd3MgY29udGFpbmVycyBjYW4ndCBtb3VudCBkaXJlY3RvcmllcyBvbiBhIGRpZmZlcmVudCBkcml2ZSwgYW5kIG1vdW50IHBvaW50IGNhbid0IGJlIGFjcm9zcyBkcml2ZXMuXG4gKi9cbk1vdW50UG9pbnRzPzogTW91bnRQb2ludFtdXG4vKipcbiAqIFRoZSBkZXBlbmRlbmNpZXMgZGVmaW5lZCBmb3IgY29udGFpbmVyIHN0YXJ0dXAgYW5kIHNodXRkb3duLiBBIGNvbnRhaW5lciBjYW4gY29udGFpbiBtdWx0aXBsZSBkZXBlbmRlbmNpZXMuIFdoZW4gYSBkZXBlbmRlbmN5IGlzIGRlZmluZWQgZm9yIGNvbnRhaW5lciBzdGFydHVwLCBmb3IgY29udGFpbmVyIHNodXRkb3duIGl0IGlzIHJldmVyc2VkLlxuICogIEZvciB0YXNrcyB1c2luZyB0aGUgRUMyIGxhdW5jaCB0eXBlLCB0aGUgY29udGFpbmVyIGluc3RhbmNlcyByZXF1aXJlIGF0IGxlYXN0IHZlcnNpb24gMS4yNi4wIG9mIHRoZSBjb250YWluZXIgYWdlbnQgdG8gdHVybiBvbiBjb250YWluZXIgZGVwZW5kZW5jaWVzLiBIb3dldmVyLCB3ZSByZWNvbW1lbmQgdXNpbmcgdGhlIGxhdGVzdCBjb250YWluZXIgYWdlbnQgdmVyc2lvbi4gRm9yIGluZm9ybWF0aW9uIGFib3V0IGNoZWNraW5nIHlvdXIgYWdlbnQgdmVyc2lvbiBhbmQgdXBkYXRpbmcgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uLCBzZWUgW1VwZGF0aW5nIHRoZSBBbWF6b24gRUNTIENvbnRhaW5lciBBZ2VudF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvZWNzLWFnZW50LXVwZGF0ZS5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouIElmIHlvdSdyZSB1c2luZyBhbiBBbWF6b24gRUNTLW9wdGltaXplZCBMaW51eCBBTUksIHlvdXIgaW5zdGFuY2UgbmVlZHMgYXQgbGVhc3QgdmVyc2lvbiAxLjI2LjAtMSBvZiB0aGUgYGBlY3MtaW5pdGBgIHBhY2thZ2UuIElmIHlvdXIgY29udGFpbmVyIGluc3RhbmNlcyBhcmUgbGF1bmNoZWQgZnJvbSB2ZXJzaW9uIGBgMjAxOTAzMDFgYCBvciBsYXRlciwgdGhlbiB0aGV5IGNvbnRhaW4gdGhlIHJlcXVpcmVkIHZlcnNpb25zIG9mIHRoZSBjb250YWluZXIgYWdlbnQgYW5kIGBgZWNzLWluaXRgYC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQW1hem9uIEVDUy1vcHRpbWl6ZWQgTGludXggQU1JXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9lY3Mtb3B0aW1pemVkX0FNSS5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKiAgRm9yIHRhc2tzIHVzaW5nIHRoZSBGYXJnYXRlIGxhdW5jaCB0eXBlLCB0aGUgdGFzayBvciBzZXJ2aWNlIHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcgcGxhdGZvcm1zOlxuICogICArICBMaW51eCBwbGF0Zm9ybSB2ZXJzaW9uIGBgMS4zLjBgYCBvciBsYXRlci5cbiAqICAgKyAgV2luZG93cyBwbGF0Zm9ybSB2ZXJzaW9uIGBgMS4wLjBgYCBvciBsYXRlci5cbiAqICAgXG4gKiAgSWYgdGhlIHRhc2sgZGVmaW5pdGlvbiBpcyB1c2VkIGluIGEgYmx1ZS9ncmVlbiBkZXBsb3ltZW50IHRoYXQgdXNlcyBbQVdTOjpDb2RlRGVwbG95OjpEZXBsb3ltZW50R3JvdXAgQmx1ZUdyZWVuRGVwbG95bWVudENvbmZpZ3VyYXRpb25dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1wcm9wZXJ0aWVzLWNvZGVkZXBsb3ktZGVwbG95bWVudGdyb3VwLWJsdWVncmVlbmRlcGxveW1lbnRjb25maWd1cmF0aW9uLmh0bWwpLCB0aGUgYGBkZXBlbmRzT25gYCBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZC5cbiAqL1xuRGVwZW5kc09uPzogQ29udGFpbmVyRGVwZW5kZW5jeVtdXG4vKipcbiAqIEEga2V5L3ZhbHVlIG1hcCBvZiBsYWJlbHMgdG8gYWRkIHRvIHRoZSBjb250YWluZXIuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBMYWJlbHNgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS1sYWJlbGBgIG9wdGlvbiB0byBkb2NrZXIgcnVuLiBUaGlzIHBhcmFtZXRlciByZXF1aXJlcyB2ZXJzaW9uIDEuMTggb2YgdGhlIERvY2tlciBSZW1vdGUgQVBJIG9yIGdyZWF0ZXIgb24geW91ciBjb250YWluZXIgaW5zdGFuY2UuIFRvIGNoZWNrIHRoZSBEb2NrZXIgUmVtb3RlIEFQSSB2ZXJzaW9uIG9uIHlvdXIgY29udGFpbmVyIGluc3RhbmNlLCBsb2cgaW4gdG8geW91ciBjb250YWluZXIgaW5zdGFuY2UgYW5kIHJ1biB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6IGBgc3VkbyBkb2NrZXIgdmVyc2lvbiAtLWZvcm1hdCAne3suU2VydmVyLkFQSVZlcnNpb259fSdgYFxuICovXG5Eb2NrZXJMYWJlbHM/OiB7XG4vKipcbiAqIFRoaXMgaW50ZXJmYWNlIHdhcyByZWZlcmVuY2VkIGJ5IGB1bmRlZmluZWRgJ3MgSlNPTi1TY2hlbWEgZGVmaW5pdGlvblxuICogdmlhIHRoZSBgcGF0dGVyblByb3BlcnR5YCBcIi57MSx9XCIuXG4gKi9cbltrOiBzdHJpbmddOiBzdHJpbmdcbn1cbi8qKlxuICogVGhlIGxpc3Qgb2YgcG9ydCBtYXBwaW5ncyBmb3IgdGhlIGNvbnRhaW5lci4gUG9ydCBtYXBwaW5ncyBhbGxvdyBjb250YWluZXJzIHRvIGFjY2VzcyBwb3J0cyBvbiB0aGUgaG9zdCBjb250YWluZXIgaW5zdGFuY2UgdG8gc2VuZCBvciByZWNlaXZlIHRyYWZmaWMuXG4gKiAgRm9yIHRhc2sgZGVmaW5pdGlvbnMgdGhhdCB1c2UgdGhlIGBgYXdzdnBjYGAgbmV0d29yayBtb2RlLCB5b3Ugc2hvdWxkIG9ubHkgc3BlY2lmeSB0aGUgYGBjb250YWluZXJQb3J0YGAuIFRoZSBgYGhvc3RQb3J0YGAgY2FuIGJlIGxlZnQgYmxhbmsgb3IgaXQgbXVzdCBiZSB0aGUgc2FtZSB2YWx1ZSBhcyB0aGUgYGBjb250YWluZXJQb3J0YGAuXG4gKiAgUG9ydCBtYXBwaW5ncyBvbiBXaW5kb3dzIHVzZSB0aGUgYGBOZXROQVRgYCBnYXRld2F5IGFkZHJlc3MgcmF0aGVyIHRoYW4gYGBsb2NhbGhvc3RgYC4gVGhlcmUgaXMgbm8gbG9vcGJhY2sgZm9yIHBvcnQgbWFwcGluZ3Mgb24gV2luZG93cywgc28geW91IGNhbm5vdCBhY2Nlc3MgYSBjb250YWluZXIncyBtYXBwZWQgcG9ydCBmcm9tIHRoZSBob3N0IGl0c2VsZi4gXG4gKiAgVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYFBvcnRCaW5kaW5nc2BgIGluIHRoZSBbQ3JlYXRlIGEgY29udGFpbmVyXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaHR0cHM6Ly9kb2NzLmRvY2tlci5jb20vZW5naW5lL2FwaS92MS4zNS8jb3BlcmF0aW9uL0NvbnRhaW5lckNyZWF0ZSkgc2VjdGlvbiBvZiB0aGUgW0RvY2tlciBSZW1vdGUgQVBJXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaHR0cHM6Ly9kb2NzLmRvY2tlci5jb20vZW5naW5lL2FwaS92MS4zNS8pIGFuZCB0aGUgYGAtLXB1Ymxpc2hgYCBvcHRpb24gdG8gW2RvY2tlciBydW5dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9odHRwczovL2RvY3MuZG9ja2VyLmNvbS9lbmdpbmUvcmVmZXJlbmNlL3J1bi8pLiBJZiB0aGUgbmV0d29yayBtb2RlIG9mIGEgdGFzayBkZWZpbml0aW9uIGlzIHNldCB0byBgYG5vbmVgYCwgdGhlbiB5b3UgY2FuJ3Qgc3BlY2lmeSBwb3J0IG1hcHBpbmdzLiBJZiB0aGUgbmV0d29yayBtb2RlIG9mIGEgdGFzayBkZWZpbml0aW9uIGlzIHNldCB0byBgYGhvc3RgYCwgdGhlbiBob3N0IHBvcnRzIG11c3QgZWl0aGVyIGJlIHVuZGVmaW5lZCBvciB0aGV5IG11c3QgbWF0Y2ggdGhlIGNvbnRhaW5lciBwb3J0IGluIHRoZSBwb3J0IG1hcHBpbmcuXG4gKiAgIEFmdGVyIGEgdGFzayByZWFjaGVzIHRoZSBgYFJVTk5JTkdgYCBzdGF0dXMsIG1hbnVhbCBhbmQgYXV0b21hdGljIGhvc3QgYW5kIGNvbnRhaW5lciBwb3J0IGFzc2lnbm1lbnRzIGFyZSB2aXNpYmxlIGluIHRoZSAqTmV0d29yayBCaW5kaW5ncyogc2VjdGlvbiBvZiBhIGNvbnRhaW5lciBkZXNjcmlwdGlvbiBmb3IgYSBzZWxlY3RlZCB0YXNrIGluIHRoZSBBbWF6b24gRUNTIGNvbnNvbGUuIFRoZSBhc3NpZ25tZW50cyBhcmUgYWxzbyB2aXNpYmxlIGluIHRoZSBgYG5ldHdvcmtCaW5kaW5nc2BgIHNlY3Rpb24gW0Rlc2NyaWJlVGFza3NdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVUYXNrcy5odG1sKSByZXNwb25zZXMuXG4gKi9cblBvcnRNYXBwaW5ncz86IFBvcnRNYXBwaW5nW11cbi8qKlxuICogVGhlIGNvbW1hbmQgdGhhdCdzIHBhc3NlZCB0byB0aGUgY29udGFpbmVyLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgQ21kYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYENPTU1BTkRgYCBwYXJhbWV0ZXIgdG8gZG9ja2VyIHJ1bi4gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGFyZ3VtZW50cywgZWFjaCBhcmd1bWVudCBpcyBhIHNlcGFyYXRlZCBzdHJpbmcgaW4gdGhlIGFycmF5LlxuICovXG5Db21tYW5kPzogc3RyaW5nW11cbi8qKlxuICogVGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBwYXNzIHRvIGEgY29udGFpbmVyLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgRW52YGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYC0tZW52YGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKiAgIFdlIGRvbid0IHJlY29tbWVuZCB0aGF0IHlvdSB1c2UgcGxhaW50ZXh0IGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3Igc2Vuc2l0aXZlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGNyZWRlbnRpYWwgZGF0YS5cbiAqL1xuRW52aXJvbm1lbnQ/OiBLZXlWYWx1ZVBhaXJbXVxuLyoqXG4gKiBUaGUgYGBsaW5rc2BgIHBhcmFtZXRlciBhbGxvd3MgY29udGFpbmVycyB0byBjb21tdW5pY2F0ZSB3aXRoIGVhY2ggb3RoZXIgd2l0aG91dCB0aGUgbmVlZCBmb3IgcG9ydCBtYXBwaW5ncy4gVGhpcyBwYXJhbWV0ZXIgaXMgb25seSBzdXBwb3J0ZWQgaWYgdGhlIG5ldHdvcmsgbW9kZSBvZiBhIHRhc2sgZGVmaW5pdGlvbiBpcyBgYGJyaWRnZWBgLiBUaGUgYGBuYW1lOmludGVybmFsTmFtZWBgIGNvbnN0cnVjdCBpcyBhbmFsb2dvdXMgdG8gYGBuYW1lOmFsaWFzYGAgaW4gRG9ja2VyIGxpbmtzLiBVcCB0byAyNTUgbGV0dGVycyAodXBwZXJjYXNlIGFuZCBsb3dlcmNhc2UpLCBudW1iZXJzLCB1bmRlcnNjb3JlcywgYW5kIGh5cGhlbnMgYXJlIGFsbG93ZWQuLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgTGlua3NgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS1saW5rYGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKiAgIFRoaXMgcGFyYW1ldGVyIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIFdpbmRvd3MgY29udGFpbmVycy5cbiAqICAgIENvbnRhaW5lcnMgdGhhdCBhcmUgY29sbG9jYXRlZCBvbiBhIHNpbmdsZSBjb250YWluZXIgaW5zdGFuY2UgbWF5IGJlIGFibGUgdG8gY29tbXVuaWNhdGUgd2l0aCBlYWNoIG90aGVyIHdpdGhvdXQgcmVxdWlyaW5nIGxpbmtzIG9yIGhvc3QgcG9ydCBtYXBwaW5ncy4gTmV0d29yayBpc29sYXRpb24gaXMgYWNoaWV2ZWQgb24gdGhlIGNvbnRhaW5lciBpbnN0YW5jZSB1c2luZyBzZWN1cml0eSBncm91cHMgYW5kIFZQQyBzZXR0aW5ncy5cbiAqL1xuTGlua3M/OiBzdHJpbmdbXVxufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzZWNyZXQgdG8gZXhwb3NlIHRvIHlvdXIgY29udGFpbmVyLiBTZWNyZXRzIGNhbiBiZSBleHBvc2VkIHRvIGEgY29udGFpbmVyIGluIHRoZSBmb2xsb3dpbmcgd2F5czpcbiAqICAgKyAgVG8gaW5qZWN0IHNlbnNpdGl2ZSBkYXRhIGludG8geW91ciBjb250YWluZXJzIGFzIGVudmlyb25tZW50IHZhcmlhYmxlcywgdXNlIHRoZSBgYHNlY3JldHNgYCBjb250YWluZXIgZGVmaW5pdGlvbiBwYXJhbWV0ZXIuXG4gKiAgICsgIFRvIHJlZmVyZW5jZSBzZW5zaXRpdmUgaW5mb3JtYXRpb24gaW4gdGhlIGxvZyBjb25maWd1cmF0aW9uIG9mIGEgY29udGFpbmVyLCB1c2UgdGhlIGBgc2VjcmV0T3B0aW9uc2BgIGNvbnRhaW5lciBkZWZpbml0aW9uIHBhcmFtZXRlci5cbiAqICAgXG4gKiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbU3BlY2lmeWluZyBzZW5zaXRpdmUgZGF0YV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvc3BlY2lmeWluZy1zZW5zaXRpdmUtZGF0YS5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VjcmV0IHtcbi8qKlxuICogVGhlIHNlY3JldCB0byBleHBvc2UgdG8gdGhlIGNvbnRhaW5lci4gVGhlIHN1cHBvcnRlZCB2YWx1ZXMgYXJlIGVpdGhlciB0aGUgZnVsbCBBUk4gb2YgdGhlIEFTTWxvbmcgc2VjcmV0IG9yIHRoZSBmdWxsIEFSTiBvZiB0aGUgcGFyYW1ldGVyIGluIHRoZSBTU00gUGFyYW1ldGVyIFN0b3JlLlxuICogIEZvciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVxdWlyZSBJQU1sb25nIHBlcm1pc3Npb25zLCBzZWUgW1JlcXVpcmVkIElBTSBwZXJtaXNzaW9ucyBmb3IgQW1hem9uIEVDUyBzZWNyZXRzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9zcGVjaWZ5aW5nLXNlbnNpdGl2ZS1kYXRhLXNlY3JldHMuaHRtbCNzZWNyZXRzLWlhbSkgKGZvciBTZWNyZXRzIE1hbmFnZXIpIG9yIFtSZXF1aXJlZCBJQU0gcGVybWlzc2lvbnMgZm9yIEFtYXpvbiBFQ1Mgc2VjcmV0c10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvc3BlY2lmeWluZy1zZW5zaXRpdmUtZGF0YS1wYXJhbWV0ZXJzLmh0bWwpIChmb3IgU3lzdGVtcyBNYW5hZ2VyIFBhcmFtZXRlciBzdG9yZSkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICogICBJZiB0aGUgU1NNIFBhcmFtZXRlciBTdG9yZSBwYXJhbWV0ZXIgZXhpc3RzIGluIHRoZSBzYW1lIFJlZ2lvbiBhcyB0aGUgdGFzayB5b3UncmUgbGF1bmNoaW5nLCB0aGVuIHlvdSBjYW4gdXNlIGVpdGhlciB0aGUgZnVsbCBBUk4gb3IgbmFtZSBvZiB0aGUgcGFyYW1ldGVyLiBJZiB0aGUgcGFyYW1ldGVyIGV4aXN0cyBpbiBhIGRpZmZlcmVudCBSZWdpb24sIHRoZW4gdGhlIGZ1bGwgQVJOIG11c3QgYmUgc3BlY2lmaWVkLlxuICovXG5WYWx1ZUZyb206IHN0cmluZ1xuLyoqXG4gKiBUaGUgbmFtZSBvZiB0aGUgc2VjcmV0LlxuICovXG5OYW1lOiBzdHJpbmdcbn1cbi8qKlxuICogVGhlIGNvbnRhaW5lciBoZWFsdGggY2hlY2sgY29tbWFuZCBhbmQgYXNzb2NpYXRlZCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgZm9yIHRoZSBjb250YWluZXIuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBIZWFsdGhDaGVja2BgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kIGFuZCB0aGUgYGBIRUFMVEhDSEVDS2BgIHBhcmFtZXRlciBvZiBkb2NrZXIgcnVuLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhlYWx0aENoZWNrIHtcbi8qKlxuICogQSBzdHJpbmcgYXJyYXkgcmVwcmVzZW50aW5nIHRoZSBjb21tYW5kIHRoYXQgdGhlIGNvbnRhaW5lciBydW5zIHRvIGRldGVybWluZSBpZiBpdCBpcyBoZWFsdGh5LiBUaGUgc3RyaW5nIGFycmF5IG11c3Qgc3RhcnQgd2l0aCBgYENNRGBgIHRvIHJ1biB0aGUgY29tbWFuZCBhcmd1bWVudHMgZGlyZWN0bHksIG9yIGBgQ01ELVNIRUxMYGAgdG8gcnVuIHRoZSBjb21tYW5kIHdpdGggdGhlIGNvbnRhaW5lcidzIGRlZmF1bHQgc2hlbGwuIFxuICogICBXaGVuIHlvdSB1c2UgdGhlIEFXUyBNYW5hZ2VtZW50IENvbnNvbGUgSlNPTiBwYW5lbCwgdGhlIENMSWxvbmcsIG9yIHRoZSBBUElzLCBlbmNsb3NlIHRoZSBsaXN0IG9mIGNvbW1hbmRzIGluIGRvdWJsZSBxdW90ZXMgYW5kIGJyYWNrZXRzLlxuICogICBgYFsgXCJDTUQtU0hFTExcIiwgXCJjdXJsIC1mIGh0dHA6Ly9sb2NhbGhvc3QvIHx8IGV4aXQgMVwiIF1gYCBcbiAqICBZb3UgZG9uJ3QgaW5jbHVkZSB0aGUgZG91YmxlIHF1b3RlcyBhbmQgYnJhY2tldHMgd2hlbiB5b3UgdXNlIHRoZSBBV1MgTWFuYWdlbWVudCBDb25zb2xlLlxuICogICBgYENNRC1TSEVMTCwgY3VybCAtZiBodHRwOi8vbG9jYWxob3N0LyB8fCBleGl0IDFgYCBcbiAqICBBbiBleGl0IGNvZGUgb2YgMCBpbmRpY2F0ZXMgc3VjY2VzcywgYW5kIG5vbi16ZXJvIGV4aXQgY29kZSBpbmRpY2F0ZXMgZmFpbHVyZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBgYEhlYWx0aENoZWNrYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQuXG4gKi9cbkNvbW1hbmQ/OiBzdHJpbmdbXVxuLyoqXG4gKiBUaGUgdGltZSBwZXJpb2QgaW4gc2Vjb25kcyB0byB3YWl0IGZvciBhIGhlYWx0aCBjaGVjayB0byBzdWNjZWVkIGJlZm9yZSBpdCBpcyBjb25zaWRlcmVkIGEgZmFpbHVyZS4gWW91IG1heSBzcGVjaWZ5IGJldHdlZW4gMiBhbmQgNjAgc2Vjb25kcy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgNS4gVGhpcyB2YWx1ZSBhcHBsaWVzIG9ubHkgd2hlbiB5b3Ugc3BlY2lmeSBhIGBgY29tbWFuZGBgLlxuICovXG5UaW1lb3V0PzogbnVtYmVyXG4vKipcbiAqIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gcmV0cnkgYSBmYWlsZWQgaGVhbHRoIGNoZWNrIGJlZm9yZSB0aGUgY29udGFpbmVyIGlzIGNvbnNpZGVyZWQgdW5oZWFsdGh5LiBZb3UgbWF5IHNwZWNpZnkgYmV0d2VlbiAxIGFuZCAxMCByZXRyaWVzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAzLiBUaGlzIHZhbHVlIGFwcGxpZXMgb25seSB3aGVuIHlvdSBzcGVjaWZ5IGEgYGBjb21tYW5kYGAuXG4gKi9cblJldHJpZXM/OiBudW1iZXJcbi8qKlxuICogVGhlIHRpbWUgcGVyaW9kIGluIHNlY29uZHMgYmV0d2VlbiBlYWNoIGhlYWx0aCBjaGVjayBleGVjdXRpb24uIFlvdSBtYXkgc3BlY2lmeSBiZXR3ZWVuIDUgYW5kIDMwMCBzZWNvbmRzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAzMCBzZWNvbmRzLiBUaGlzIHZhbHVlIGFwcGxpZXMgb25seSB3aGVuIHlvdSBzcGVjaWZ5IGEgYGBjb21tYW5kYGAuXG4gKi9cbkludGVydmFsPzogbnVtYmVyXG4vKipcbiAqIFRoZSBvcHRpb25hbCBncmFjZSBwZXJpb2QgdG8gcHJvdmlkZSBjb250YWluZXJzIHRpbWUgdG8gYm9vdHN0cmFwIGJlZm9yZSBmYWlsZWQgaGVhbHRoIGNoZWNrcyBjb3VudCB0b3dhcmRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiByZXRyaWVzLiBZb3UgY2FuIHNwZWNpZnkgYmV0d2VlbiAwIGFuZCAzMDAgc2Vjb25kcy4gQnkgZGVmYXVsdCwgdGhlIGBgc3RhcnRQZXJpb2RgYCBpcyBvZmYuIFRoaXMgdmFsdWUgYXBwbGllcyBvbmx5IHdoZW4geW91IHNwZWNpZnkgYSBgYGNvbW1hbmRgYC4gXG4gKiAgIElmIGEgaGVhbHRoIGNoZWNrIHN1Y2NlZWRzIHdpdGhpbiB0aGUgYGBzdGFydFBlcmlvZGBgLCB0aGVuIHRoZSBjb250YWluZXIgaXMgY29uc2lkZXJlZCBoZWFsdGh5IGFuZCBhbnkgc3Vic2VxdWVudCBmYWlsdXJlcyBjb3VudCB0b3dhcmQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJldHJpZXMuXG4gKi9cblN0YXJ0UGVyaW9kPzogbnVtYmVyXG59XG4vKipcbiAqIERldGFpbHMgb24gYSBkYXRhIHZvbHVtZSBmcm9tIGFub3RoZXIgY29udGFpbmVyIGluIHRoZSBzYW1lIHRhc2sgZGVmaW5pdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWb2x1bWVGcm9tIHtcbi8qKlxuICogSWYgdGhpcyB2YWx1ZSBpcyBgYHRydWVgYCwgdGhlIGNvbnRhaW5lciBoYXMgcmVhZC1vbmx5IGFjY2VzcyB0byB0aGUgdm9sdW1lLiBJZiB0aGlzIHZhbHVlIGlzIGBgZmFsc2VgYCwgdGhlbiB0aGUgY29udGFpbmVyIGNhbiB3cml0ZSB0byB0aGUgdm9sdW1lLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgYGZhbHNlYGAuXG4gKi9cblJlYWRPbmx5PzogYm9vbGVhblxuLyoqXG4gKiBUaGUgbmFtZSBvZiBhbm90aGVyIGNvbnRhaW5lciB3aXRoaW4gdGhlIHNhbWUgdGFzayBkZWZpbml0aW9uIHRvIG1vdW50IHZvbHVtZXMgZnJvbS5cbiAqL1xuU291cmNlQ29udGFpbmVyPzogc3RyaW5nXG59XG4vKipcbiAqIFRoZSBsb2cgY29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9uIGZvciB0aGUgY29udGFpbmVyLlxuICogIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBMb2dDb25maWdgYCBpbiB0aGUgZG9ja2VyIENyZWF0ZSBhIGNvbnRhaW5lciBjb21tYW5kIGFuZCB0aGUgYGAtLWxvZy1kcml2ZXJgYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi4gQnkgZGVmYXVsdCwgY29udGFpbmVycyB1c2UgdGhlIHNhbWUgbG9nZ2luZyBkcml2ZXIgdGhhdCB0aGUgRG9ja2VyIGRhZW1vbiB1c2VzLiBIb3dldmVyLCB0aGUgY29udGFpbmVyIG1heSB1c2UgYSBkaWZmZXJlbnQgbG9nZ2luZyBkcml2ZXIgdGhhbiB0aGUgRG9ja2VyIGRhZW1vbiBieSBzcGVjaWZ5aW5nIGEgbG9nIGRyaXZlciB3aXRoIHRoaXMgcGFyYW1ldGVyIGluIHRoZSBjb250YWluZXIgZGVmaW5pdGlvbi4gVG8gdXNlIGEgZGlmZmVyZW50IGxvZ2dpbmcgZHJpdmVyIGZvciBhIGNvbnRhaW5lciwgdGhlIGxvZyBzeXN0ZW0gbXVzdCBiZSBjb25maWd1cmVkIHByb3Blcmx5IG9uIHRoZSBjb250YWluZXIgaW5zdGFuY2UgKG9yIG9uIGEgZGlmZmVyZW50IGxvZyBzZXJ2ZXIgZm9yIHJlbW90ZSBsb2dnaW5nIG9wdGlvbnMpLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgb3B0aW9ucyBmb3IgZGlmZmVyZW50IHN1cHBvcnRlZCBsb2cgZHJpdmVycywgc2VlIFtDb25maWd1cmUgbG9nZ2luZyBkcml2ZXJzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaHR0cHM6Ly9kb2NzLmRvY2tlci5jb20vZW5naW5lL2FkbWluL2xvZ2dpbmcvb3ZlcnZpZXcvKSBpbiB0aGUgRG9ja2VyIGRvY3VtZW50YXRpb24uXG4gKiAgIEFtYXpvbiBFQ1MgY3VycmVudGx5IHN1cHBvcnRzIGEgc3Vic2V0IG9mIHRoZSBsb2dnaW5nIGRyaXZlcnMgYXZhaWxhYmxlIHRvIHRoZSBEb2NrZXIgZGFlbW9uIChzaG93biBpbiB0aGUgW0xvZ0NvbmZpZ3VyYXRpb25dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTG9nQ29uZmlndXJhdGlvbi5odG1sKSBkYXRhIHR5cGUpLiBBZGRpdGlvbmFsIGxvZyBkcml2ZXJzIG1heSBiZSBhdmFpbGFibGUgaW4gZnV0dXJlIHJlbGVhc2VzIG9mIHRoZSBBbWF6b24gRUNTIGNvbnRhaW5lciBhZ2VudC5cbiAqICAgVGhpcyBwYXJhbWV0ZXIgcmVxdWlyZXMgdmVyc2lvbiAxLjE4IG9mIHRoZSBEb2NrZXIgUmVtb3RlIEFQSSBvciBncmVhdGVyIG9uIHlvdXIgY29udGFpbmVyIGluc3RhbmNlLiBUbyBjaGVjayB0aGUgRG9ja2VyIFJlbW90ZSBBUEkgdmVyc2lvbiBvbiB5b3VyIGNvbnRhaW5lciBpbnN0YW5jZSwgbG9nIGluIHRvIHlvdXIgY29udGFpbmVyIGluc3RhbmNlIGFuZCBydW4gdGhlIGZvbGxvd2luZyBjb21tYW5kOiBgYHN1ZG8gZG9ja2VyIHZlcnNpb24gLS1mb3JtYXQgJ3t7LlNlcnZlci5BUElWZXJzaW9ufX0nYGBcbiAqICAgVGhlIEFtYXpvbiBFQ1MgY29udGFpbmVyIGFnZW50IHJ1bm5pbmcgb24gYSBjb250YWluZXIgaW5zdGFuY2UgbXVzdCByZWdpc3RlciB0aGUgbG9nZ2luZyBkcml2ZXJzIGF2YWlsYWJsZSBvbiB0aGF0IGluc3RhbmNlIHdpdGggdGhlIGBgRUNTX0FWQUlMQUJMRV9MT0dHSU5HX0RSSVZFUlNgYCBlbnZpcm9ubWVudCB2YXJpYWJsZSBiZWZvcmUgY29udGFpbmVycyBwbGFjZWQgb24gdGhhdCBpbnN0YW5jZSBjYW4gdXNlIHRoZXNlIGxvZyBjb25maWd1cmF0aW9uIG9wdGlvbnMuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0NvbnRhaW5lciBBZ2VudCBDb25maWd1cmF0aW9uXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9lY3MtYWdlbnQtY29uZmlnLmh0bWwpIGluIHRoZSAqRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2dDb25maWd1cmF0aW9uIHtcbi8qKlxuICogVGhlIHNlY3JldHMgdG8gcGFzcyB0byB0aGUgbG9nIGNvbmZpZ3VyYXRpb24uIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1NwZWNpZnlpbmcgc2Vuc2l0aXZlIGRhdGFdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3NwZWNpZnlpbmctc2Vuc2l0aXZlLWRhdGEuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5TZWNyZXRPcHRpb25zPzogU2VjcmV0W11cbi8qKlxuICogVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byBzZW5kIHRvIHRoZSBsb2cgZHJpdmVyLlxuICogIFRoZSBvcHRpb25zIHlvdSBjYW4gc3BlY2lmeSBkZXBlbmQgb24gdGhlIGxvZyBkcml2ZXIuIFNvbWUgb2YgdGhlIG9wdGlvbnMgeW91IGNhbiBzcGVjaWZ5IHdoZW4geW91IHVzZSB0aGUgYGBhd3Nsb2dzYGAgbG9nIGRyaXZlciB0byByb3V0ZSBsb2dzIHRvIEFtYXpvbiBDbG91ZFdhdGNoIGluY2x1ZGUgdGhlIGZvbGxvd2luZzpcbiAqICAgKyBhd3Nsb2dzLWNyZWF0ZS1ncm91cCBSZXF1aXJlZDogTm8gU3BlY2lmeSB3aGV0aGVyIHlvdSB3YW50IHRoZSBsb2cgZ3JvdXAgdG8gYmUgY3JlYXRlZCBhdXRvbWF0aWNhbGx5LiBJZiB0aGlzIG9wdGlvbiBpc24ndCBzcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvIGZhbHNlLiBZb3VyIElBTSBwb2xpY3kgbXVzdCBpbmNsdWRlIHRoZSBsb2dzOkNyZWF0ZUxvZ0dyb3VwIHBlcm1pc3Npb24gYmVmb3JlIHlvdSBhdHRlbXB0IHRvIHVzZSBhd3Nsb2dzLWNyZWF0ZS1ncm91cC4gKyBhd3Nsb2dzLXJlZ2lvbiBSZXF1aXJlZDogWWVzIFNwZWNpZnkgdGhlIFJlZ2lvbiB0aGF0IHRoZSBhd3Nsb2dzIGxvZyBkcml2ZXIgaXMgdG8gc2VuZCB5b3VyIERvY2tlciBsb2dzIHRvLiBZb3UgY2FuIGNob29zZSB0byBzZW5kIGFsbCBvZiB5b3VyIGxvZ3MgZnJvbSBjbHVzdGVycyBpbiBkaWZmZXJlbnQgUmVnaW9ucyB0byBhIHNpbmdsZSByZWdpb24gaW4gQ2xvdWRXYXRjaCBMb2dzLiBUaGlzIGlzIHNvIHRoYXQgdGhleSdyZSBhbGwgdmlzaWJsZSBpbiBvbmUgbG9jYXRpb24uIE90aGVyd2lzZSwgeW91IGNhbiBzZXBhcmF0ZSB0aGVtIGJ5IFJlZ2lvbiBmb3IgbW9yZSBncmFudWxhcml0eS4gTWFrZSBzdXJlIHRoYXQgdGhlIHNwZWNpZmllZCBsb2cgZ3JvdXAgZXhpc3RzIGluIHRoZSBSZWdpb24gdGhhdCB5b3Ugc3BlY2lmeSB3aXRoIHRoaXMgb3B0aW9uLiArIGF3c2xvZ3MtZ3JvdXAgUmVxdWlyZWQ6IFllcyBNYWtlIHN1cmUgdG8gc3BlY2lmeSBhIGxvZyBncm91cCB0aGF0IHRoZSBhd3Nsb2dzIGxvZyBkcml2ZXIgc2VuZHMgaXRzIGxvZyBzdHJlYW1zIHRvLiArIGF3c2xvZ3Mtc3RyZWFtLXByZWZpeCBSZXF1aXJlZDogWWVzLCB3aGVuIHVzaW5nIEZhcmdhdGUuT3B0aW9uYWwgd2hlbiB1c2luZyBFQzIuIFVzZSB0aGUgYXdzbG9ncy1zdHJlYW0tcHJlZml4IG9wdGlvbiB0byBhc3NvY2lhdGUgYSBsb2cgc3RyZWFtIHdpdGggdGhlIHNwZWNpZmllZCBwcmVmaXgsIHRoZSBjb250YWluZXIgbmFtZSwgYW5kIHRoZSBJRCBvZiB0aGUgQW1hem9uIEVDUyB0YXNrIHRoYXQgdGhlIGNvbnRhaW5lciBiZWxvbmdzIHRvLiBJZiB5b3Ugc3BlY2lmeSBhIHByZWZpeCB3aXRoIHRoaXMgb3B0aW9uLCB0aGVuIHRoZSBsb2cgc3RyZWFtIHRha2VzIHRoZSBmb3JtYXQgcHJlZml4LW5hbWUvY29udGFpbmVyLW5hbWUvZWNzLXRhc2staWQuIElmIHlvdSBkb24ndCBzcGVjaWZ5IGEgcHJlZml4IHdpdGggdGhpcyBvcHRpb24sIHRoZW4gdGhlIGxvZyBzdHJlYW0gaXMgbmFtZWQgYWZ0ZXIgdGhlIGNvbnRhaW5lciBJRCB0aGF0J3MgYXNzaWduZWQgYnkgdGhlIERvY2tlciBkYWVtb24gb24gdGhlIGNvbnRhaW5lciBpbnN0YW5jZS4gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byB0cmFjZSBsb2dzIGJhY2sgdG8gdGhlIGNvbnRhaW5lciB0aGF0IHNlbnQgdGhlbSB3aXRoIGp1c3QgdGhlIERvY2tlciBjb250YWluZXIgSUQgKHdoaWNoIGlzIG9ubHkgYXZhaWxhYmxlIG9uIHRoZSBjb250YWluZXIgaW5zdGFuY2UpLCB3ZSByZWNvbW1lbmQgdGhhdCB5b3Ugc3BlY2lmeSBhIHByZWZpeCB3aXRoIHRoaXMgb3B0aW9uLiBGb3IgQW1hem9uIEVDUyBzZXJ2aWNlcywgeW91IGNhbiB1c2UgdGhlIHNlcnZpY2UgbmFtZSBhcyB0aGUgcHJlZml4LiBEb2luZyBzbywgeW91IGNhbiB0cmFjZSBsb2cgc3RyZWFtcyB0byB0aGUgc2VydmljZSB0aGF0IHRoZSBjb250YWluZXIgYmVsb25ncyB0bywgdGhlIG5hbWUgb2YgdGhlIGNvbnRhaW5lciB0aGF0IHNlbnQgdGhlbSwgYW5kIHRoZSBJRCBvZiB0aGUgdGFzayB0aGF0IHRoZSBjb250YWluZXIgYmVsb25ncyB0by4gWW91IG11c3Qgc3BlY2lmeSBhIHN0cmVhbS1wcmVmaXggZm9yIHlvdXIgbG9ncyB0byBoYXZlIHlvdXIgbG9ncyBhcHBlYXIgaW4gdGhlIExvZyBwYW5lIHdoZW4gdXNpbmcgdGhlIEFtYXpvbiBFQ1MgY29uc29sZS4gKyBhd3Nsb2dzLWRhdGV0aW1lLWZvcm1hdCBSZXF1aXJlZDogTm8gVGhpcyBvcHRpb24gZGVmaW5lcyBhIG11bHRpbGluZSBzdGFydCBwYXR0ZXJuIGluIFB5dGhvbiBzdHJmdGltZSBmb3JtYXQuIEEgbG9nIG1lc3NhZ2UgY29uc2lzdHMgb2YgYSBsaW5lIHRoYXQgbWF0Y2hlcyB0aGUgcGF0dGVybiBhbmQgYW55IGZvbGxvd2luZyBsaW5lcyB0aGF0IGRvbuKAmXQgbWF0Y2ggdGhlIHBhdHRlcm4uIFRoZSBtYXRjaGVkIGxpbmUgaXMgdGhlIGRlbGltaXRlciBiZXR3ZWVuIGxvZyBtZXNzYWdlcy4gT25lIGV4YW1wbGUgb2YgYSB1c2UgY2FzZSBmb3IgdXNpbmcgdGhpcyBmb3JtYXQgaXMgZm9yIHBhcnNpbmcgb3V0cHV0IHN1Y2ggYXMgYSBzdGFjayBkdW1wLCB3aGljaCBtaWdodCBvdGhlcndpc2UgYmUgbG9nZ2VkIGluIG11bHRpcGxlIGVudHJpZXMuIFRoZSBjb3JyZWN0IHBhdHRlcm4gYWxsb3dzIGl0IHRvIGJlIGNhcHR1cmVkIGluIGEgc2luZ2xlIGVudHJ5LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGF3c2xvZ3MtZGF0ZXRpbWUtZm9ybWF0LiBZb3UgY2Fubm90IGNvbmZpZ3VyZSBib3RoIHRoZSBhd3Nsb2dzLWRhdGV0aW1lLWZvcm1hdCBhbmQgYXdzbG9ncy1tdWx0aWxpbmUtcGF0dGVybiBvcHRpb25zLiBNdWx0aWxpbmUgbG9nZ2luZyBwZXJmb3JtcyByZWd1bGFyIGV4cHJlc3Npb24gcGFyc2luZyBhbmQgbWF0Y2hpbmcgb2YgYWxsIGxvZyBtZXNzYWdlcy4gVGhpcyBtaWdodCBoYXZlIGEgbmVnYXRpdmUgaW1wYWN0IG9uIGxvZ2dpbmcgcGVyZm9ybWFuY2UuICsgYXdzbG9ncy1tdWx0aWxpbmUtcGF0dGVybiBSZXF1aXJlZDogTm8gVGhpcyBvcHRpb24gZGVmaW5lcyBhIG11bHRpbGluZSBzdGFydCBwYXR0ZXJuIHRoYXQgdXNlcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4gQSBsb2cgbWVzc2FnZSBjb25zaXN0cyBvZiBhIGxpbmUgdGhhdCBtYXRjaGVzIHRoZSBwYXR0ZXJuIGFuZCBhbnkgZm9sbG93aW5nIGxpbmVzIHRoYXQgZG9u4oCZdCBtYXRjaCB0aGUgcGF0dGVybi4gVGhlIG1hdGNoZWQgbGluZSBpcyB0aGUgZGVsaW1pdGVyIGJldHdlZW4gbG9nIG1lc3NhZ2VzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGF3c2xvZ3MtbXVsdGlsaW5lLXBhdHRlcm4uIFRoaXMgb3B0aW9uIGlzIGlnbm9yZWQgaWYgYXdzbG9ncy1kYXRldGltZS1mb3JtYXQgaXMgYWxzbyBjb25maWd1cmVkLiBZb3UgY2Fubm90IGNvbmZpZ3VyZSBib3RoIHRoZSBhd3Nsb2dzLWRhdGV0aW1lLWZvcm1hdCBhbmQgYXdzbG9ncy1tdWx0aWxpbmUtcGF0dGVybiBvcHRpb25zLiBNdWx0aWxpbmUgbG9nZ2luZyBwZXJmb3JtcyByZWd1bGFyIGV4cHJlc3Npb24gcGFyc2luZyBhbmQgbWF0Y2hpbmcgb2YgYWxsIGxvZyBtZXNzYWdlcy4gVGhpcyBtaWdodCBoYXZlIGEgbmVnYXRpdmUgaW1wYWN0IG9uIGxvZ2dpbmcgcGVyZm9ybWFuY2UuIFxuICogIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcHBseSB0byBhbGwgc3VwcG9ydGVkIGxvZyBkcml2ZXJzLlxuICogICArIG1vZGUgUmVxdWlyZWQ6IE5vIFZhbGlkIHZhbHVlczogbm9uLWJsb2NraW5nIHwgYmxvY2tpbmcgVGhpcyBvcHRpb24gZGVmaW5lcyB0aGUgZGVsaXZlcnkgbW9kZSBvZiBsb2cgbWVzc2FnZXMgZnJvbSB0aGUgY29udGFpbmVyIHRvIHRoZSBsb2cgZHJpdmVyIHNwZWNpZmllZCB1c2luZyBsb2dEcml2ZXIuIFRoZSBkZWxpdmVyeSBtb2RlIHlvdSBjaG9vc2UgYWZmZWN0cyBhcHBsaWNhdGlvbiBhdmFpbGFiaWxpdHkgd2hlbiB0aGUgZmxvdyBvZiBsb2dzIGZyb20gY29udGFpbmVyIGlzIGludGVycnVwdGVkLiBJZiB5b3UgdXNlIHRoZSBibG9ja2luZyBtb2RlIGFuZCB0aGUgZmxvdyBvZiBsb2dzIGlzIGludGVycnVwdGVkLCBjYWxscyBmcm9tIGNvbnRhaW5lciBjb2RlIHRvIHdyaXRlIHRvIHRoZSBzdGRvdXQgYW5kIHN0ZGVyciBzdHJlYW1zIHdpbGwgYmxvY2suIFRoZSBsb2dnaW5nIHRocmVhZCBvZiB0aGUgYXBwbGljYXRpb24gd2lsbCBibG9jayBhcyBhIHJlc3VsdC4gVGhpcyBtYXkgY2F1c2UgdGhlIGFwcGxpY2F0aW9uIHRvIGJlY29tZSB1bnJlc3BvbnNpdmUgYW5kIGxlYWQgdG8gY29udGFpbmVyIGhlYWx0aGNoZWNrIGZhaWx1cmUuIElmIHlvdSB1c2UgdGhlIG5vbi1ibG9ja2luZyBtb2RlLCB0aGUgY29udGFpbmVyJ3MgbG9ncyBhcmUgaW5zdGVhZCBzdG9yZWQgaW4gYW4gaW4tbWVtb3J5IGludGVybWVkaWF0ZSBidWZmZXIgY29uZmlndXJlZCB3aXRoIHRoZSBtYXgtYnVmZmVyLXNpemUgb3B0aW9uLiBUaGlzIHByZXZlbnRzIHRoZSBhcHBsaWNhdGlvbiBmcm9tIGJlY29taW5nIHVucmVzcG9uc2l2ZSB3aGVuIGxvZ3MgY2Fubm90IGJlIHNlbnQuIFdlIHJlY29tbWVuZCB1c2luZyB0aGlzIG1vZGUgaWYgeW91IHdhbnQgdG8gZW5zdXJlIHNlcnZpY2UgYXZhaWxhYmlsaXR5IGFuZCBhcmUgb2theSB3aXRoIHNvbWUgbG9nIGxvc3MuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgUHJldmVudGluZyBsb2cgbG9zcyB3aXRoIG5vbi1ibG9ja2luZyBtb2RlIGluIHRoZSBhd3Nsb2dzIGNvbnRhaW5lciBsb2cgZHJpdmVyLiBZb3UgY2FuIHNldCBhIGRlZmF1bHQgbW9kZSBmb3IgYWxsIGNvbnRhaW5lcnMgaW4gYSBzcGVjaWZpYyBSZWdpb24gYnkgdXNpbmcgdGhlIGRlZmF1bHRMb2dEcml2ZXJNb2RlIGFjY291bnQgc2V0dGluZy4gSWYgeW91IGRvbid0IHNwZWNpZnkgdGhlIG1vZGUgb3B0aW9uIG9yIGNvbmZpZ3VyZSB0aGUgYWNjb3VudCBzZXR0aW5nLCBBbWF6b24gRUNTIHdpbGwgZGVmYXVsdCB0byB0aGUgbm9uLWJsb2NraW5nIG1vZGUuIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBhY2NvdW50IHNldHRpbmcsIHNlZSBEZWZhdWx0IGxvZyBkcml2ZXIgbW9kZSBpbiB0aGUgQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlLiBPbiBKdW5lIDI1LCAyMDI1LCBBbWF6b24gRUNTIGNoYW5nZWQgdGhlIGRlZmF1bHQgbG9nIGRyaXZlciBtb2RlIGZyb20gYmxvY2tpbmcgdG8gbm9uLWJsb2NraW5nIHRvIHByaW9yaXRpemUgdGFzayBhdmFpbGFiaWxpdHkgb3ZlciBsb2dnaW5nLiBUbyBjb250aW51ZSB1c2luZyB0aGUgYmxvY2tpbmcgbW9kZSBhZnRlciB0aGlzIGNoYW5nZSwgZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6IFNldCB0aGUgbW9kZSBvcHRpb24gaW4geW91ciBjb250YWluZXIgZGVmaW5pdGlvbidzIGxvZ0NvbmZpZ3VyYXRpb24gYXMgYmxvY2tpbmcuIFNldCB0aGUgZGVmYXVsdExvZ0RyaXZlck1vZGUgYWNjb3VudCBzZXR0aW5nIHRvIGJsb2NraW5nLiArIG1heC1idWZmZXItc2l6ZSBSZXF1aXJlZDogTm8gRGVmYXVsdCB2YWx1ZTogMW0gV2hlbiBub24tYmxvY2tpbmcgbW9kZSBpcyB1c2VkLCB0aGUgbWF4LWJ1ZmZlci1zaXplIGxvZyBvcHRpb24gY29udHJvbHMgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciB0aGF0J3MgdXNlZCBmb3IgaW50ZXJtZWRpYXRlIG1lc3NhZ2Ugc3RvcmFnZS4gTWFrZSBzdXJlIHRvIHNwZWNpZnkgYW4gYWRlcXVhdGUgYnVmZmVyIHNpemUgYmFzZWQgb24geW91ciBhcHBsaWNhdGlvbi4gV2hlbiB0aGUgYnVmZmVyIGZpbGxzIHVwLCBmdXJ0aGVyIGxvZ3MgY2Fubm90IGJlIHN0b3JlZC4gTG9ncyB0aGF0IGNhbm5vdCBiZSBzdG9yZWQgYXJlIGxvc3QuIFxuICogIFRvIHJvdXRlIGxvZ3MgdXNpbmcgdGhlIGBgc3BsdW5rYGAgbG9nIHJvdXRlciwgeW91IG5lZWQgdG8gc3BlY2lmeSBhIGBgc3BsdW5rLXRva2VuYGAgYW5kIGEgYGBzcGx1bmstdXJsYGAuXG4gKiAgV2hlbiB5b3UgdXNlIHRoZSBgYGF3c2ZpcmVsZW5zYGAgbG9nIHJvdXRlciB0byByb3V0ZSBsb2dzIHRvIGFuIEFXUyBTZXJ2aWNlIG9yIEFXUyBQYXJ0bmVyIE5ldHdvcmsgZGVzdGluYXRpb24gZm9yIGxvZyBzdG9yYWdlIGFuZCBhbmFseXRpY3MsIHlvdSBjYW4gc2V0IHRoZSBgYGxvZy1kcml2ZXItYnVmZmVyLWxpbWl0YGAgb3B0aW9uIHRvIGxpbWl0IHRoZSBudW1iZXIgb2YgZXZlbnRzIHRoYXQgYXJlIGJ1ZmZlcmVkIGluIG1lbW9yeSwgYmVmb3JlIGJlaW5nIHNlbnQgdG8gdGhlIGxvZyByb3V0ZXIgY29udGFpbmVyLiBJdCBjYW4gaGVscCB0byByZXNvbHZlIHBvdGVudGlhbCBsb2cgbG9zcyBpc3N1ZSBiZWNhdXNlIGhpZ2ggdGhyb3VnaHB1dCBtaWdodCByZXN1bHQgaW4gbWVtb3J5IHJ1bm5pbmcgb3V0IGZvciB0aGUgYnVmZmVyIGluc2lkZSBvZiBEb2NrZXIuXG4gKiAgT3RoZXIgb3B0aW9ucyB5b3UgY2FuIHNwZWNpZnkgd2hlbiB1c2luZyBgYGF3c2ZpcmVsZW5zYGAgdG8gcm91dGUgbG9ncyBkZXBlbmQgb24gdGhlIGRlc3RpbmF0aW9uLiBXaGVuIHlvdSBleHBvcnQgbG9ncyB0byBBbWF6b24gRGF0YSBGaXJlaG9zZSwgeW91IGNhbiBzcGVjaWZ5IHRoZSBBV1MgUmVnaW9uIHdpdGggYGByZWdpb25gYCBhbmQgYSBuYW1lIGZvciB0aGUgbG9nIHN0cmVhbSB3aXRoIGBgZGVsaXZlcnlfc3RyZWFtYGAuXG4gKiAgV2hlbiB5b3UgZXhwb3J0IGxvZ3MgdG8gQW1hem9uIEtpbmVzaXMgRGF0YSBTdHJlYW1zLCB5b3UgY2FuIHNwZWNpZnkgYW4gQVdTIFJlZ2lvbiB3aXRoIGBgcmVnaW9uYGAgYW5kIGEgZGF0YSBzdHJlYW0gbmFtZSB3aXRoIGBgc3RyZWFtYGAuXG4gKiAgIFdoZW4geW91IGV4cG9ydCBsb2dzIHRvIEFtYXpvbiBPcGVuU2VhcmNoIFNlcnZpY2UsIHlvdSBjYW4gc3BlY2lmeSBvcHRpb25zIGxpa2UgYGBOYW1lYGAsIGBgSG9zdGBgIChPcGVuU2VhcmNoIFNlcnZpY2UgZW5kcG9pbnQgd2l0aG91dCBwcm90b2NvbCksIGBgUG9ydGBgLCBgYEluZGV4YGAsIGBgVHlwZWBgLCBgYEF3c19hdXRoYGAsIGBgQXdzX3JlZ2lvbmBgLCBgYFN1cHByZXNzX1R5cGVfTmFtZWBgLCBhbmQgYGB0bHNgYC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbVW5kZXIgdGhlIGhvb2Q6IEZpcmVMZW5zIGZvciBBbWF6b24gRUNTIFRhc2tzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY29udGFpbmVycy91bmRlci10aGUtaG9vZC1maXJlbGVucy1mb3ItYW1hem9uLWVjcy10YXNrcy8pLlxuICogIFdoZW4geW91IGV4cG9ydCBsb2dzIHRvIEFtYXpvbiBTMywgeW91IGNhbiBzcGVjaWZ5IHRoZSBidWNrZXQgdXNpbmcgdGhlIGBgYnVja2V0YGAgb3B0aW9uLiBZb3UgY2FuIGFsc28gc3BlY2lmeSBgYHJlZ2lvbmBgLCBgYHRvdGFsX2ZpbGVfc2l6ZWBgLCBgYHVwbG9hZF90aW1lb3V0YGAsIGFuZCBgYHVzZV9wdXRfb2JqZWN0YGAgYXMgb3B0aW9ucy5cbiAqICBUaGlzIHBhcmFtZXRlciByZXF1aXJlcyB2ZXJzaW9uIDEuMTkgb2YgdGhlIERvY2tlciBSZW1vdGUgQVBJIG9yIGdyZWF0ZXIgb24geW91ciBjb250YWluZXIgaW5zdGFuY2UuIFRvIGNoZWNrIHRoZSBEb2NrZXIgUmVtb3RlIEFQSSB2ZXJzaW9uIG9uIHlvdXIgY29udGFpbmVyIGluc3RhbmNlLCBsb2cgaW4gdG8geW91ciBjb250YWluZXIgaW5zdGFuY2UgYW5kIHJ1biB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6IGBgc3VkbyBkb2NrZXIgdmVyc2lvbiAtLWZvcm1hdCAne3suU2VydmVyLkFQSVZlcnNpb259fSdgYFxuICovXG5PcHRpb25zPzoge1xuLyoqXG4gKiBUaGlzIGludGVyZmFjZSB3YXMgcmVmZXJlbmNlZCBieSBgdW5kZWZpbmVkYCdzIEpTT04tU2NoZW1hIGRlZmluaXRpb25cbiAqIHZpYSB0aGUgYHBhdHRlcm5Qcm9wZXJ0eWAgXCIuezEsfVwiLlxuICovXG5bazogc3RyaW5nXTogc3RyaW5nXG59XG4vKipcbiAqIFRoZSBsb2cgZHJpdmVyIHRvIHVzZSBmb3IgdGhlIGNvbnRhaW5lci5cbiAqICBGb3IgdGFza3Mgb24gRkFSR0FURWxvbmcsIHRoZSBzdXBwb3J0ZWQgbG9nIGRyaXZlcnMgYXJlIGBgYXdzbG9nc2BgLCBgYHNwbHVua2BgLCBhbmQgYGBhd3NmaXJlbGVuc2BgLlxuICogIEZvciB0YXNrcyBob3N0ZWQgb24gQW1hem9uIEVDMiBpbnN0YW5jZXMsIHRoZSBzdXBwb3J0ZWQgbG9nIGRyaXZlcnMgYXJlIGBgYXdzbG9nc2BgLCBgYGZsdWVudGRgYCwgYGBnZWxmYGAsIGBganNvbi1maWxlYGAsIGBgam91cm5hbGRgYCwgYGBzeXNsb2dgYCwgYGBzcGx1bmtgYCwgYW5kIGBgYXdzZmlyZWxlbnNgYC5cbiAqICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB1c2luZyB0aGUgYGBhd3Nsb2dzYGAgbG9nIGRyaXZlciwgc2VlIFtTZW5kIEFtYXpvbiBFQ1MgbG9ncyB0byBDbG91ZFdhdGNoXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS91c2luZ19hd3Nsb2dzLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB1c2luZyB0aGUgYGBhd3NmaXJlbGVuc2BgIGxvZyBkcml2ZXIsIHNlZSBbU2VuZCBBbWF6b24gRUNTIGxvZ3MgdG8gYW4gc2VydmljZSBvciBQYXJ0bmVyXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS91c2luZ19maXJlbGVucy5odG1sKS5cbiAqICAgSWYgeW91IGhhdmUgYSBjdXN0b20gZHJpdmVyIHRoYXQgaXNuJ3QgbGlzdGVkLCB5b3UgY2FuIGZvcmsgdGhlIEFtYXpvbiBFQ1MgY29udGFpbmVyIGFnZW50IHByb2plY3QgdGhhdCdzIFthdmFpbGFibGUgb24gR2l0SHViXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hbWF6b24tZWNzLWFnZW50KSBhbmQgY3VzdG9taXplIGl0IHRvIHdvcmsgd2l0aCB0aGF0IGRyaXZlci4gV2UgZW5jb3VyYWdlIHlvdSB0byBzdWJtaXQgcHVsbCByZXF1ZXN0cyBmb3IgY2hhbmdlcyB0aGF0IHlvdSB3b3VsZCBsaWtlIHRvIGhhdmUgaW5jbHVkZWQuIEhvd2V2ZXIsIHdlIGRvbid0IGN1cnJlbnRseSBwcm92aWRlIHN1cHBvcnQgZm9yIHJ1bm5pbmcgbW9kaWZpZWQgY29waWVzIG9mIHRoaXMgc29mdHdhcmUuXG4gKi9cbkxvZ0RyaXZlcjogc3RyaW5nXG59XG4vKipcbiAqIFRoZSB0eXBlIGFuZCBhbW91bnQgb2YgYSByZXNvdXJjZSB0byBhc3NpZ24gdG8gYSBjb250YWluZXIuIFRoZSBzdXBwb3J0ZWQgcmVzb3VyY2UgdHlwZXMgYXJlIEdQVXMgYW5kIEVsYXN0aWMgSW5mZXJlbmNlIGFjY2VsZXJhdG9ycy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbV29ya2luZyB3aXRoIEdQVXMgb24gQW1hem9uIEVDU10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvZWNzLWdwdS5odG1sKSBvciBbV29ya2luZyB3aXRoIEFtYXpvbiBFbGFzdGljIEluZmVyZW5jZSBvbiBBbWF6b24gRUNTXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9lY3MtaW5mZXJlbmNlLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc291cmNlUmVxdWlyZW1lbnQge1xuLyoqXG4gKiBUaGUgdHlwZSBvZiByZXNvdXJjZSB0byBhc3NpZ24gdG8gYSBjb250YWluZXIuXG4gKi9cblR5cGU6IHN0cmluZ1xuLyoqXG4gKiBUaGUgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UgdHlwZS5cbiAqICBXaGVuIHRoZSB0eXBlIGlzIGBgR1BVYGAsIHRoZSB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIHBoeXNpY2FsIGBgR1BVc2BgIHRoZSBBbWF6b24gRUNTIGNvbnRhaW5lciBhZ2VudCByZXNlcnZlcyBmb3IgdGhlIGNvbnRhaW5lci4gVGhlIG51bWJlciBvZiBHUFVzIHRoYXQncyByZXNlcnZlZCBmb3IgYWxsIGNvbnRhaW5lcnMgaW4gYSB0YXNrIGNhbid0IGV4Y2VlZCB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBHUFVzIG9uIHRoZSBjb250YWluZXIgaW5zdGFuY2UgdGhhdCB0aGUgdGFzayBpcyBsYXVuY2hlZCBvbi5cbiAqICBXaGVuIHRoZSB0eXBlIGlzIGBgSW5mZXJlbmNlQWNjZWxlcmF0b3JgYCwgdGhlIGBgdmFsdWVgYCBtYXRjaGVzIHRoZSBgYGRldmljZU5hbWVgYCBmb3IgYW4gW0luZmVyZW5jZUFjY2VsZXJhdG9yXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0luZmVyZW5jZUFjY2VsZXJhdG9yLmh0bWwpIHNwZWNpZmllZCBpbiBhIHRhc2sgZGVmaW5pdGlvbi5cbiAqL1xuVmFsdWU6IHN0cmluZ1xufVxuLyoqXG4gKiBBIGxpc3Qgb2YgZmlsZXMgY29udGFpbmluZyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIHBhc3MgdG8gYSBjb250YWluZXIuIFlvdSBjYW4gc3BlY2lmeSB1cCB0byB0ZW4gZW52aXJvbm1lbnQgZmlsZXMuIFRoZSBmaWxlIG11c3QgaGF2ZSBhIGBgLmVudmBgIGZpbGUgZXh0ZW5zaW9uLiBFYWNoIGxpbmUgaW4gYW4gZW52aXJvbm1lbnQgZmlsZSBzaG91bGQgY29udGFpbiBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpbiBgYFZBUklBQkxFPVZBTFVFYGAgZm9ybWF0LiBMaW5lcyBiZWdpbm5pbmcgd2l0aCBgYCNgYCBhcmUgdHJlYXRlZCBhcyBjb21tZW50cyBhbmQgYXJlIGlnbm9yZWQuXG4gKiAgSWYgdGhlcmUgYXJlIGVudmlyb25tZW50IHZhcmlhYmxlcyBzcGVjaWZpZWQgdXNpbmcgdGhlIGBgZW52aXJvbm1lbnRgYCBwYXJhbWV0ZXIgaW4gYSBjb250YWluZXIgZGVmaW5pdGlvbiwgdGhleSB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aGUgdmFyaWFibGVzIGNvbnRhaW5lZCB3aXRoaW4gYW4gZW52aXJvbm1lbnQgZmlsZS4gSWYgbXVsdGlwbGUgZW52aXJvbm1lbnQgZmlsZXMgYXJlIHNwZWNpZmllZCB0aGF0IGNvbnRhaW4gdGhlIHNhbWUgdmFyaWFibGUsIHRoZXkncmUgcHJvY2Vzc2VkIGZyb20gdGhlIHRvcCBkb3duLiBXZSByZWNvbW1lbmQgdGhhdCB5b3UgdXNlIHVuaXF1ZSB2YXJpYWJsZSBuYW1lcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbVXNlIGEgZmlsZSB0byBwYXNzIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBhIGNvbnRhaW5lcl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvdXNlLWVudmlyb25tZW50LWZpbGUuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICogIEVudmlyb25tZW50IHZhcmlhYmxlIGZpbGVzIGFyZSBvYmplY3RzIGluIEFtYXpvbiBTMyBhbmQgYWxsIEFtYXpvbiBTMyBzZWN1cml0eSBjb25zaWRlcmF0aW9ucyBhcHBseS4gXG4gKiAgWW91IG11c3QgdXNlIHRoZSBmb2xsb3dpbmcgcGxhdGZvcm1zIGZvciB0aGUgRmFyZ2F0ZSBsYXVuY2ggdHlwZTpcbiAqICAgKyAgTGludXggcGxhdGZvcm0gdmVyc2lvbiBgYDEuNC4wYGAgb3IgbGF0ZXIuXG4gKiAgICsgIFdpbmRvd3MgcGxhdGZvcm0gdmVyc2lvbiBgYDEuMC4wYGAgb3IgbGF0ZXIuXG4gKiAgIFxuICogIENvbnNpZGVyIHRoZSBmb2xsb3dpbmcgd2hlbiB1c2luZyB0aGUgRmFyZ2F0ZSBsYXVuY2ggdHlwZTpcbiAqICAgKyAgVGhlIGZpbGUgaXMgaGFuZGxlZCBsaWtlIGEgbmF0aXZlIERvY2tlciBlbnYtZmlsZS5cbiAqICAgKyAgVGhlcmUgaXMgbm8gc3VwcG9ydCBmb3Igc2hlbGwgZXNjYXBlIGhhbmRsaW5nLlxuICogICArICBUaGUgY29udGFpbmVyIGVudHJ5IHBvaW50IGludGVycGVydHMgdGhlIGBgVkFSSUFCTEVgYCB2YWx1ZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW52aXJvbm1lbnRGaWxlIHtcbi8qKlxuICogVGhlIGZpbGUgdHlwZSB0byB1c2UuIEVudmlyb25tZW50IGZpbGVzIGFyZSBvYmplY3RzIGluIEFtYXpvbiBTMy4gVGhlIG9ubHkgc3VwcG9ydGVkIHZhbHVlIGlzIGBgczNgYC5cbiAqL1xuVHlwZT86IHN0cmluZ1xuLyoqXG4gKiBUaGUgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIEFtYXpvbiBTMyBvYmplY3QgY29udGFpbmluZyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgZmlsZS5cbiAqL1xuVmFsdWU/OiBzdHJpbmdcbn1cbi8qKlxuICogVGhlIEZpcmVMZW5zIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBjb250YWluZXIuIFRoaXMgaXMgdXNlZCB0byBzcGVjaWZ5IGFuZCBjb25maWd1cmUgYSBsb2cgcm91dGVyIGZvciBjb250YWluZXIgbG9ncy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQ3VzdG9tIExvZyBSb3V0aW5nXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS91c2luZ19maXJlbGVucy5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmlyZWxlbnNDb25maWd1cmF0aW9uIHtcbi8qKlxuICogVGhlIG9wdGlvbnMgdG8gdXNlIHdoZW4gY29uZmlndXJpbmcgdGhlIGxvZyByb3V0ZXIuIFRoaXMgZmllbGQgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSB1c2VkIHRvIGFkZCBhZGRpdGlvbmFsIG1ldGFkYXRhLCBzdWNoIGFzIHRoZSB0YXNrLCB0YXNrIGRlZmluaXRpb24sIGNsdXN0ZXIsIGFuZCBjb250YWluZXIgaW5zdGFuY2UgZGV0YWlscyB0byB0aGUgbG9nIGV2ZW50LlxuICogICBJZiBzcGVjaWZpZWQsIHZhbGlkIG9wdGlvbiBrZXlzIGFyZTpcbiAqICAgKyAgYGBlbmFibGUtZWNzLWxvZy1tZXRhZGF0YWBgLCB3aGljaCBjYW4gYmUgYGB0cnVlYGAgb3IgYGBmYWxzZWBgXG4gKiAgICsgIGBgY29uZmlnLWZpbGUtdHlwZWBgLCB3aGljaCBjYW4gYmUgYGBzM2BgIG9yIGBgZmlsZWBgXG4gKiAgICsgIGBgY29uZmlnLWZpbGUtdmFsdWVgYCwgd2hpY2ggaXMgZWl0aGVyIGFuIFMzIEFSTiBvciBhIGZpbGUgcGF0aFxuICovXG5PcHRpb25zPzoge1xuLyoqXG4gKiBUaGlzIGludGVyZmFjZSB3YXMgcmVmZXJlbmNlZCBieSBgdW5kZWZpbmVkYCdzIEpTT04tU2NoZW1hIGRlZmluaXRpb25cbiAqIHZpYSB0aGUgYHBhdHRlcm5Qcm9wZXJ0eWAgXCIuezEsfVwiLlxuICovXG5bazogc3RyaW5nXTogc3RyaW5nXG59XG4vKipcbiAqIFRoZSBsb2cgcm91dGVyIHRvIHVzZS4gVGhlIHZhbGlkIHZhbHVlcyBhcmUgYGBmbHVlbnRkYGAgb3IgYGBmbHVlbnRiaXRgYC5cbiAqL1xuVHlwZT86IHN0cmluZ1xufVxuLyoqXG4gKiBBIGxpc3Qgb2YgbmFtZXNwYWNlZCBrZXJuZWwgcGFyYW1ldGVycyB0byBzZXQgaW4gdGhlIGNvbnRhaW5lci4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYFN5c2N0bHNgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS1zeXNjdGxgYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi4gRm9yIGV4YW1wbGUsIHlvdSBjYW4gY29uZmlndXJlIGBgbmV0LmlwdjQudGNwX2tlZXBhbGl2ZV90aW1lYGAgc2V0dGluZyB0byBtYWludGFpbiBsb25nZXIgbGl2ZWQgY29ubmVjdGlvbnMuXG4gKiAgV2UgZG9uJ3QgcmVjb21tZW5kIHRoYXQgeW91IHNwZWNpZnkgbmV0d29yay1yZWxhdGVkIGBgc3lzdGVtQ29udHJvbHNgYCBwYXJhbWV0ZXJzIGZvciBtdWx0aXBsZSBjb250YWluZXJzIGluIGEgc2luZ2xlIHRhc2sgdGhhdCBhbHNvIHVzZXMgZWl0aGVyIHRoZSBgYGF3c3ZwY2BgIG9yIGBgaG9zdGBgIG5ldHdvcmsgbW9kZS4gRG9pbmcgdGhpcyBoYXMgdGhlIGZvbGxvd2luZyBkaXNhZHZhbnRhZ2VzOlxuICogICArICBGb3IgdGFza3MgdGhhdCB1c2UgdGhlIGBgYXdzdnBjYGAgbmV0d29yayBtb2RlIGluY2x1ZGluZyBGYXJnYXRlLCBpZiB5b3Ugc2V0IGBgc3lzdGVtQ29udHJvbHNgYCBmb3IgYW55IGNvbnRhaW5lciwgaXQgYXBwbGllcyB0byBhbGwgY29udGFpbmVycyBpbiB0aGUgdGFzay4gSWYgeW91IHNldCBkaWZmZXJlbnQgYGBzeXN0ZW1Db250cm9sc2BgIGZvciBtdWx0aXBsZSBjb250YWluZXJzIGluIGEgc2luZ2xlIHRhc2ssIHRoZSBjb250YWluZXIgdGhhdCdzIHN0YXJ0ZWQgbGFzdCBkZXRlcm1pbmVzIHdoaWNoIGBgc3lzdGVtQ29udHJvbHNgYCB0YWtlIGVmZmVjdC5cbiAqICAgKyAgRm9yIHRhc2tzIHRoYXQgdXNlIHRoZSBgYGhvc3RgYCBuZXR3b3JrIG1vZGUsIHRoZSBuZXR3b3JrIG5hbWVzcGFjZSBgYHN5c3RlbUNvbnRyb2xzYGAgYXJlbid0IHN1cHBvcnRlZC5cbiAqICAgXG4gKiAgSWYgeW91J3JlIHNldHRpbmcgYW4gSVBDIHJlc291cmNlIG5hbWVzcGFjZSB0byB1c2UgZm9yIHRoZSBjb250YWluZXJzIGluIHRoZSB0YXNrLCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXBwbHkgdG8geW91ciBzeXN0ZW0gY29udHJvbHMuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0lQQyBtb2RlXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS90YXNrX2RlZmluaXRpb25fcGFyYW1ldGVycy5odG1sI3Rhc2tfZGVmaW5pdGlvbl9pcGNtb2RlKS5cbiAqICAgKyAgRm9yIHRhc2tzIHRoYXQgdXNlIHRoZSBgYGhvc3RgYCBJUEMgbW9kZSwgSVBDIG5hbWVzcGFjZSBgYHN5c3RlbUNvbnRyb2xzYGAgYXJlbid0IHN1cHBvcnRlZC5cbiAqICAgKyAgRm9yIHRhc2tzIHRoYXQgdXNlIHRoZSBgYHRhc2tgYCBJUEMgbW9kZSwgSVBDIG5hbWVzcGFjZSBgYHN5c3RlbUNvbnRyb2xzYGAgdmFsdWVzIGFwcGx5IHRvIGFsbCBjb250YWluZXJzIHdpdGhpbiBhIHRhc2suXG4gKiAgIFxuICogICBUaGlzIHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkIGZvciBXaW5kb3dzIGNvbnRhaW5lcnMuXG4gKiAgICBUaGlzIHBhcmFtZXRlciBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgdGFza3MgdGhhdCBhcmUgaG9zdGVkIG9uIEZBUkdBVEVsb25nIGlmIHRoZSB0YXNrcyBhcmUgdXNpbmcgcGxhdGZvcm0gdmVyc2lvbiBgYDEuNC4wYGAgb3IgbGF0ZXIgKExpbnV4KS4gVGhpcyBpc24ndCBzdXBwb3J0ZWQgZm9yIFdpbmRvd3MgY29udGFpbmVycyBvbiBGYXJnYXRlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN5c3RlbUNvbnRyb2wge1xuLyoqXG4gKiBUaGUgbmFtZXNwYWNlZCBrZXJuZWwgcGFyYW1ldGVyIHRvIHNldCBhIGBgdmFsdWVgYCBmb3IuXG4gKiAgVmFsaWQgSVBDIG5hbWVzcGFjZSB2YWx1ZXM6IGBgXCJrZXJuZWwubXNnbWF4XCIgfCBcImtlcm5lbC5tc2dtbmJcIiB8IFwia2VybmVsLm1zZ21uaVwiIHwgXCJrZXJuZWwuc2VtXCIgfCBcImtlcm5lbC5zaG1hbGxcIiB8IFwia2VybmVsLnNobW1heFwiIHwgXCJrZXJuZWwuc2htbW5pXCIgfCBcImtlcm5lbC5zaG1fcm1pZF9mb3JjZWRcImBgLCBhbmQgYGBTeXNjdGxzYGAgdGhhdCBzdGFydCB3aXRoIGBgXCJmcy5tcXVldWUuKlwiYGBcbiAqICBWYWxpZCBuZXR3b3JrIG5hbWVzcGFjZSB2YWx1ZXM6IGBgU3lzY3Rsc2BgIHRoYXQgc3RhcnQgd2l0aCBgYFwibmV0LipcImBgLiBPbmx5IG5hbWVzcGFjZWQgYGBTeXNjdGxzYGAgdGhhdCBleGlzdCB3aXRoaW4gdGhlIGNvbnRhaW5lciBzdGFydGluZyB3aXRoIFwibmV0LiogYXJlIGFjY2VwdGVkLlxuICogIEFsbCBvZiB0aGVzZSB2YWx1ZXMgYXJlIHN1cHBvcnRlZCBieSBGYXJnYXRlLlxuICovXG5WYWx1ZT86IHN0cmluZ1xuLyoqXG4gKiBUaGUgbmFtZXNwYWNlZCBrZXJuZWwgcGFyYW1ldGVyIHRvIHNldCBhIGBgdmFsdWVgYCBmb3IuXG4gKi9cbk5hbWVzcGFjZT86IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgYGB1bGltaXRgYCBzZXR0aW5ncyB0byBwYXNzIHRvIHRoZSBjb250YWluZXIuXG4gKiAgQW1hem9uIEVDUyB0YXNrcyBob3N0ZWQgb24gRkFSR0FURWxvbmcgdXNlIHRoZSBkZWZhdWx0IHJlc291cmNlIGxpbWl0IHZhbHVlcyBzZXQgYnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0gd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSBgYG5vZmlsZWBgIHJlc291cmNlIGxpbWl0IHBhcmFtZXRlciB3aGljaCBGQVJHQVRFbG9uZyBvdmVycmlkZXMuIFRoZSBgYG5vZmlsZWBgIHJlc291cmNlIGxpbWl0IHNldHMgYSByZXN0cmljdGlvbiBvbiB0aGUgbnVtYmVyIG9mIG9wZW4gZmlsZXMgdGhhdCBhIGNvbnRhaW5lciBjYW4gdXNlLiBUaGUgZGVmYXVsdCBgYG5vZmlsZWBgIHNvZnQgbGltaXQgaXMgYGA2NTUzNWBgIGFuZCB0aGUgZGVmYXVsdCBoYXJkIGxpbWl0IGlzIGBgNjU1MzVgYC5cbiAqICBZb3UgY2FuIHNwZWNpZnkgdGhlIGBgdWxpbWl0YGAgc2V0dGluZ3MgZm9yIGEgY29udGFpbmVyIGluIGEgdGFzayBkZWZpbml0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVsaW1pdCB7XG4vKipcbiAqIFRoZSBzb2Z0IGxpbWl0IGZvciB0aGUgYGB1bGltaXRgYCB0eXBlLiBUaGUgdmFsdWUgY2FuIGJlIHNwZWNpZmllZCBpbiBieXRlcywgc2Vjb25kcywgb3IgYXMgYSBjb3VudCwgZGVwZW5kaW5nIG9uIHRoZSBgYHR5cGVgYCBvZiB0aGUgYGB1bGltaXRgYC5cbiAqL1xuU29mdExpbWl0OiBudW1iZXJcbi8qKlxuICogVGhlIGhhcmQgbGltaXQgZm9yIHRoZSBgYHVsaW1pdGBgIHR5cGUuIFRoZSB2YWx1ZSBjYW4gYmUgc3BlY2lmaWVkIGluIGJ5dGVzLCBzZWNvbmRzLCBvciBhcyBhIGNvdW50LCBkZXBlbmRpbmcgb24gdGhlIGBgdHlwZWBgIG9mIHRoZSBgYHVsaW1pdGBgLlxuICovXG5IYXJkTGltaXQ6IG51bWJlclxuLyoqXG4gKiBUaGUgYGB0eXBlYGAgb2YgdGhlIGBgdWxpbWl0YGAuXG4gKi9cbk5hbWU6IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgcHJpdmF0ZSByZXBvc2l0b3J5IGF1dGhlbnRpY2F0aW9uIGNyZWRlbnRpYWxzIHRvIHVzZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXBvc2l0b3J5Q3JlZGVudGlhbHMge1xuLyoqXG4gKiBUaGUgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIHNlY3JldCBjb250YWluaW5nIHRoZSBwcml2YXRlIHJlcG9zaXRvcnkgY3JlZGVudGlhbHMuXG4gKiAgIFdoZW4geW91IHVzZSB0aGUgQW1hem9uIEVDUyBBUEksIENMSSwgb3IgQVdTIFNESywgaWYgdGhlIHNlY3JldCBleGlzdHMgaW4gdGhlIHNhbWUgUmVnaW9uIGFzIHRoZSB0YXNrIHRoYXQgeW91J3JlIGxhdW5jaGluZyB0aGVuIHlvdSBjYW4gdXNlIGVpdGhlciB0aGUgZnVsbCBBUk4gb3IgdGhlIG5hbWUgb2YgdGhlIHNlY3JldC4gV2hlbiB5b3UgdXNlIHRoZSBBV1MgTWFuYWdlbWVudCBDb25zb2xlLCB5b3UgbXVzdCBzcGVjaWZ5IHRoZSBmdWxsIEFSTiBvZiB0aGUgc2VjcmV0LlxuICovXG5DcmVkZW50aWFsc1BhcmFtZXRlcj86IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgYGBIb3N0RW50cnlgYCBwcm9wZXJ0eSBzcGVjaWZpZXMgYSBob3N0bmFtZSBhbmQgYW4gSVAgYWRkcmVzcyB0aGF0IGFyZSBhZGRlZCB0byB0aGUgYGAvZXRjL2hvc3RzYGAgZmlsZSBvZiBhIGNvbnRhaW5lciB0aHJvdWdoIHRoZSBgYGV4dHJhSG9zdHNgYCBwYXJhbWV0ZXIgb2YgaXRzIGBgQ29udGFpbmVyRGVmaW5pdGlvbmBgIHJlc291cmNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhvc3RFbnRyeSB7XG4vKipcbiAqIFRoZSBob3N0bmFtZSB0byB1c2UgaW4gdGhlIGBgL2V0Yy9ob3N0c2BgIGVudHJ5LlxuICovXG5Ib3N0bmFtZT86IHN0cmluZ1xuLyoqXG4gKiBUaGUgSVAgYWRkcmVzcyB0byB1c2UgaW4gdGhlIGBgL2V0Yy9ob3N0c2BgIGVudHJ5LlxuICovXG5JcEFkZHJlc3M/OiBzdHJpbmdcbn1cbi8qKlxuICogTGludXgtc3BlY2lmaWMgbW9kaWZpY2F0aW9ucyB0aGF0IGFyZSBhcHBsaWVkIHRvIHRoZSBjb250YWluZXIsIHN1Y2ggYXMgTGludXgga2VybmVsIGNhcGFiaWxpdGllcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIFtLZXJuZWxDYXBhYmlsaXRpZXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfS2VybmVsQ2FwYWJpbGl0aWVzLmh0bWwpLlxuICogICBUaGlzIHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkIGZvciBXaW5kb3dzIGNvbnRhaW5lcnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGludXhQYXJhbWV0ZXJzIHtcbkNhcGFiaWxpdGllcz86IEtlcm5lbENhcGFiaWxpdGllc1xuLyoqXG4gKiBUaGlzIGFsbG93cyB5b3UgdG8gdHVuZSBhIGNvbnRhaW5lcidzIG1lbW9yeSBzd2FwcGluZXNzIGJlaGF2aW9yLiBBIGBgc3dhcHBpbmVzc2BgIHZhbHVlIG9mIGBgMGBgIHdpbGwgY2F1c2Ugc3dhcHBpbmcgdG8gbm90IGhhcHBlbiB1bmxlc3MgYWJzb2x1dGVseSBuZWNlc3NhcnkuIEEgYGBzd2FwcGluZXNzYGAgdmFsdWUgb2YgYGAxMDBgYCB3aWxsIGNhdXNlIHBhZ2VzIHRvIGJlIHN3YXBwZWQgdmVyeSBhZ2dyZXNzaXZlbHkuIEFjY2VwdGVkIHZhbHVlcyBhcmUgd2hvbGUgbnVtYmVycyBiZXR3ZWVuIGBgMGBgIGFuZCBgYDEwMGBgLiBJZiB0aGUgYGBzd2FwcGluZXNzYGAgcGFyYW1ldGVyIGlzIG5vdCBzcGVjaWZpZWQsIGEgZGVmYXVsdCB2YWx1ZSBvZiBgYDYwYGAgaXMgdXNlZC4gSWYgYSB2YWx1ZSBpcyBub3Qgc3BlY2lmaWVkIGZvciBgYG1heFN3YXBgYCB0aGVuIHRoaXMgcGFyYW1ldGVyIGlzIGlnbm9yZWQuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gdGhlIGBgLS1tZW1vcnktc3dhcHBpbmVzc2BgIG9wdGlvbiB0byBkb2NrZXIgcnVuLlxuICogICBJZiB5b3UncmUgdXNpbmcgdGFza3MgdGhhdCB1c2UgdGhlIEZhcmdhdGUgbGF1bmNoIHR5cGUsIHRoZSBgYHN3YXBwaW5lc3NgYCBwYXJhbWV0ZXIgaXNuJ3Qgc3VwcG9ydGVkLlxuICogIElmIHlvdSdyZSB1c2luZyB0YXNrcyBvbiBBbWF6b24gTGludXggMjAyMyB0aGUgYGBzd2FwcGluZXNzYGAgcGFyYW1ldGVyIGlzbid0IHN1cHBvcnRlZC5cbiAqL1xuU3dhcHBpbmVzcz86IG51bWJlclxuLyoqXG4gKiBUaGUgY29udGFpbmVyIHBhdGgsIG1vdW50IG9wdGlvbnMsIGFuZCBzaXplIChpbiBNaUIpIG9mIHRoZSB0bXBmcyBtb3VudC4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byB0aGUgYGAtLXRtcGZzYGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKiAgIElmIHlvdSdyZSB1c2luZyB0YXNrcyB0aGF0IHVzZSB0aGUgRmFyZ2F0ZSBsYXVuY2ggdHlwZSwgdGhlIGBgdG1wZnNgYCBwYXJhbWV0ZXIgaXNuJ3Qgc3VwcG9ydGVkLlxuICovXG5UbXBmcz86IFRtcGZzW11cbi8qKlxuICogVGhlIHZhbHVlIGZvciB0aGUgc2l6ZSAoaW4gTWlCKSBvZiB0aGUgYGAvZGV2L3NobWBgIHZvbHVtZS4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byB0aGUgYGAtLXNobS1zaXplYGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKiAgIElmIHlvdSBhcmUgdXNpbmcgdGFza3MgdGhhdCB1c2UgdGhlIEZhcmdhdGUgbGF1bmNoIHR5cGUsIHRoZSBgYHNoYXJlZE1lbW9yeVNpemVgYCBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZC5cbiAqL1xuU2hhcmVkTWVtb3J5U2l6ZT86IG51bWJlclxuLyoqXG4gKiBBbnkgaG9zdCBkZXZpY2VzIHRvIGV4cG9zZSB0byB0aGUgY29udGFpbmVyLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgRGV2aWNlc2BgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kIGFuZCB0aGUgYGAtLWRldmljZWBgIG9wdGlvbiB0byBkb2NrZXIgcnVuLlxuICogICBJZiB5b3UncmUgdXNpbmcgdGFza3MgdGhhdCB1c2UgdGhlIEZhcmdhdGUgbGF1bmNoIHR5cGUsIHRoZSBgYGRldmljZXNgYCBwYXJhbWV0ZXIgaXNuJ3Qgc3VwcG9ydGVkLlxuICovXG5EZXZpY2VzPzogRGV2aWNlW11cbi8qKlxuICogUnVuIGFuIGBgaW5pdGBgIHByb2Nlc3MgaW5zaWRlIHRoZSBjb250YWluZXIgdGhhdCBmb3J3YXJkcyBzaWduYWxzIGFuZCByZWFwcyBwcm9jZXNzZXMuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gdGhlIGBgLS1pbml0YGAgb3B0aW9uIHRvIGRvY2tlciBydW4uIFRoaXMgcGFyYW1ldGVyIHJlcXVpcmVzIHZlcnNpb24gMS4yNSBvZiB0aGUgRG9ja2VyIFJlbW90ZSBBUEkgb3IgZ3JlYXRlciBvbiB5b3VyIGNvbnRhaW5lciBpbnN0YW5jZS4gVG8gY2hlY2sgdGhlIERvY2tlciBSZW1vdGUgQVBJIHZlcnNpb24gb24geW91ciBjb250YWluZXIgaW5zdGFuY2UsIGxvZyBpbiB0byB5b3VyIGNvbnRhaW5lciBpbnN0YW5jZSBhbmQgcnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZDogYGBzdWRvIGRvY2tlciB2ZXJzaW9uIC0tZm9ybWF0ICd7ey5TZXJ2ZXIuQVBJVmVyc2lvbn19J2BgXG4gKi9cbkluaXRQcm9jZXNzRW5hYmxlZD86IGJvb2xlYW5cbi8qKlxuICogVGhlIHRvdGFsIGFtb3VudCBvZiBzd2FwIG1lbW9yeSAoaW4gTWlCKSBhIGNvbnRhaW5lciBjYW4gdXNlLiBUaGlzIHBhcmFtZXRlciB3aWxsIGJlIHRyYW5zbGF0ZWQgdG8gdGhlIGBgLS1tZW1vcnktc3dhcGBgIG9wdGlvbiB0byBkb2NrZXIgcnVuIHdoZXJlIHRoZSB2YWx1ZSB3b3VsZCBiZSB0aGUgc3VtIG9mIHRoZSBjb250YWluZXIgbWVtb3J5IHBsdXMgdGhlIGBgbWF4U3dhcGBgIHZhbHVlLlxuICogIElmIGEgYGBtYXhTd2FwYGAgdmFsdWUgb2YgYGAwYGAgaXMgc3BlY2lmaWVkLCB0aGUgY29udGFpbmVyIHdpbGwgbm90IHVzZSBzd2FwLiBBY2NlcHRlZCB2YWx1ZXMgYXJlIGBgMGBgIG9yIGFueSBwb3NpdGl2ZSBpbnRlZ2VyLiBJZiB0aGUgYGBtYXhTd2FwYGAgcGFyYW1ldGVyIGlzIG9taXR0ZWQsIHRoZSBjb250YWluZXIgd2lsbCB1c2UgdGhlIHN3YXAgY29uZmlndXJhdGlvbiBmb3IgdGhlIGNvbnRhaW5lciBpbnN0YW5jZSBpdCBpcyBydW5uaW5nIG9uLiBBIGBgbWF4U3dhcGBgIHZhbHVlIG11c3QgYmUgc2V0IGZvciB0aGUgYGBzd2FwcGluZXNzYGAgcGFyYW1ldGVyIHRvIGJlIHVzZWQuXG4gKiAgIElmIHlvdSdyZSB1c2luZyB0YXNrcyB0aGF0IHVzZSB0aGUgRmFyZ2F0ZSBsYXVuY2ggdHlwZSwgdGhlIGBgbWF4U3dhcGBgIHBhcmFtZXRlciBpc24ndCBzdXBwb3J0ZWQuXG4gKiAgSWYgeW91J3JlIHVzaW5nIHRhc2tzIG9uIEFtYXpvbiBMaW51eCAyMDIzIHRoZSBgYHN3YXBwaW5lc3NgYCBwYXJhbWV0ZXIgaXNuJ3Qgc3VwcG9ydGVkLlxuICovXG5NYXhTd2FwPzogbnVtYmVyXG59XG4vKipcbiAqIFRoZSBMaW51eCBjYXBhYmlsaXRpZXMgZm9yIHRoZSBjb250YWluZXIgdGhhdCBhcmUgYWRkZWQgdG8gb3IgZHJvcHBlZCBmcm9tIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gcHJvdmlkZWQgYnkgRG9ja2VyLlxuICogICBGb3IgdGFza3MgdGhhdCB1c2UgdGhlIEZhcmdhdGUgbGF1bmNoIHR5cGUsIGBgY2FwYWJpbGl0aWVzYGAgaXMgc3VwcG9ydGVkIGZvciBhbGwgcGxhdGZvcm0gdmVyc2lvbnMgYnV0IHRoZSBgYGFkZGBgIHBhcmFtZXRlciBpcyBvbmx5IHN1cHBvcnRlZCBpZiB1c2luZyBwbGF0Zm9ybSB2ZXJzaW9uIDEuNC4wIG9yIGxhdGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEtlcm5lbENhcGFiaWxpdGllcyB7XG4vKipcbiAqIFRoZSBMaW51eCBjYXBhYmlsaXRpZXMgZm9yIHRoZSBjb250YWluZXIgdGhhdCBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBwcm92aWRlZCBieSBEb2NrZXIuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBDYXBBZGRgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS1jYXAtYWRkYGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKiAgIFRhc2tzIGxhdW5jaGVkIG9uIEZBUkdBVEVsb25nIG9ubHkgc3VwcG9ydCBhZGRpbmcgdGhlIGBgU1lTX1BUUkFDRWBgIGtlcm5lbCBjYXBhYmlsaXR5LlxuICogICBWYWxpZCB2YWx1ZXM6IGBgXCJBTExcIiB8IFwiQVVESVRfQ09OVFJPTFwiIHwgXCJBVURJVF9XUklURVwiIHwgXCJCTE9DS19TVVNQRU5EXCIgfCBcIkNIT1dOXCIgfCBcIkRBQ19PVkVSUklERVwiIHwgXCJEQUNfUkVBRF9TRUFSQ0hcIiB8IFwiRk9XTkVSXCIgfCBcIkZTRVRJRFwiIHwgXCJJUENfTE9DS1wiIHwgXCJJUENfT1dORVJcIiB8IFwiS0lMTFwiIHwgXCJMRUFTRVwiIHwgXCJMSU5VWF9JTU1VVEFCTEVcIiB8IFwiTUFDX0FETUlOXCIgfCBcIk1BQ19PVkVSUklERVwiIHwgXCJNS05PRFwiIHwgXCJORVRfQURNSU5cIiB8IFwiTkVUX0JJTkRfU0VSVklDRVwiIHwgXCJORVRfQlJPQURDQVNUXCIgfCBcIk5FVF9SQVdcIiB8IFwiU0VURkNBUFwiIHwgXCJTRVRHSURcIiB8IFwiU0VUUENBUFwiIHwgXCJTRVRVSURcIiB8IFwiU1lTX0FETUlOXCIgfCBcIlNZU19CT09UXCIgfCBcIlNZU19DSFJPT1RcIiB8IFwiU1lTX01PRFVMRVwiIHwgXCJTWVNfTklDRVwiIHwgXCJTWVNfUEFDQ1RcIiB8IFwiU1lTX1BUUkFDRVwiIHwgXCJTWVNfUkFXSU9cIiB8IFwiU1lTX1JFU09VUkNFXCIgfCBcIlNZU19USU1FXCIgfCBcIlNZU19UVFlfQ09ORklHXCIgfCBcIlNZU0xPR1wiIHwgXCJXQUtFX0FMQVJNXCJgYFxuICovXG5BZGQ/OiBzdHJpbmdbXVxuLyoqXG4gKiBUaGUgTGludXggY2FwYWJpbGl0aWVzIGZvciB0aGUgY29udGFpbmVyIHRoYXQgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIHByb3ZpZGVkIGJ5IERvY2tlci4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYENhcERyb3BgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS1jYXAtZHJvcGBgIG9wdGlvbiB0byBkb2NrZXIgcnVuLlxuICogIFZhbGlkIHZhbHVlczogYGBcIkFMTFwiIHwgXCJBVURJVF9DT05UUk9MXCIgfCBcIkFVRElUX1dSSVRFXCIgfCBcIkJMT0NLX1NVU1BFTkRcIiB8IFwiQ0hPV05cIiB8IFwiREFDX09WRVJSSURFXCIgfCBcIkRBQ19SRUFEX1NFQVJDSFwiIHwgXCJGT1dORVJcIiB8IFwiRlNFVElEXCIgfCBcIklQQ19MT0NLXCIgfCBcIklQQ19PV05FUlwiIHwgXCJLSUxMXCIgfCBcIkxFQVNFXCIgfCBcIkxJTlVYX0lNTVVUQUJMRVwiIHwgXCJNQUNfQURNSU5cIiB8IFwiTUFDX09WRVJSSURFXCIgfCBcIk1LTk9EXCIgfCBcIk5FVF9BRE1JTlwiIHwgXCJORVRfQklORF9TRVJWSUNFXCIgfCBcIk5FVF9CUk9BRENBU1RcIiB8IFwiTkVUX1JBV1wiIHwgXCJTRVRGQ0FQXCIgfCBcIlNFVEdJRFwiIHwgXCJTRVRQQ0FQXCIgfCBcIlNFVFVJRFwiIHwgXCJTWVNfQURNSU5cIiB8IFwiU1lTX0JPT1RcIiB8IFwiU1lTX0NIUk9PVFwiIHwgXCJTWVNfTU9EVUxFXCIgfCBcIlNZU19OSUNFXCIgfCBcIlNZU19QQUNDVFwiIHwgXCJTWVNfUFRSQUNFXCIgfCBcIlNZU19SQVdJT1wiIHwgXCJTWVNfUkVTT1VSQ0VcIiB8IFwiU1lTX1RJTUVcIiB8IFwiU1lTX1RUWV9DT05GSUdcIiB8IFwiU1lTTE9HXCIgfCBcIldBS0VfQUxBUk1cImBgXG4gKi9cbkRyb3A/OiBzdHJpbmdbXVxufVxuLyoqXG4gKiBUaGUgY29udGFpbmVyIHBhdGgsIG1vdW50IG9wdGlvbnMsIGFuZCBzaXplIG9mIHRoZSB0bXBmcyBtb3VudC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUbXBmcyB7XG4vKipcbiAqIFRoZSBtYXhpbXVtIHNpemUgKGluIE1pQikgb2YgdGhlIHRtcGZzIHZvbHVtZS5cbiAqL1xuU2l6ZTogbnVtYmVyXG4vKipcbiAqIFRoZSBhYnNvbHV0ZSBmaWxlIHBhdGggd2hlcmUgdGhlIHRtcGZzIHZvbHVtZSBpcyB0byBiZSBtb3VudGVkLlxuICovXG5Db250YWluZXJQYXRoPzogc3RyaW5nXG4vKipcbiAqIFRoZSBsaXN0IG9mIHRtcGZzIHZvbHVtZSBtb3VudCBvcHRpb25zLlxuICogIFZhbGlkIHZhbHVlczogYGBcImRlZmF1bHRzXCIgfCBcInJvXCIgfCBcInJ3XCIgfCBcInN1aWRcIiB8IFwibm9zdWlkXCIgfCBcImRldlwiIHwgXCJub2RldlwiIHwgXCJleGVjXCIgfCBcIm5vZXhlY1wiIHwgXCJzeW5jXCIgfCBcImFzeW5jXCIgfCBcImRpcnN5bmNcIiB8IFwicmVtb3VudFwiIHwgXCJtYW5kXCIgfCBcIm5vbWFuZFwiIHwgXCJhdGltZVwiIHwgXCJub2F0aW1lXCIgfCBcImRpcmF0aW1lXCIgfCBcIm5vZGlyYXRpbWVcIiB8IFwiYmluZFwiIHwgXCJyYmluZFwiIHwgXCJ1bmJpbmRhYmxlXCIgfCBcInJ1bmJpbmRhYmxlXCIgfCBcInByaXZhdGVcIiB8IFwicnByaXZhdGVcIiB8IFwic2hhcmVkXCIgfCBcInJzaGFyZWRcIiB8IFwic2xhdmVcIiB8IFwicnNsYXZlXCIgfCBcInJlbGF0aW1lXCIgfCBcIm5vcmVsYXRpbWVcIiB8IFwic3RyaWN0YXRpbWVcIiB8IFwibm9zdHJpY3RhdGltZVwiIHwgXCJtb2RlXCIgfCBcInVpZFwiIHwgXCJnaWRcIiB8IFwibnJfaW5vZGVzXCIgfCBcIm5yX2Jsb2Nrc1wiIHwgXCJtcG9sXCJgYFxuICovXG5Nb3VudE9wdGlvbnM/OiBzdHJpbmdbXVxufVxuLyoqXG4gKiBUaGUgYGBEZXZpY2VgYCBwcm9wZXJ0eSBzcGVjaWZpZXMgYW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIGNvbnRhaW5lciBpbnN0YW5jZSBob3N0IGRldmljZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXZpY2Uge1xuLyoqXG4gKiBUaGUgcGF0aCBmb3IgdGhlIGRldmljZSBvbiB0aGUgaG9zdCBjb250YWluZXIgaW5zdGFuY2UuXG4gKi9cbkhvc3RQYXRoPzogc3RyaW5nXG4vKipcbiAqIFRoZSBleHBsaWNpdCBwZXJtaXNzaW9ucyB0byBwcm92aWRlIHRvIHRoZSBjb250YWluZXIgZm9yIHRoZSBkZXZpY2UuIEJ5IGRlZmF1bHQsIHRoZSBjb250YWluZXIgaGFzIHBlcm1pc3Npb25zIGZvciBgYHJlYWRgYCwgYGB3cml0ZWBgLCBhbmQgYGBta25vZGBgIGZvciB0aGUgZGV2aWNlLlxuICovXG5QZXJtaXNzaW9ucz86IHN0cmluZ1tdXG4vKipcbiAqIFRoZSBwYXRoIGluc2lkZSB0aGUgY29udGFpbmVyIGF0IHdoaWNoIHRvIGV4cG9zZSB0aGUgaG9zdCBkZXZpY2UuXG4gKi9cbkNvbnRhaW5lclBhdGg/OiBzdHJpbmdcbn1cbi8qKlxuICogVGhlIHJlc3RhcnQgcG9saWN5IGZvciBhIGNvbnRhaW5lci4gV2hlbiB5b3Ugc2V0IHVwIGEgcmVzdGFydCBwb2xpY3ksIEFtYXpvbiBFQ1MgY2FuIHJlc3RhcnQgdGhlIGNvbnRhaW5lciB3aXRob3V0IG5lZWRpbmcgdG8gcmVwbGFjZSB0aGUgdGFzay4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbUmVzdGFydCBpbmRpdmlkdWFsIGNvbnRhaW5lcnMgaW4gQW1hem9uIEVDUyB0YXNrcyB3aXRoIGNvbnRhaW5lciByZXN0YXJ0IHBvbGljaWVzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9jb250YWluZXItcmVzdGFydC1wb2xpY3kuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc3RhcnRQb2xpY3kge1xuLyoqXG4gKiBBIGxpc3Qgb2YgZXhpdCBjb2RlcyB0aGF0IEFtYXpvbiBFQ1Mgd2lsbCBpZ25vcmUgYW5kIG5vdCBhdHRlbXB0IGEgcmVzdGFydCBvbi4gWW91IGNhbiBzcGVjaWZ5IGEgbWF4aW11bSBvZiA1MCBjb250YWluZXIgZXhpdCBjb2Rlcy4gQnkgZGVmYXVsdCwgQW1hem9uIEVDUyBkb2VzIG5vdCBpZ25vcmUgYW55IGV4aXQgY29kZXMuXG4gKi9cbklnbm9yZWRFeGl0Q29kZXM/OiBudW1iZXJbXVxuLyoqXG4gKiBBIHBlcmlvZCBvZiB0aW1lIChpbiBzZWNvbmRzKSB0aGF0IHRoZSBjb250YWluZXIgbXVzdCBydW4gZm9yIGJlZm9yZSBhIHJlc3RhcnQgY2FuIGJlIGF0dGVtcHRlZC4gQSBjb250YWluZXIgY2FuIGJlIHJlc3RhcnRlZCBvbmx5IG9uY2UgZXZlcnkgYGByZXN0YXJ0QXR0ZW1wdFBlcmlvZGBgIHNlY29uZHMuIElmIGEgY29udGFpbmVyIGlzbid0IGFibGUgdG8gcnVuIGZvciB0aGlzIHRpbWUgcGVyaW9kIGFuZCBleGl0cyBlYXJseSwgaXQgd2lsbCBub3QgYmUgcmVzdGFydGVkLiBZb3UgY2FuIHNldCBhIG1pbmltdW0gYGByZXN0YXJ0QXR0ZW1wdFBlcmlvZGBgIG9mIDYwIHNlY29uZHMgYW5kIGEgbWF4aW11bSBgYHJlc3RhcnRBdHRlbXB0UGVyaW9kYGAgb2YgMTgwMCBzZWNvbmRzLiBCeSBkZWZhdWx0LCBhIGNvbnRhaW5lciBtdXN0IHJ1biBmb3IgMzAwIHNlY29uZHMgYmVmb3JlIGl0IGNhbiBiZSByZXN0YXJ0ZWQuXG4gKi9cblJlc3RhcnRBdHRlbXB0UGVyaW9kPzogbnVtYmVyXG4vKipcbiAqIFNwZWNpZmllcyB3aGV0aGVyIGEgcmVzdGFydCBwb2xpY3kgaXMgZW5hYmxlZCBmb3IgdGhlIGNvbnRhaW5lci5cbiAqL1xuRW5hYmxlZD86IGJvb2xlYW5cbn1cbi8qKlxuICogVGhlIGRldGFpbHMgZm9yIGEgdm9sdW1lIG1vdW50IHBvaW50IHRoYXQncyB1c2VkIGluIGEgY29udGFpbmVyIGRlZmluaXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW91bnRQb2ludCB7XG4vKipcbiAqIElmIHRoaXMgdmFsdWUgaXMgYGB0cnVlYGAsIHRoZSBjb250YWluZXIgaGFzIHJlYWQtb25seSBhY2Nlc3MgdG8gdGhlIHZvbHVtZS4gSWYgdGhpcyB2YWx1ZSBpcyBgYGZhbHNlYGAsIHRoZW4gdGhlIGNvbnRhaW5lciBjYW4gd3JpdGUgdG8gdGhlIHZvbHVtZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYGBmYWxzZWBgLlxuICovXG5SZWFkT25seT86IGJvb2xlYW5cbi8qKlxuICogVGhlIG5hbWUgb2YgdGhlIHZvbHVtZSB0byBtb3VudC4gTXVzdCBiZSBhIHZvbHVtZSBuYW1lIHJlZmVyZW5jZWQgaW4gdGhlIGBgbmFtZWBgIHBhcmFtZXRlciBvZiB0YXNrIGRlZmluaXRpb24gYGB2b2x1bWVgYC5cbiAqL1xuU291cmNlVm9sdW1lPzogc3RyaW5nXG4vKipcbiAqIFRoZSBwYXRoIG9uIHRoZSBjb250YWluZXIgdG8gbW91bnQgdGhlIGhvc3Qgdm9sdW1lIGF0LlxuICovXG5Db250YWluZXJQYXRoPzogc3RyaW5nXG59XG4vKipcbiAqIFRoZSBgYENvbnRhaW5lckRlcGVuZGVuY3lgYCBwcm9wZXJ0eSBzcGVjaWZpZXMgdGhlIGRlcGVuZGVuY2llcyBkZWZpbmVkIGZvciBjb250YWluZXIgc3RhcnR1cCBhbmQgc2h1dGRvd24uIEEgY29udGFpbmVyIGNhbiBjb250YWluIG11bHRpcGxlIGRlcGVuZGVuY2llcy4gV2hlbiBhIGRlcGVuZGVuY3kgaXMgZGVmaW5lZCBmb3IgY29udGFpbmVyIHN0YXJ0dXAsIGZvciBjb250YWluZXIgc2h1dGRvd24gaXQgaXMgcmV2ZXJzZWQuXG4gKiAgWW91ciBBbWF6b24gRUNTIGNvbnRhaW5lciBpbnN0YW5jZXMgcmVxdWlyZSBhdCBsZWFzdCB2ZXJzaW9uIDEuMjYuMCBvZiB0aGUgY29udGFpbmVyIGFnZW50IHRvIGVuYWJsZSBjb250YWluZXIgZGVwZW5kZW5jaWVzLiBIb3dldmVyLCB3ZSByZWNvbW1lbmQgdXNpbmcgdGhlIGxhdGVzdCBjb250YWluZXIgYWdlbnQgdmVyc2lvbi4gRm9yIGluZm9ybWF0aW9uIGFib3V0IGNoZWNraW5nIHlvdXIgYWdlbnQgdmVyc2lvbiBhbmQgdXBkYXRpbmcgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uLCBzZWUgW1VwZGF0aW5nIHRoZSBBbWF6b24gRUNTIENvbnRhaW5lciBBZ2VudF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvZWNzLWFnZW50LXVwZGF0ZS5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouIElmIHlvdSBhcmUgdXNpbmcgYW4gQW1hem9uIEVDUy1vcHRpbWl6ZWQgTGludXggQU1JLCB5b3VyIGluc3RhbmNlIG5lZWRzIGF0IGxlYXN0IHZlcnNpb24gMS4yNi4wLTEgb2YgdGhlIGBgZWNzLWluaXRgYCBwYWNrYWdlLiBJZiB5b3VyIGNvbnRhaW5lciBpbnN0YW5jZXMgYXJlIGxhdW5jaGVkIGZyb20gdmVyc2lvbiBgYDIwMTkwMzAxYGAgb3IgbGF0ZXIsIHRoZW4gdGhleSBjb250YWluIHRoZSByZXF1aXJlZCB2ZXJzaW9ucyBvZiB0aGUgY29udGFpbmVyIGFnZW50IGFuZCBgYGVjcy1pbml0YGAuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0FtYXpvbiBFQ1Mtb3B0aW1pemVkIExpbnV4IEFNSV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvZWNzLW9wdGltaXplZF9BTUkuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICogICBGb3IgdGFza3MgdXNpbmcgdGhlIEZhcmdhdGUgbGF1bmNoIHR5cGUsIHRoaXMgcGFyYW1ldGVyIHJlcXVpcmVzIHRoYXQgdGhlIHRhc2sgb3Igc2VydmljZSB1c2VzIHBsYXRmb3JtIHZlcnNpb24gMS4zLjAgb3IgbGF0ZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGFpbmVyRGVwZW5kZW5jeSB7XG4vKipcbiAqIFRoZSBkZXBlbmRlbmN5IGNvbmRpdGlvbiBvZiB0aGUgY29udGFpbmVyLiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgYXZhaWxhYmxlIGNvbmRpdGlvbnMgYW5kIHRoZWlyIGJlaGF2aW9yOlxuICogICArICBgYFNUQVJUYGAgLSBUaGlzIGNvbmRpdGlvbiBlbXVsYXRlcyB0aGUgYmVoYXZpb3Igb2YgbGlua3MgYW5kIHZvbHVtZXMgdG9kYXkuIEl0IHZhbGlkYXRlcyB0aGF0IGEgZGVwZW5kZW50IGNvbnRhaW5lciBpcyBzdGFydGVkIGJlZm9yZSBwZXJtaXR0aW5nIG90aGVyIGNvbnRhaW5lcnMgdG8gc3RhcnQuXG4gKiAgICsgIGBgQ09NUExFVEVgYCAtIFRoaXMgY29uZGl0aW9uIHZhbGlkYXRlcyB0aGF0IGEgZGVwZW5kZW50IGNvbnRhaW5lciBydW5zIHRvIGNvbXBsZXRpb24gKGV4aXRzKSBiZWZvcmUgcGVybWl0dGluZyBvdGhlciBjb250YWluZXJzIHRvIHN0YXJ0LiBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yIG5vbmVzc2VudGlhbCBjb250YWluZXJzIHRoYXQgcnVuIGEgc2NyaXB0IGFuZCB0aGVuIGV4aXQuIFRoaXMgY29uZGl0aW9uIGNhbid0IGJlIHNldCBvbiBhbiBlc3NlbnRpYWwgY29udGFpbmVyLlxuICogICArICBgYFNVQ0NFU1NgYCAtIFRoaXMgY29uZGl0aW9uIGlzIHRoZSBzYW1lIGFzIGBgQ09NUExFVEVgYCwgYnV0IGl0IGFsc28gcmVxdWlyZXMgdGhhdCB0aGUgY29udGFpbmVyIGV4aXRzIHdpdGggYSBgYHplcm9gYCBzdGF0dXMuIFRoaXMgY29uZGl0aW9uIGNhbid0IGJlIHNldCBvbiBhbiBlc3NlbnRpYWwgY29udGFpbmVyLlxuICogICArICBgYEhFQUxUSFlgYCAtIFRoaXMgY29uZGl0aW9uIHZhbGlkYXRlcyB0aGF0IHRoZSBkZXBlbmRlbnQgY29udGFpbmVyIHBhc3NlcyBpdHMgRG9ja2VyIGhlYWx0aCBjaGVjayBiZWZvcmUgcGVybWl0dGluZyBvdGhlciBjb250YWluZXJzIHRvIHN0YXJ0LiBUaGlzIHJlcXVpcmVzIHRoYXQgdGhlIGRlcGVuZGVudCBjb250YWluZXIgaGFzIGhlYWx0aCBjaGVja3MgY29uZmlndXJlZC4gVGhpcyBjb25kaXRpb24gaXMgY29uZmlybWVkIG9ubHkgYXQgdGFzayBzdGFydHVwLlxuICovXG5Db25kaXRpb24/OiBzdHJpbmdcbi8qKlxuICogVGhlIG5hbWUgb2YgYSBjb250YWluZXIuXG4gKi9cbkNvbnRhaW5lck5hbWU/OiBzdHJpbmdcbn1cbi8qKlxuICogVGhlIGBgUG9ydE1hcHBpbmdgYCBwcm9wZXJ0eSBzcGVjaWZpZXMgYSBwb3J0IG1hcHBpbmcuIFBvcnQgbWFwcGluZ3MgYWxsb3cgY29udGFpbmVycyB0byBhY2Nlc3MgcG9ydHMgb24gdGhlIGhvc3QgY29udGFpbmVyIGluc3RhbmNlIHRvIHNlbmQgb3IgcmVjZWl2ZSB0cmFmZmljLiBQb3J0IG1hcHBpbmdzIGFyZSBzcGVjaWZpZWQgYXMgcGFydCBvZiB0aGUgY29udGFpbmVyIGRlZmluaXRpb24uXG4gKiAgSWYgeW91IGFyZSB1c2luZyBjb250YWluZXJzIGluIGEgdGFzayB3aXRoIHRoZSBgYGF3c3ZwY2BgIG9yIGBgaG9zdGBgIG5ldHdvcmsgbW9kZSwgZXhwb3NlZCBwb3J0cyBzaG91bGQgYmUgc3BlY2lmaWVkIHVzaW5nIGBgY29udGFpbmVyUG9ydGBgLiBUaGUgYGBob3N0UG9ydGBgIGNhbiBiZSBsZWZ0IGJsYW5rIG9yIGl0IG11c3QgYmUgdGhlIHNhbWUgdmFsdWUgYXMgdGhlIGBgY29udGFpbmVyUG9ydGBgLlxuICogIEFmdGVyIGEgdGFzayByZWFjaGVzIHRoZSBgYFJVTk5JTkdgYCBzdGF0dXMsIG1hbnVhbCBhbmQgYXV0b21hdGljIGhvc3QgYW5kIGNvbnRhaW5lciBwb3J0IGFzc2lnbm1lbnRzIGFyZSB2aXNpYmxlIGluIHRoZSBgYG5ldHdvcmtCaW5kaW5nc2BgIHNlY3Rpb24gb2YgW0Rlc2NyaWJlVGFza3NdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVUYXNrcy5odG1sKSBBUEkgcmVzcG9uc2VzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBvcnRNYXBwaW5nIHtcbi8qKlxuICogVGhlIGFwcGxpY2F0aW9uIHByb3RvY29sIHRoYXQncyB1c2VkIGZvciB0aGUgcG9ydCBtYXBwaW5nLiBUaGlzIHBhcmFtZXRlciBvbmx5IGFwcGxpZXMgdG8gU2VydmljZSBDb25uZWN0LiBXZSByZWNvbW1lbmQgdGhhdCB5b3Ugc2V0IHRoaXMgcGFyYW1ldGVyIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgcHJvdG9jb2wgdGhhdCB5b3VyIGFwcGxpY2F0aW9uIHVzZXMuIElmIHlvdSBzZXQgdGhpcyBwYXJhbWV0ZXIsIEFtYXpvbiBFQ1MgYWRkcyBwcm90b2NvbC1zcGVjaWZpYyBjb25uZWN0aW9uIGhhbmRsaW5nIHRvIHRoZSBTZXJ2aWNlIENvbm5lY3QgcHJveHkuIElmIHlvdSBzZXQgdGhpcyBwYXJhbWV0ZXIsIEFtYXpvbiBFQ1MgYWRkcyBwcm90b2NvbC1zcGVjaWZpYyB0ZWxlbWV0cnkgaW4gdGhlIEFtYXpvbiBFQ1MgY29uc29sZSBhbmQgQ2xvdWRXYXRjaC5cbiAqICBJZiB5b3UgZG9uJ3Qgc2V0IGEgdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyLCB0aGVuIFRDUCBpcyB1c2VkLiBIb3dldmVyLCBBbWF6b24gRUNTIGRvZXNuJ3QgYWRkIHByb3RvY29sLXNwZWNpZmljIHRlbGVtZXRyeSBmb3IgVENQLlxuICogIGBgYXBwUHJvdG9jb2xgYCBpcyBpbW11dGFibGUgaW4gYSBTZXJ2aWNlIENvbm5lY3Qgc2VydmljZS4gVXBkYXRpbmcgdGhpcyBmaWVsZCByZXF1aXJlcyBhIHNlcnZpY2UgZGVsZXRpb24gYW5kIHJlZGVwbG95bWVudC5cbiAqICBUYXNrcyB0aGF0IHJ1biBpbiBhIG5hbWVzcGFjZSBjYW4gdXNlIHNob3J0IG5hbWVzIHRvIGNvbm5lY3QgdG8gc2VydmljZXMgaW4gdGhlIG5hbWVzcGFjZS4gVGFza3MgY2FuIGNvbm5lY3QgdG8gc2VydmljZXMgYWNyb3NzIGFsbCBvZiB0aGUgY2x1c3RlcnMgaW4gdGhlIG5hbWVzcGFjZS4gVGFza3MgY29ubmVjdCB0aHJvdWdoIGEgbWFuYWdlZCBwcm94eSBjb250YWluZXIgdGhhdCBjb2xsZWN0cyBsb2dzIGFuZCBtZXRyaWNzIGZvciBpbmNyZWFzZWQgdmlzaWJpbGl0eS4gT25seSB0aGUgdGFza3MgdGhhdCBBbWF6b24gRUNTIHNlcnZpY2VzIGNyZWF0ZSBhcmUgc3VwcG9ydGVkIHdpdGggU2VydmljZSBDb25uZWN0LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtTZXJ2aWNlIENvbm5lY3RdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3NlcnZpY2UtY29ubmVjdC5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKi9cbkFwcFByb3RvY29sPzogKFwiaHR0cFwiIHwgXCJodHRwMlwiIHwgXCJncnBjXCIpXG4vKipcbiAqIFRoZSBwb3J0IG51bWJlciByYW5nZSBvbiB0aGUgY29udGFpbmVyIHRoYXQncyBib3VuZCB0byB0aGUgZHluYW1pY2FsbHkgbWFwcGVkIGhvc3QgcG9ydCByYW5nZS4gXG4gKiAgVGhlIGZvbGxvd2luZyBydWxlcyBhcHBseSB3aGVuIHlvdSBzcGVjaWZ5IGEgYGBjb250YWluZXJQb3J0UmFuZ2VgYDpcbiAqICAgKyAgWW91IG11c3QgdXNlIGVpdGhlciB0aGUgYGBicmlkZ2VgYCBuZXR3b3JrIG1vZGUgb3IgdGhlIGBgYXdzdnBjYGAgbmV0d29yayBtb2RlLlxuICogICArICBUaGlzIHBhcmFtZXRlciBpcyBhdmFpbGFibGUgZm9yIGJvdGggdGhlIEVDMiBhbmQgRkFSR0FURWxvbmcgbGF1bmNoIHR5cGVzLlxuICogICArICBUaGlzIHBhcmFtZXRlciBpcyBhdmFpbGFibGUgZm9yIGJvdGggdGhlIExpbnV4IGFuZCBXaW5kb3dzIG9wZXJhdGluZyBzeXN0ZW1zLlxuICogICArICBUaGUgY29udGFpbmVyIGluc3RhbmNlIG11c3QgaGF2ZSBhdCBsZWFzdCB2ZXJzaW9uIDEuNjcuMCBvZiB0aGUgY29udGFpbmVyIGFnZW50IGFuZCBhdCBsZWFzdCB2ZXJzaW9uIDEuNjcuMC0xIG9mIHRoZSBgYGVjcy1pbml0YGAgcGFja2FnZSBcbiAqICAgKyAgWW91IGNhbiBzcGVjaWZ5IGEgbWF4aW11bSBvZiAxMDAgcG9ydCByYW5nZXMgcGVyIGNvbnRhaW5lci5cbiAqICAgKyAgWW91IGRvIG5vdCBzcGVjaWZ5IGEgYGBob3N0UG9ydFJhbmdlYGAuIFRoZSB2YWx1ZSBvZiB0aGUgYGBob3N0UG9ydFJhbmdlYGAgaXMgc2V0IGFzIGZvbGxvd3M6XG4gKiAgICsgIEZvciBjb250YWluZXJzIGluIGEgdGFzayB3aXRoIHRoZSBgYGF3c3ZwY2BgIG5ldHdvcmsgbW9kZSwgdGhlIGBgaG9zdFBvcnRSYW5nZWBgIGlzIHNldCB0byB0aGUgc2FtZSB2YWx1ZSBhcyB0aGUgYGBjb250YWluZXJQb3J0UmFuZ2VgYC4gVGhpcyBpcyBhIHN0YXRpYyBtYXBwaW5nIHN0cmF0ZWd5LlxuICogICArICBGb3IgY29udGFpbmVycyBpbiBhIHRhc2sgd2l0aCB0aGUgYGBicmlkZ2VgYCBuZXR3b3JrIG1vZGUsIHRoZSBBbWF6b24gRUNTIGFnZW50IGZpbmRzIG9wZW4gaG9zdCBwb3J0cyBmcm9tIHRoZSBkZWZhdWx0IGVwaGVtZXJhbCByYW5nZSBhbmQgcGFzc2VzIGl0IHRvIGRvY2tlciB0byBiaW5kIHRoZW0gdG8gdGhlIGNvbnRhaW5lciBwb3J0cy5cbiAqICAgXG4gKiAgICsgIFRoZSBgYGNvbnRhaW5lclBvcnRSYW5nZWBgIHZhbGlkIHZhbHVlcyBhcmUgYmV0d2VlbiAxIGFuZCA2NTUzNS5cbiAqICAgKyAgQSBwb3J0IGNhbiBvbmx5IGJlIGluY2x1ZGVkIGluIG9uZSBwb3J0IG1hcHBpbmcgcGVyIGNvbnRhaW5lci5cbiAqICAgKyAgWW91IGNhbm5vdCBzcGVjaWZ5IG92ZXJsYXBwaW5nIHBvcnQgcmFuZ2VzLlxuICogICArICBUaGUgZmlyc3QgcG9ydCBpbiB0aGUgcmFuZ2UgbXVzdCBiZSBsZXNzIHRoYW4gbGFzdCBwb3J0IGluIHRoZSByYW5nZS5cbiAqICAgKyAgRG9ja2VyIHJlY29tbWVuZHMgdGhhdCB5b3UgdHVybiBvZmYgdGhlIGRvY2tlci1wcm94eSBpbiB0aGUgRG9ja2VyIGRhZW1vbiBjb25maWcgZmlsZSB3aGVuIHlvdSBoYXZlIGEgbGFyZ2UgbnVtYmVyIG9mIHBvcnRzLlxuICogIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0lzc3VlICMxMTE4NV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2h0dHBzOi8vZ2l0aHViLmNvbS9tb2J5L21vYnkvaXNzdWVzLzExMTg1KSBvbiB0aGUgR2l0aHViIHdlYnNpdGUuXG4gKiAgRm9yIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0byB0dXJuIG9mZiB0aGUgZG9ja2VyLXByb3h5IGluIHRoZSBEb2NrZXIgZGFlbW9uIGNvbmZpZyBmaWxlLCBzZWUgW0RvY2tlciBkYWVtb25dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2Jvb3RzdHJhcF9jb250YWluZXJfaW5zdGFuY2UuaHRtbCNib290c3RyYXBfZG9ja2VyX2RhZW1vbikgaW4gdGhlICpBbWF6b24gRUNTIERldmVsb3BlciBHdWlkZSouXG4gKiAgIFxuICogIFlvdSBjYW4gY2FsbCBbRGVzY3JpYmVUYXNrc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZVRhc2tzLmh0bWwpIHRvIHZpZXcgdGhlIGBgaG9zdFBvcnRSYW5nZWBgIHdoaWNoIGFyZSB0aGUgaG9zdCBwb3J0cyB0aGF0IGFyZSBib3VuZCB0byB0aGUgY29udGFpbmVyIHBvcnRzLlxuICovXG5Db250YWluZXJQb3J0UmFuZ2U/OiBzdHJpbmdcbi8qKlxuICogVGhlIHBvcnQgbnVtYmVyIG9uIHRoZSBjb250YWluZXIgaW5zdGFuY2UgdG8gcmVzZXJ2ZSBmb3IgeW91ciBjb250YWluZXIuXG4gKiAgSWYgeW91IHNwZWNpZnkgYSBgYGNvbnRhaW5lclBvcnRSYW5nZWBgLCBsZWF2ZSB0aGlzIGZpZWxkIGVtcHR5IGFuZCB0aGUgdmFsdWUgb2YgdGhlIGBgaG9zdFBvcnRgYCBpcyBzZXQgYXMgZm9sbG93czpcbiAqICAgKyAgRm9yIGNvbnRhaW5lcnMgaW4gYSB0YXNrIHdpdGggdGhlIGBgYXdzdnBjYGAgbmV0d29yayBtb2RlLCB0aGUgYGBob3N0UG9ydGBgIGlzIHNldCB0byB0aGUgc2FtZSB2YWx1ZSBhcyB0aGUgYGBjb250YWluZXJQb3J0YGAuIFRoaXMgaXMgYSBzdGF0aWMgbWFwcGluZyBzdHJhdGVneS5cbiAqICAgKyAgRm9yIGNvbnRhaW5lcnMgaW4gYSB0YXNrIHdpdGggdGhlIGBgYnJpZGdlYGAgbmV0d29yayBtb2RlLCB0aGUgQW1hem9uIEVDUyBhZ2VudCBmaW5kcyBvcGVuIHBvcnRzIG9uIHRoZSBob3N0IGFuZCBhdXRvbWF0aWNhbGx5IGJpbmRzIHRoZW0gdG8gdGhlIGNvbnRhaW5lciBwb3J0cy4gVGhpcyBpcyBhIGR5bmFtaWMgbWFwcGluZyBzdHJhdGVneS5cbiAqICAgXG4gKiAgSWYgeW91IHVzZSBjb250YWluZXJzIGluIGEgdGFzayB3aXRoIHRoZSBgYGF3c3ZwY2BgIG9yIGBgaG9zdGBgIG5ldHdvcmsgbW9kZSwgdGhlIGBgaG9zdFBvcnRgYCBjYW4gZWl0aGVyIGJlIGxlZnQgYmxhbmsgb3Igc2V0IHRvIHRoZSBzYW1lIHZhbHVlIGFzIHRoZSBgYGNvbnRhaW5lclBvcnRgYC5cbiAqICBJZiB5b3UgdXNlIGNvbnRhaW5lcnMgaW4gYSB0YXNrIHdpdGggdGhlIGBgYnJpZGdlYGAgbmV0d29yayBtb2RlLCB5b3UgY2FuIHNwZWNpZnkgYSBub24tcmVzZXJ2ZWQgaG9zdCBwb3J0IGZvciB5b3VyIGNvbnRhaW5lciBwb3J0IG1hcHBpbmcsIG9yIHlvdSBjYW4gb21pdCB0aGUgYGBob3N0UG9ydGBgIChvciBzZXQgaXQgdG8gYGAwYGApIHdoaWxlIHNwZWNpZnlpbmcgYSBgYGNvbnRhaW5lclBvcnRgYCBhbmQgeW91ciBjb250YWluZXIgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIHBvcnQgaW4gdGhlIGVwaGVtZXJhbCBwb3J0IHJhbmdlIGZvciB5b3VyIGNvbnRhaW5lciBpbnN0YW5jZSBvcGVyYXRpbmcgc3lzdGVtIGFuZCBEb2NrZXIgdmVyc2lvbi5cbiAqICBUaGUgZGVmYXVsdCBlcGhlbWVyYWwgcG9ydCByYW5nZSBmb3IgRG9ja2VyIHZlcnNpb24gMS42LjAgYW5kIGxhdGVyIGlzIGxpc3RlZCBvbiB0aGUgaW5zdGFuY2UgdW5kZXIgYGAvcHJvYy9zeXMvbmV0L2lwdjQvaXBfbG9jYWxfcG9ydF9yYW5nZWBgLiBJZiB0aGlzIGtlcm5lbCBwYXJhbWV0ZXIgaXMgdW5hdmFpbGFibGUsIHRoZSBkZWZhdWx0IGVwaGVtZXJhbCBwb3J0IHJhbmdlIGZyb20gNDkxNTMgdGhyb3VnaCA2NTUzNSAoTGludXgpIG9yIDQ5MTUyIHRocm91Z2ggNjU1MzUgKFdpbmRvd3MpIGlzIHVzZWQuIERvIG5vdCBhdHRlbXB0IHRvIHNwZWNpZnkgYSBob3N0IHBvcnQgaW4gdGhlIGVwaGVtZXJhbCBwb3J0IHJhbmdlIGFzIHRoZXNlIGFyZSByZXNlcnZlZCBmb3IgYXV0b21hdGljIGFzc2lnbm1lbnQuIEluIGdlbmVyYWwsIHBvcnRzIGJlbG93IDMyNzY4IGFyZSBvdXRzaWRlIG9mIHRoZSBlcGhlbWVyYWwgcG9ydCByYW5nZS5cbiAqICBUaGUgZGVmYXVsdCByZXNlcnZlZCBwb3J0cyBhcmUgMjIgZm9yIFNTSCwgdGhlIERvY2tlciBwb3J0cyAyMzc1IGFuZCAyMzc2LCBhbmQgdGhlIEFtYXpvbiBFQ1MgY29udGFpbmVyIGFnZW50IHBvcnRzIDUxNjc4LTUxNjgwLiBBbnkgaG9zdCBwb3J0IHRoYXQgd2FzIHByZXZpb3VzbHkgc3BlY2lmaWVkIGluIGEgcnVubmluZyB0YXNrIGlzIGFsc28gcmVzZXJ2ZWQgd2hpbGUgdGhlIHRhc2sgaXMgcnVubmluZy4gVGhhdCBpcywgYWZ0ZXIgYSB0YXNrIHN0b3BzLCB0aGUgaG9zdCBwb3J0IGlzIHJlbGVhc2VkLiBUaGUgY3VycmVudCByZXNlcnZlZCBwb3J0cyBhcmUgZGlzcGxheWVkIGluIHRoZSBgYHJlbWFpbmluZ1Jlc291cmNlc2BgIG9mIFtEZXNjcmliZUNvbnRhaW5lckluc3RhbmNlc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZUNvbnRhaW5lckluc3RhbmNlcy5odG1sKSBvdXRwdXQuIEEgY29udGFpbmVyIGluc3RhbmNlIGNhbiBoYXZlIHVwIHRvIDEwMCByZXNlcnZlZCBwb3J0cyBhdCBhIHRpbWUuIFRoaXMgbnVtYmVyIGluY2x1ZGVzIHRoZSBkZWZhdWx0IHJlc2VydmVkIHBvcnRzLiBBdXRvbWF0aWNhbGx5IGFzc2lnbmVkIHBvcnRzIGFyZW4ndCBpbmNsdWRlZCBpbiB0aGUgMTAwIHJlc2VydmVkIHBvcnRzIHF1b3RhLlxuICovXG5Ib3N0UG9ydD86IG51bWJlclxuLyoqXG4gKiBUaGUgcG9ydCBudW1iZXIgb24gdGhlIGNvbnRhaW5lciB0aGF0J3MgYm91bmQgdG8gdGhlIHVzZXItc3BlY2lmaWVkIG9yIGF1dG9tYXRpY2FsbHkgYXNzaWduZWQgaG9zdCBwb3J0LlxuICogIElmIHlvdSB1c2UgY29udGFpbmVycyBpbiBhIHRhc2sgd2l0aCB0aGUgYGBhd3N2cGNgYCBvciBgYGhvc3RgYCBuZXR3b3JrIG1vZGUsIHNwZWNpZnkgdGhlIGV4cG9zZWQgcG9ydHMgdXNpbmcgYGBjb250YWluZXJQb3J0YGAuXG4gKiAgSWYgeW91IHVzZSBjb250YWluZXJzIGluIGEgdGFzayB3aXRoIHRoZSBgYGJyaWRnZWBgIG5ldHdvcmsgbW9kZSBhbmQgeW91IHNwZWNpZnkgYSBjb250YWluZXIgcG9ydCBhbmQgbm90IGEgaG9zdCBwb3J0LCB5b3VyIGNvbnRhaW5lciBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgaG9zdCBwb3J0IGluIHRoZSBlcGhlbWVyYWwgcG9ydCByYW5nZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBgYGhvc3RQb3J0YGAuIFBvcnQgbWFwcGluZ3MgdGhhdCBhcmUgYXV0b21hdGljYWxseSBhc3NpZ25lZCBpbiB0aGlzIHdheSBkbyBub3QgY291bnQgdG93YXJkIHRoZSAxMDAgcmVzZXJ2ZWQgcG9ydHMgbGltaXQgb2YgYSBjb250YWluZXIgaW5zdGFuY2UuXG4gKi9cbkNvbnRhaW5lclBvcnQ/OiBudW1iZXJcbi8qKlxuICogVGhlIHByb3RvY29sIHVzZWQgZm9yIHRoZSBwb3J0IG1hcHBpbmcuIFZhbGlkIHZhbHVlcyBhcmUgYGB0Y3BgYCBhbmQgYGB1ZHBgYC4gVGhlIGRlZmF1bHQgaXMgYGB0Y3BgYC4gYGBwcm90b2NvbGBgIGlzIGltbXV0YWJsZSBpbiBhIFNlcnZpY2UgQ29ubmVjdCBzZXJ2aWNlLiBVcGRhdGluZyB0aGlzIGZpZWxkIHJlcXVpcmVzIGEgc2VydmljZSBkZWxldGlvbiBhbmQgcmVkZXBsb3ltZW50LlxuICovXG5Qcm90b2NvbD86IHN0cmluZ1xuLyoqXG4gKiBUaGUgbmFtZSB0aGF0J3MgdXNlZCBmb3IgdGhlIHBvcnQgbWFwcGluZy4gVGhpcyBwYXJhbWV0ZXIgaXMgdGhlIG5hbWUgdGhhdCB5b3UgdXNlIGluIHRoZSBgYHNlcnZpY2VDb25uZWN0Q29uZmlndXJhdGlvbmBgIGFuZCB0aGUgYGB2cGNMYXR0aWNlQ29uZmlndXJhdGlvbnNgYCBvZiBhIHNlcnZpY2UuIFRoZSBuYW1lIGNhbiBpbmNsdWRlIHVwIHRvIDY0IGNoYXJhY3RlcnMuIFRoZSBjaGFyYWN0ZXJzIGNhbiBpbmNsdWRlIGxvd2VyY2FzZSBsZXR0ZXJzLCBudW1iZXJzLCB1bmRlcnNjb3JlcyAoXyksIGFuZCBoeXBoZW5zICgtKS4gVGhlIG5hbWUgY2FuJ3Qgc3RhcnQgd2l0aCBhIGh5cGhlbi5cbiAqL1xuTmFtZT86IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgZXBoZW1lcmFsIHN0b3JhZ2Ugc2V0dGluZ3MgdG8gdXNlIGZvciB0YXNrcyBydW4gd2l0aCB0aGUgdGFzayBkZWZpbml0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVwaGVtZXJhbFN0b3JhZ2Uge1xuLyoqXG4gKiBUaGUgdG90YWwgYW1vdW50LCBpbiBHaUIsIG9mIGVwaGVtZXJhbCBzdG9yYWdlIHRvIHNldCBmb3IgdGhlIHRhc2suIFRoZSBtaW5pbXVtIHN1cHBvcnRlZCB2YWx1ZSBpcyBgYDIxYGAgR2lCIGFuZCB0aGUgbWF4aW11bSBzdXBwb3J0ZWQgdmFsdWUgaXMgYGAyMDBgYCBHaUIuXG4gKi9cblNpemVJbkdpQj86IG51bWJlclxufVxuLyoqXG4gKiBUaGUgbWV0YWRhdGEgdGhhdCB5b3UgYXBwbHkgdG8gYSByZXNvdXJjZSB0byBoZWxwIHlvdSBjYXRlZ29yaXplIGFuZCBvcmdhbml6ZSB0aGVtLiBFYWNoIHRhZyBjb25zaXN0cyBvZiBhIGtleSBhbmQgYW4gb3B0aW9uYWwgdmFsdWUuIFlvdSBkZWZpbmUgdGhlbS5cbiAqICBUaGUgZm9sbG93aW5nIGJhc2ljIHJlc3RyaWN0aW9ucyBhcHBseSB0byB0YWdzOlxuICogICArICBNYXhpbXVtIG51bWJlciBvZiB0YWdzIHBlciByZXNvdXJjZSAtIDUwXG4gKiAgICsgIEZvciBlYWNoIHJlc291cmNlLCBlYWNoIHRhZyBrZXkgbXVzdCBiZSB1bmlxdWUsIGFuZCBlYWNoIHRhZyBrZXkgY2FuIGhhdmUgb25seSBvbmUgdmFsdWUuXG4gKiAgICsgIE1heGltdW0ga2V5IGxlbmd0aCAtIDEyOCBVbmljb2RlIGNoYXJhY3RlcnMgaW4gVVRGLThcbiAqICAgKyAgTWF4aW11bSB2YWx1ZSBsZW5ndGggLSAyNTYgVW5pY29kZSBjaGFyYWN0ZXJzIGluIFVURi04XG4gKiAgICsgIElmIHlvdXIgdGFnZ2luZyBzY2hlbWEgaXMgdXNlZCBhY3Jvc3MgbXVsdGlwbGUgc2VydmljZXMgYW5kIHJlc291cmNlcywgcmVtZW1iZXIgdGhhdCBvdGhlciBzZXJ2aWNlcyBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gYWxsb3dlZCBjaGFyYWN0ZXJzLiBHZW5lcmFsbHkgYWxsb3dlZCBjaGFyYWN0ZXJzIGFyZTogbGV0dGVycywgbnVtYmVycywgYW5kIHNwYWNlcyByZXByZXNlbnRhYmxlIGluIFVURi04LCBhbmQgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzOiArIC0gPSAuIF8gOiAvIEAuXG4gKiAgICsgIFRhZyBrZXlzIGFuZCB2YWx1ZXMgYXJlIGNhc2Utc2Vuc2l0aXZlLlxuICogICArICBEbyBub3QgdXNlIGBgYXdzOmBgLCBgYEFXUzpgYCwgb3IgYW55IHVwcGVyIG9yIGxvd2VyY2FzZSBjb21iaW5hdGlvbiBvZiBzdWNoIGFzIGEgcHJlZml4IGZvciBlaXRoZXIga2V5cyBvciB2YWx1ZXMgYXMgaXQgaXMgcmVzZXJ2ZWQgZm9yIEFXUyB1c2UuIFlvdSBjYW5ub3QgZWRpdCBvciBkZWxldGUgdGFnIGtleXMgb3IgdmFsdWVzIHdpdGggdGhpcyBwcmVmaXguIFRhZ3Mgd2l0aCB0aGlzIHByZWZpeCBkbyBub3QgY291bnQgYWdhaW5zdCB5b3VyIHRhZ3MgcGVyIHJlc291cmNlIGxpbWl0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRhZyB7XG4vKipcbiAqIFRoZSBvcHRpb25hbCBwYXJ0IG9mIGEga2V5LXZhbHVlIHBhaXIgdGhhdCBtYWtlIHVwIGEgdGFnLiBBIGBgdmFsdWVgYCBhY3RzIGFzIGEgZGVzY3JpcHRvciB3aXRoaW4gYSB0YWcgY2F0ZWdvcnkgKGtleSkuXG4gKi9cblZhbHVlPzogc3RyaW5nXG4vKipcbiAqIE9uZSBwYXJ0IG9mIGEga2V5LXZhbHVlIHBhaXIgdGhhdCBtYWtlIHVwIGEgdGFnLiBBIGBga2V5YGAgaXMgYSBnZW5lcmFsIGxhYmVsIHRoYXQgYWN0cyBsaWtlIGEgY2F0ZWdvcnkgZm9yIG1vcmUgc3BlY2lmaWMgdGFnIHZhbHVlcy5cbiAqL1xuS2V5Pzogc3RyaW5nXG59XG4iXX0=
|