This is an automated email from the ASF dual-hosted git repository.
joewitt pushed a change to branch support/nifi-1.11.x
in repository https://gitbox.apache.org/repos/asf/nifi.git.
from b5ff8f3 NIFI-7181 update docker versions for next rel
new 1fed416 NIFI-7178 - Handle the case when schema is not available
new d17a5aa NIFI-7185 relaxed timing constrained for builds on lower
resources environments like our Github CI builds
new fa0632b NIFI-7183 - This closes #4073. Improve ReplaceText when
removing FF's content
new 98e4246 NIFI-7164 Upgrade shyiko/mysql-binlog-connector-java
dependency
new 211b0e8 NIFI-7201 - Update build to latest apache-maven-parent and
split Github Actions builds to include OSX and distribute localization
new 024d727 NIFI-7205 NIFI-7206
new 1d10b51 NIFI-6856 - Make client ID a non-required field for the
MQTTConsume and MQTTProduce processors. Generates a random ID if not set.
new 91f3eb0 NIFI-5644 Fixed typo in getWrappedQuery method of
AbstractDatabaseFetchProcessor class
new 089ca02 NIFI-7218 Fixed typo in Overview docs. (#4107)
new 3106604 NIFI-7121 Updated comment to state a 'static' salt is used in
the constructor. (#4098)
new 1f41c21 NIFI-4970 - EOF Exception in InvokeHttp when body's response
is empty with gzip
new e1c2656 NIFI-7208: Fixed PutSQL/JdbcCommon handling of timestamps
(nanoseconds, e.g.)
new 65ffd45 NIFI-7227 Fixed typo in Global Access Policy table (#4112)
new 4c78d1e NIFI-7222 Cleaned up API for FTP/SFTP remote file retrieval
and ensure we close remote file resources for SFTP pulls in particular
new ad892a4 NIFI-7226: Add Connection Factory configuration properties to
PublishJMS and ConsumeJMS processors
new 5c3f983 NIFI-7232 if users do not supply a remote path PutSFTP with
conflict resolution will fail with an NPE
new 38124f2 Fixed unit test failed with NIFI-7232
new 20c086c NIFI-7191 Conditionally disable docker integration tests
new ca27a6c NIFI-7231: move controller service validation out of
synchronized block for enabling
new c82c1db NIFI-7197 - In-place replacement in LookupRecord processor
new b7cbd23 NIFI-7224 Protecting against possible NPE in
ImportFlowVersion command in CLI
new f1d1c0f NIFI-7195 - Catch MongoException to route flow files to
failure
new ae8e752 Fiz writeBatch to avoid cycle in provenance graph
new a655be9 NIFI-7210 - added PG path in bulletins for S2S Bulletin RT
new 6f5bd17 NIFI-7200: Revert "NIFI-6530 - HTTP SiteToSite server returns
201 in case no data is available"
new aa2f561 NIFI-4970 - Add a property to deal with empty GZIP HTTP
response
new 716e32e NIFI-7239: Upgrade the Hive 3 bundle to use Apache Hive 3.1.2
new 4412460 NIFI-7050 ConsumeJMS is not yielded in case of exception
new 833eea4 NIFI-7245: JMS processors yield when connection factory
initialisation failed
new 450bcd0 unit test reproducing the issue
new 7839493 Fixed bug in JsonRowRecordReader when reading a 'raw' record
with a schema that indicates that a field should be a Map. Also updated unit
test to explicitly define schema, since schema inference will never return a
Map but rather a Record
new 6a3f6f6 NIFI-7242: When a Parameter is changed, any property
referencing that parameter should have its #onPropertyModified method called.
Also renamed Accumulo tests to integration tests because they start embedded
servers and connect to them, which caused failures in my environment. Also
fixed a bug in TestLengthDelimitedJournal because it was resulting in failures
when building locally as well.
new 950873c NIFI-7119 Implement boundary checking for Argon2 cost
parameters (#4111)
new eeb7d69 NIFI-7241: When updating Process Group to match
VersionedProcessGroup, remove any connections before recursing into child
groups. This ensures that if a Port exists in child group A and is connected to
a port in child group B, if the VersionedProcessGroup indicates to remove the
port, that connection will be removed before attempting to remove the port.
Updating and adding connections must still be done last, after all components
have been added. But missing connections [...]
new c44204d NIFI-7248: Atlas reporting task handles PutHive3Streaming
new 0d5cd83 NIFI-7244 Updated all tests which dont run well on windows to
either work or be ignored on windows Also dealt with unreliable tests which
depend on timing by ignoring them or converting to IT.
new 85efc09 NIFI-6742 Use JUnit TemporaryFolder when creating test
databases
new 42b453c NIFI-7251: Upgrade hadoop-client version to 3.2.1 to avoid
the regression bug
new 1f2b68c NIFI-7229 - Upgrade jackson-databind direct dependencies
new 76c5335 NIFI-7249: Force String keys in maps in
DataTypeUtils.inferDataType()
new 24ece00 NIFI-7250 activate user.timezone appropriate to each region
NIFI-7250 fix a test which appears brittle at least on windows builds on slow
environments NIFI-7250 activated a timezone run for AU Australia/Melbourne
which exposed a poor magic number and needless assertion but interesting
results worth keeping
new c3457da NIFI-7256: This closes #4142. Fixed thresholds in unit test.
Instead of assuming that multiple runs of the processor will occur within 100
milliseconds, allowed the multiple runs to occur within 3 mins of one another.
new d6655bd NIFI-7208: Restore default timezone in JdbcCommon
new 67db741 NIFI-7223 - Fixed a minor issue where the
OkHttpReplicationClient class loaded blank properties as empty string instead
of an expected null value. Added a isNotBlank check. Added unit tests for
replication client and HTTPNotificationService. NIFI-7223 - Renamed some
variables and methods. NIFI-7223 - Removed unused dependency. Corrected
security properties in administration-guide.
new 554a637b NIFI-7223 [WIP] Resolved compilation issues in unit test on
OpenJDK 11 by removing Sun security class references. Added
OkHttpReplicationClient#isTLSConfigured() method. Added unit test. NIFI-7223
Fixed remaining unit tests for TLS regression. Renamed tests for clarity.
new bdef4b4 NIFI-7223 - Added another test for when keyPasswd is not
present.
new 4e4fa38 NIFI-7223 Resolved merge conflicts from additional test case
for null key password.
The 47 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
.github/workflows/ci-workflow.yml | 157 +++++++++--
.../java/org/apache/nifi/reporting/Bulletin.java | 9 +
nifi-bootstrap/pom.xml | 5 +
.../http/TestHttpNotificationServiceSSL.java | 190 ++++++++++++-
.../attribute/expression/language/TestQuery.java | 5 +
.../language/TestStandardPreparedQuery.java | 5 +
.../org/apache/nifi/parameter/ParameterLookup.java | 14 +
.../serialization/record/util/DataTypeUtils.java | 18 +-
.../serialization/record/TestDataTypeUtils.java | 31 +++
nifi-commons/nifi-rocksdb-utils/pom.xml | 6 +
.../apache/nifi/rocksdb/TestRocksDBMetronome.java | 14 +-
nifi-commons/nifi-security-utils/pom.xml | 4 -
.../security/util/crypto/Argon2SecureHasher.java | 140 +++++++++-
.../util/crypto/Argon2SecureHasherTest.groovy | 156 +++++++++++
.../apache/nifi/remote/client/PeerSelector.java | 22 +-
.../apache/nifi/remote/client/http/HttpClient.java | 22 +-
.../http/TransportProtocolVersionNegotiator.java | 1 -
.../client/socket/EndpointConnectionPool.java | 19 +-
.../nifi/remote/client/socket/SocketClient.java | 6 +-
.../nifi/remote/exception/NoContentException.java | 39 ---
.../remote/exception/NoValidPeerException.java | 40 ---
.../protocol/socket/SocketClientTransaction.java | 4 -
.../nifi/remote/util/SiteToSiteRestApiClient.java | 6 +-
.../nifi/remote/client/TestPeerSelector.java | 31 +--
.../nifi/remote/client/http/TestHttpClient.java | 63 +----
.../socket/TestSocketClientTransaction.java | 17 +-
.../nifi/wali/TestLengthDelimitedJournal.java | 13 +-
nifi-docker/dockerhub/pom.xml | 45 +++
nifi-docker/dockermaven/pom.xml | 45 +++
.../src/main/asciidoc/administration-guide.adoc | 7 +-
nifi-docs/src/main/asciidoc/overview.adoc | 2 +-
.../java/org/apache/nifi/spark/NiFiReceiver.java | 7 -
.../org/apache/nifi/reporting/BulletinFactory.java | 15 +
.../{TestPutRecord.java => PutRecordIT.java} | 5 +-
.../{TestScanAccumulo.java => ScanAccumuloIT.java} | 5 +-
.../provenance/analyzer/PutHiveStreaming.java | 5 +-
.../provenance/analyzer/TestPutHiveStreaming.java | 12 +-
.../nifi-cdc-mysql-processors/pom.xml | 2 +-
.../nifi-elasticsearch-client-service/pom.xml | 1 -
.../java/org/apache/nifi/util/db/JdbcCommon.java | 13 +-
.../org/apache/nifi/avro/TestAvroTypeUtil.java | 51 ++++
.../nifi/authorization/FileAuthorizerTest.java | 8 +
...ncryptedRepositoryRecordSerdeFactoryTest.groovy | 4 +-
...EncryptedSchemaRepositoryRecordSerdeTest.groovy | 3 +
.../protocol/impl/SocketProtocolListenerTest.java | 2 +
.../okhttp/OkHttpReplicationClient.java | 29 +-
.../okhttp/OkHttpReplicationClientTest.groovy | 141 ++++++++++
.../heartbeat/TestAbstractHeartbeatMonitor.java | 2 +
.../src/test/resources/conf}/keystore.jks | Bin
.../src/test/resources/conf}/truststore.jks | Bin
.../components/validation/ValidationState.java | 4 +
.../nifi/controller/AbstractComponentNode.java | 103 ++++++-
.../org/apache/nifi/controller/ComponentNode.java | 7 +
.../nifi/controller/PropertyConfiguration.java | 26 +-
.../org/apache/nifi/events/BulletinFactory.java | 32 ++-
.../java/org/apache/nifi/groups/ProcessGroup.java | 5 +-
.../apache/nifi/parameter/ParameterContext.java | 9 +-
.../org/apache/nifi/parameter/ParameterUpdate.java | 19 +-
.../nifi/controller/TestAbstractComponentNode.java | 123 ++++++++-
.../controller/service/ServiceStateTransition.java | 16 --
.../service/StandardControllerServiceNode.java | 9 +-
.../apache/nifi/groups/StandardProcessGroup.java | 128 +++++++--
.../nifi/parameter/StandardParameterContext.java | 23 +-
.../nifi/parameter/StandardParameterUpdate.java | 83 ++++++
.../EncryptedFileSystemRepositoryTest.groovy | 3 +
...cryptedSequentialAccessWriteAheadLogTest.groovy | 3 +
.../repository/TestFileSystemRepository.java | 11 +-
.../repository/TestRocksDBFlowFileRepository.java | 14 +-
.../controller/service/mock/MockProcessGroup.java | 3 +-
.../zookeeper/TestZooKeeperStateProvider.java | 10 +-
.../nifi-framework-nar-loading-utils/pom.xml | 6 +
.../org/apache/nifi/nar/AbstractTestNarLoader.java | 8 +
.../java/org/apache/nifi/nar/TestNarLoader.java | 8 +
.../AESSensitivePropertyProviderFactoryTest.groovy | 3 +
.../NiFiPropertiesLoaderGroovyTest.groovy | 3 +
.../ProtectedNiFiPropertiesGroovyTest.groovy | 3 +
.../nifi/remote/StandardRemoteGroupPort.java | 13 +-
.../nifi-framework/nifi-stateless/pom.xml | 1 -
.../stateless/core/StatelessRemoteOutputPort.java | 8 +-
.../apache/nifi/web/api/DataTransferResource.java | 19 +-
.../nifi/web/security/knox/KnoxServiceTest.java | 8 +
.../groovyx/ExecuteGroovyScriptTest.java | 3 +
.../apache/nifi/processors/hadoop/GetHDFSTest.java | 8 +
.../nifi/processors/hadoop/MoveHDFSTest.java | 8 +
.../processors/hive/TestPutHive3Streaming.java | 8 +
.../org/apache/nifi/processors/orc/PutORCTest.java | 5 +-
nifi-nar-bundles/nifi-hive-bundle/pom.xml | 2 +-
...ion.java => IJMSConnectionFactoryProvider.java} | 7 +-
.../cf/JMSConnectionFactoryProviderDefinition.java | 25 +-
.../nifi/jms/cf/JMSConnectionFactoryHandler.java | 248 +++++++++++++++++
.../jms/cf/JMSConnectionFactoryProperties.java | 113 ++++++++
.../nifi/jms/cf/JMSConnectionFactoryProvider.java | 307 ++-------------------
.../jms/cf/JndiJmsConnectionFactoryHandler.java | 154 +++++++++++
.../jms/cf/JndiJmsConnectionFactoryProperties.java | 114 ++++++++
.../jms/cf/JndiJmsConnectionFactoryProvider.java | 191 ++-----------
.../nifi/jms/processors/AbstractJMSProcessor.java | 221 +++++++++++----
.../org/apache/nifi/jms/processors/ConsumeJMS.java | 34 ++-
.../org/apache/nifi/jms/processors/PublishJMS.java | 65 +++++
.../additionalDetails.html | 19 +-
.../additionalDetails.html | 23 +-
.../additionalDetails.html | 25 +-
.../additionalDetails.html | 25 +-
...ava => JMSConnectionFactoryHandlerForTest.java} | 23 +-
.../cf/JMSConnectionFactoryProviderForTest.java | 20 +-
.../jms/cf/JMSConnectionFactoryProviderTest.java | 201 +++++++-------
.../jms/processors/ConnectionFactoryConfigIT.java | 176 ++++++++++++
.../ConnectionFactoryConfigValidatorTest.java | 145 ++++++++++
.../apache/nifi/jms/processors/ConsumeJMSIT.java | 51 ++++
.../apache/nifi/jms/processors/PublishJMSIT.java | 25 ++
.../jolt/record/TestJoltTransformRecord.java | 9 +
.../nifi-kite-bundle/nifi-kite-processors/pom.xml | 2 +-
.../processors/kite/TestCSVToAvroProcessor.java | 7 +
.../processors/kite/TestConfigurationProperty.java | 8 +
.../nifi/processors/kite/TestInferAvroSchema.java | 8 +
.../processors/mongodb/AbstractMongoProcessor.java | 4 +-
.../nifi/processors/mongodb/PutMongoRecord.java | 3 +-
.../apache/nifi/processors/mqtt/ConsumeMQTT.java | 22 +-
.../mqtt/common/AbstractMQTTProcessor.java | 13 +-
.../nifi/processors/mqtt/TestPublishMQTT.java | 1 -
.../org/apache/nifi/parquet/TestParquetReader.java | 8 +
.../nifi/processors/parquet/FetchParquetTest.java | 8 +
.../nifi/processors/parquet/PutParquetTest.java | 5 +-
.../poi/ConvertExcelToCSVProcessorTest.java | 8 +
.../index/lucene/TestLuceneEventIndex.java | 26 +-
.../reporting/SiteToSiteBulletinReportingTask.java | 1 +
.../additionalDetails.html | 1 +
.../src/main/resources/schema-bulletins.avsc | 1 +
.../TestSiteToSiteBulletinReportingTask.java | 5 +-
.../TestSiteToSiteMetricsReportingTask.java | 8 +
.../sql/bulletins/BulletinEnumerator.java | 1 +
.../reporting/sql/bulletins/BulletinTable.java | 2 +
.../additionalDetails.html | 1 +
.../nifi-standard-processors/pom.xml | 4 +
.../standard/AbstractDatabaseFetchProcessor.java | 4 +-
.../processors/standard/FetchFileTransfer.java | 18 +-
.../nifi/processors/standard/GetFileTransfer.java | 10 +-
.../nifi/processors/standard/InvokeHTTP.java | 16 +-
.../nifi/processors/standard/LookupRecord.java | 126 +++++++--
.../nifi/processors/standard/PutFileTransfer.java | 5 +-
.../nifi/processors/standard/ReplaceText.java | 37 ++-
.../nifi/processors/standard/util/FTPTransfer.java | 62 +++--
.../processors/standard/util/FileTransfer.java | 10 +-
.../processors/standard/util/SFTPTransfer.java | 58 ++--
.../additionalDetails.html | 215 +++++++++++++++
.../processors/standard/TestConvertRecord.java | 9 +
.../processors/standard/TestEncryptContent.java | 7 +
.../standard/TestExecuteStreamCommand.java | 3 +
.../nifi/processors/standard/TestFetchFile.java | 8 +
.../processors/standard/TestFetchFileTransfer.java | 31 +--
.../nifi/processors/standard/TestForkRecord.java | 9 +
.../nifi/processors/standard/TestInvokeHTTP.java | 46 ++-
.../processors/standard/TestInvokeHttpSSL.java | 8 +-
.../standard/TestInvokeHttpTwoWaySSL.java | 3 +
.../nifi/processors/standard/TestListFile.java | 8 +
.../nifi/processors/standard/TestListenHTTP.java | 10 +-
.../nifi/processors/standard/TestListenSyslog.java | 9 +
.../nifi/processors/standard/TestLookupRecord.java | 89 ++++++
.../processors/standard/TestMonitorActivity.java | 61 ++--
.../nifi/processors/standard/TestPutFile.java | 8 +
.../nifi/processors/standard/TestPutSQL.java | 26 +-
.../nifi/processors/standard/TestUpdateRecord.java | 9 +
.../processors/standard/TestValidateRecord.java | 47 ++++
.../relp/handler/TestRELPSocketChannelHandler.java | 4 +-
.../util/ITestSFTPTransferWithSSHTestServer.java | 23 --
.../standard/util/TestInvokeHttpCommon.java | 1 -
.../processors/standard/util/TestPutTCPCommon.java | 8 +
.../util/crypto/OpenPGPKeyBasedEncryptorTest.java | 3 +
.../crypto/OpenPGPPasswordBasedEncryptorTest.java | 3 +
.../TestLookupRecord/lookup-array-input.json | 29 ++
.../TestLookupRecord/lookup-array-output.json | 1 +
.../TestValidateRecord/int-maps-data.json | 27 ++
.../TestValidateRecord/int-maps-schema.avsc | 44 +++
.../java/org/apache/nifi/dbcp/DBCPServiceTest.java | 88 ++----
.../nifi/json/AbstractJsonRowRecordReader.java | 24 +-
.../apache/nifi/json/JsonPathRowRecordReader.java | 4 +-
.../org/apache/nifi/avro/TestWriteAvroResult.java | 1 -
.../nifi/json/TestJsonPathRowRecordReader.java | 4 +
.../org/apache/nifi/json/TestWriteJsonResult.java | 5 +-
.../src/test/resources/json/timestamp.json | 2 +-
...ngWindow.java => AttributeRollingWindowIT.java} | 2 +-
.../admin/configmigrator/ConfigMigratorSpec.groovy | 7 +-
.../admin/filemanager/FileManagerToolSpec.groovy | 6 +
nifi-toolkit/nifi-toolkit-assembly/pom.xml | 53 ++++
.../command/registry/flow/ImportFlowVersion.java | 6 +-
.../apache/nifi/toolkit/cli/TestCLICompleter.java | 3 +
.../toolkit/cli/impl/result/TestBucketsResult.java | 8 +
.../cli/impl/result/TestRegistryClientResult.java | 8 +
.../TestVersionedFlowSnapshotMetadataResult.java | 8 +
.../cli/impl/result/TestVersionedFlowsResult.java | 8 +
.../impl/result/writer/TestDynamicTableWriter.java | 8 +
.../properties/ConfigEncryptionToolTest.groovy | 20 +-
nifi-toolkit/nifi-toolkit-flowfile-repo/pom.xml | 6 +
.../flowfile/TestRepairCorruptedFileEndings.java | 8 +
.../apache/nifi/toolkit/s2s/SiteToSiteCliMain.java | 3 -
.../nifi/toolkit/s2s/SiteToSiteReceiver.java | 4 -
pom.xml | 11 +-
196 files changed, 4498 insertions(+), 1448 deletions(-)
delete mode 100644
nifi-commons/nifi-site-to-site-client/src/main/java/org/apache/nifi/remote/exception/NoContentException.java
delete mode 100644
nifi-commons/nifi-site-to-site-client/src/main/java/org/apache/nifi/remote/exception/NoValidPeerException.java
rename
nifi-nar-bundles/nifi-accumulo-bundle/nifi-accumulo-processors/src/test/java/org/apache/nifi/accumulo/processors/{TestPutRecord.java
=> PutRecordIT.java} (98%)
rename
nifi-nar-bundles/nifi-accumulo-bundle/nifi-accumulo-processors/src/test/java/org/apache/nifi/accumulo/processors/{TestScanAccumulo.java
=> ScanAccumuloIT.java} (98%)
copy
nifi-nar-bundles/{nifi-websocket-bundle/nifi-websocket-services-jetty/src/test/resources/certs
=>
nifi-framework-bundle/nifi-framework/nifi-framework-cluster/src/test/resources/conf}/keystore.jks
(100%)
copy {nifi-toolkit/nifi-toolkit-tls/src/test/resources/localhost =>
nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-cluster/src/test/resources/conf}/truststore.jks
(100%)
copy
nifi-commons/nifi-parameter/src/main/java/org/apache/nifi/parameter/ParameterReference.java
=>
nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/main/java/org/apache/nifi/parameter/ParameterUpdate.java
(60%)
create mode 100644
nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/parameter/StandardParameterUpdate.java
copy
nifi-nar-bundles/nifi-jms-bundle/nifi-jms-cf-service/src/main/java/org/apache/nifi/jms/cf/{JMSConnectionFactoryProviderDefinition.java
=> IJMSConnectionFactoryProvider.java} (87%)
create mode 100644
nifi-nar-bundles/nifi-jms-bundle/nifi-jms-processors/src/main/java/org/apache/nifi/jms/cf/JMSConnectionFactoryHandler.java
create mode 100644
nifi-nar-bundles/nifi-jms-bundle/nifi-jms-processors/src/main/java/org/apache/nifi/jms/cf/JMSConnectionFactoryProperties.java
create mode 100644
nifi-nar-bundles/nifi-jms-bundle/nifi-jms-processors/src/main/java/org/apache/nifi/jms/cf/JndiJmsConnectionFactoryHandler.java
create mode 100644
nifi-nar-bundles/nifi-jms-bundle/nifi-jms-processors/src/main/java/org/apache/nifi/jms/cf/JndiJmsConnectionFactoryProperties.java
copy
nifi-nar-bundles/nifi-jms-bundle/nifi-jms-processors/src/test/java/org/apache/nifi/jms/cf/{JMSConnectionFactoryProviderForTest.java
=> JMSConnectionFactoryHandlerForTest.java} (59%)
create mode 100644
nifi-nar-bundles/nifi-jms-bundle/nifi-jms-processors/src/test/java/org/apache/nifi/jms/processors/ConnectionFactoryConfigIT.java
create mode 100644
nifi-nar-bundles/nifi-jms-bundle/nifi-jms-processors/src/test/java/org/apache/nifi/jms/processors/ConnectionFactoryConfigValidatorTest.java
create mode 100644
nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/resources/docs/org.apache.nifi.processors.standard.LookupRecord/additionalDetails.html
create mode 100644
nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/resources/TestLookupRecord/lookup-array-input.json
create mode 100644
nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/resources/TestLookupRecord/lookup-array-output.json
create mode 100644
nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/resources/TestValidateRecord/int-maps-data.json
create mode 100644
nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/resources/TestValidateRecord/int-maps-schema.avsc
rename
nifi-nar-bundles/nifi-stateful-analysis-bundle/nifi-stateful-analysis-processors/src/test/java/org/apache/nifi/processors/stateful/analysis/{TestAttributeRollingWindow.java
=> AttributeRollingWindowIT.java} (99%)