diff --git a/.gitattributes b/.gitattributes index 2451a3c40..709fc3af8 100644 --- a/.gitattributes +++ b/.gitattributes @@ -12,6 +12,7 @@ *.jar binary *.fit binary *.fits binary +*.xisf binary *.ttf binary *.xcf binary *.png binary @@ -19,4 +20,4 @@ *.gz binary *.dll binary *.so binary -*.zip binary \ No newline at end of file +*.zip binary diff --git a/.gitignore b/.gitignore index 479db9a3a..4a81c1a94 100644 --- a/.gitignore +++ b/.gitignore @@ -191,6 +191,3 @@ libobjectbox*.dylib .kotlin # End of https://www.toptal.com/developers/gitignore/api/intellij,kotlin,java,gradle - -**/saved/*.png -**/saved/*.jpg diff --git a/GitHub CI.run.xml b/GitHub CI.run.xml index 3442b30e6..d6fb113ef 100644 --- a/GitHub CI.run.xml +++ b/GitHub CI.run.xml @@ -10,7 +10,7 @@ diff --git a/api/build.gradle.kts b/api/build.gradle.kts index 1a4cab5a4..281255791 100644 --- a/api/build.gradle.kts +++ b/api/build.gradle.kts @@ -19,7 +19,7 @@ dependencies { implementation(project(":nebulosa-guiding-phd2")) implementation(project(":nebulosa-hips2fits")) implementation(project(":nebulosa-horizons")) - implementation(project(":nebulosa-imaging")) + implementation(project(":nebulosa-image")) implementation(project(":nebulosa-indi-client")) implementation(project(":nebulosa-log")) implementation(project(":nebulosa-lx200-protocol")) @@ -29,6 +29,7 @@ dependencies { implementation(project(":nebulosa-stellarium-protocol")) implementation(project(":nebulosa-watney")) implementation(project(":nebulosa-wcs")) + implementation(project(":nebulosa-xisf")) implementation(libs.apache.codec) implementation(libs.csv) implementation(libs.eventbus) diff --git a/api/src/main/kotlin/nebulosa/api/README.md b/api/src/main/kotlin/nebulosa/api/README.md index 7a6187f39..c4f03ed8a 100644 --- a/api/src/main/kotlin/nebulosa/api/README.md +++ b/api/src/main/kotlin/nebulosa/api/README.md @@ -52,7 +52,7 @@ URL: `localhost:{PORT}/ws` "offset": 0, "offsetMin": 0, "offsetMax": 0, - "hasGuiderHead": false, + "hasGuideHead": false, "pixelSizeX": 0, "pixelSizeY": 0, "capturesPath": "", diff --git a/api/src/main/kotlin/nebulosa/api/alignment/polar/darv/DARVJob.kt b/api/src/main/kotlin/nebulosa/api/alignment/polar/darv/DARVJob.kt index 04a268396..95c69cbfc 100644 --- a/api/src/main/kotlin/nebulosa/api/alignment/polar/darv/DARVJob.kt +++ b/api/src/main/kotlin/nebulosa/api/alignment/polar/darv/DARVJob.kt @@ -14,10 +14,12 @@ import nebulosa.batch.processing.ExecutionContext.Companion.getDouble import nebulosa.batch.processing.ExecutionContext.Companion.getDuration import nebulosa.batch.processing.delay.DelayStep import nebulosa.batch.processing.delay.DelayStepListener +import nebulosa.image.format.ImageRepresentation import nebulosa.indi.device.camera.Camera import nebulosa.indi.device.camera.FrameType import nebulosa.indi.device.guide.GuideOutput import java.nio.file.Files +import java.nio.file.Path import java.time.Duration data class DARVJob( @@ -65,8 +67,8 @@ data class DARVJob( onNext(DARVEvent.Finished(id)) } - override fun onExposureFinished(step: CameraExposureStep, stepExecution: StepExecution) { - onNext(CameraExposureFinished(stepExecution.jobExecution, step.camera, 1, 1, Duration.ZERO, 1.0, Duration.ZERO, step.savedPath!!)) + override fun onExposureFinished(step: CameraExposureStep, stepExecution: StepExecution, image: ImageRepresentation?, savedPath: Path) { + onNext(CameraExposureFinished(stepExecution.jobExecution, step.camera, 1, 1, Duration.ZERO, 1.0, Duration.ZERO, savedPath)) } override fun onGuidePulseElapsed(step: GuidePulseStep, stepExecution: StepExecution) { diff --git a/api/src/main/kotlin/nebulosa/api/alignment/polar/tppa/TPPAStep.kt b/api/src/main/kotlin/nebulosa/api/alignment/polar/tppa/TPPAStep.kt index 02dd5ead7..af809ffa5 100644 --- a/api/src/main/kotlin/nebulosa/api/alignment/polar/tppa/TPPAStep.kt +++ b/api/src/main/kotlin/nebulosa/api/alignment/polar/tppa/TPPAStep.kt @@ -12,8 +12,7 @@ import nebulosa.batch.processing.StepExecution import nebulosa.batch.processing.StepResult import nebulosa.common.concurrency.latch.Pauseable import nebulosa.common.time.Stopwatch -import nebulosa.fits.fits -import nebulosa.imaging.Image +import nebulosa.image.format.ImageRepresentation import nebulosa.indi.device.camera.Camera import nebulosa.indi.device.mount.Mount import nebulosa.log.debug @@ -21,6 +20,7 @@ import nebulosa.log.loggerFor import nebulosa.math.Angle import nebulosa.math.deg import nebulosa.plate.solving.PlateSolver +import java.nio.file.Path data class TPPAStep( @JvmField val camera: Camera, @@ -30,7 +30,7 @@ data class TPPAStep( private val longitude: Angle = mount!!.longitude, private val latitude: Angle = mount!!.latitude, private val cameraRequest: CameraStartCaptureRequest = request.capture, -) : Step, Pauseable { +) : Step, Pauseable, CameraCaptureListener { private val cameraExposureStep = CameraExposureStep(camera, cameraRequest) private val alignment = ThreePointPolarAlignment(solver, longitude, latitude) @@ -38,10 +38,10 @@ data class TPPAStep( private val stopwatch = Stopwatch() private val stepDistances = DoubleArray(2) { if (request.eastDirection) request.stepDistance else -request.stepDistance } - @Volatile private var image: Image? = null @Volatile private var mountSlewStep: MountSlewStep? = null @Volatile private var noSolutionAttempts = 0 @Volatile private var stepExecution: StepExecution? = null + @Volatile private var savedImage: Pair? = null val stepCount get() = alignment.state @@ -65,20 +65,26 @@ data class TPPAStep( return listeners.remove(listener) } + override fun onExposureFinished(step: CameraExposureStep, stepExecution: StepExecution, image: ImageRepresentation?, savedPath: Path) { + savedImage = image to savedPath + } + override fun beforeJob(jobExecution: JobExecution) { + cameraExposureStep.registerCameraCaptureListener(this) cameraExposureStep.beforeJob(jobExecution) mount?.tracking(true) } override fun afterJob(jobExecution: JobExecution) { cameraExposureStep.afterJob(jobExecution) + cameraExposureStep.unregisterCameraCaptureListener(this) if (mount != null && request.stopTrackingWhenDone) { mount.tracking(false) } + savedImage = null stopwatch.stop() - listeners.forEach { it.polarAlignmentFinished(this, jobExecution.cancellationToken.isCancelled) } } @@ -119,14 +125,13 @@ data class TPPAStep( cameraExposureStep.execute(stepExecution) if (!cancellationToken.isCancelled) { - val savedPath = cameraExposureStep.savedPath ?: return StepResult.FINISHED - image = savedPath.fits().use { image?.load(it, false) ?: Image.open(it, false) } + val saved = savedImage ?: return StepResult.FINISHED val radius = if (mount == null) 0.0 else ThreePointPolarAlignment.DEFAULT_RADIUS // Polar alignment step. val result = alignment.align( - savedPath, image!!, mount?.rightAscension ?: 0.0, mount?.declination ?: 0.0, radius, + saved.second, mount?.rightAscension ?: 0.0, mount?.declination ?: 0.0, radius, request.compensateRefraction, cancellationToken ) diff --git a/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasUpdateTask.kt b/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasUpdateTask.kt index 6aea23af6..b1392e952 100644 --- a/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasUpdateTask.kt +++ b/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasUpdateTask.kt @@ -74,10 +74,12 @@ class SkyAtlasUpdateTask( httpClient.newCall(request).execute().use { if (it.isSuccessful) { - val reader = SimbadDatabaseReader(it.body!!.byteStream().source()) - - for (entity in reader) { - simbadEntityRepository.save(entity) + it.body!!.byteStream().source().use { source -> + SimbadDatabaseReader(source).use { reader -> + for (entity in reader) { + simbadEntityRepository.save(entity) + } + } } } else if (it.code == 404) { finished = true diff --git a/api/src/main/kotlin/nebulosa/api/beans/configurations/BeanConfiguration.kt b/api/src/main/kotlin/nebulosa/api/beans/configurations/BeanConfiguration.kt index f04275e1d..ff01cda52 100644 --- a/api/src/main/kotlin/nebulosa/api/beans/configurations/BeanConfiguration.kt +++ b/api/src/main/kotlin/nebulosa/api/beans/configurations/BeanConfiguration.kt @@ -18,7 +18,7 @@ import nebulosa.guiding.Guider import nebulosa.guiding.phd2.PHD2Guider import nebulosa.hips2fits.Hips2FitsService import nebulosa.horizons.HorizonsService -import nebulosa.imaging.Image +import nebulosa.image.Image import nebulosa.log.loggerFor import nebulosa.phd2.client.PHD2Client import nebulosa.sbd.SmallBodyDatabaseService diff --git a/api/src/main/kotlin/nebulosa/api/calibration/CalibrationFrameService.kt b/api/src/main/kotlin/nebulosa/api/calibration/CalibrationFrameService.kt index a217cac8e..f2def0291 100644 --- a/api/src/main/kotlin/nebulosa/api/calibration/CalibrationFrameService.kt +++ b/api/src/main/kotlin/nebulosa/api/calibration/CalibrationFrameService.kt @@ -1,10 +1,13 @@ package nebulosa.api.calibration import nebulosa.fits.* -import nebulosa.imaging.Image -import nebulosa.imaging.algorithms.transformation.correction.BiasSubtraction -import nebulosa.imaging.algorithms.transformation.correction.DarkSubtraction -import nebulosa.imaging.algorithms.transformation.correction.FlatCorrection +import nebulosa.image.Image +import nebulosa.image.algorithms.transformation.correction.BiasSubtraction +import nebulosa.image.algorithms.transformation.correction.DarkSubtraction +import nebulosa.image.algorithms.transformation.correction.FlatCorrection +import nebulosa.image.format.Header +import nebulosa.image.format.ImageHdu +import nebulosa.image.format.ReadableHeader import nebulosa.indi.device.camera.FrameType import nebulosa.log.loggerFor import org.springframework.stereotype.Service @@ -31,7 +34,7 @@ class CalibrationFrameService( return if (darkFrame != null || biasFrame != null || flatFrame != null) { var transformedImage = if (createNew) image.clone() else image - var calibrationImage = Image(transformedImage.width, transformedImage.height, Header.EMPTY, transformedImage.mono) + var calibrationImage = Image(transformedImage.width, transformedImage.height, Header.Empty, transformedImage.mono) if (biasFrame != null) { calibrationImage = biasFrame.path!!.fits().use(calibrationImage::load)!! @@ -98,7 +101,8 @@ class CalibrationFrameService( try { file.fits().use { fits -> - val (header) = fits.filterIsInstance().firstOrNull() ?: return@use + val hdu = fits.filterIsInstance().firstOrNull() ?: return@use + val header = hdu.header val frameType = header.frameType?.takeIf { it != FrameType.LIGHT } ?: return@use val exposureTime = if (frameType == FrameType.DARK) header.exposureTimeInMicroseconds else 0L @@ -174,7 +178,7 @@ class CalibrationFrameService( @JvmStatic private val LOG = loggerFor() - @JvmStatic val Header.frameType + @JvmStatic val ReadableHeader.frameType get() = frame?.uppercase()?.let { if ("LIGHT" in it) FrameType.LIGHT else if ("DARK" in it) FrameType.DARK diff --git a/api/src/main/kotlin/nebulosa/api/cameras/CameraCaptureEventHandler.kt b/api/src/main/kotlin/nebulosa/api/cameras/CameraCaptureEventHandler.kt index b594a3320..017228f44 100644 --- a/api/src/main/kotlin/nebulosa/api/cameras/CameraCaptureEventHandler.kt +++ b/api/src/main/kotlin/nebulosa/api/cameras/CameraCaptureEventHandler.kt @@ -11,6 +11,8 @@ import nebulosa.batch.processing.JobExecution import nebulosa.batch.processing.JobStatus import nebulosa.batch.processing.StepExecution import nebulosa.batch.processing.delay.DelayStep +import nebulosa.image.format.ImageRepresentation +import java.nio.file.Path data class CameraCaptureEventHandler(private val observer: Observer) : CameraCaptureListener { @@ -31,8 +33,8 @@ data class CameraCaptureEventHandler(private val observer: Observer return diff --git a/api/src/main/kotlin/nebulosa/api/cameras/CameraCaptureListener.kt b/api/src/main/kotlin/nebulosa/api/cameras/CameraCaptureListener.kt index 3b685d6b4..770003980 100644 --- a/api/src/main/kotlin/nebulosa/api/cameras/CameraCaptureListener.kt +++ b/api/src/main/kotlin/nebulosa/api/cameras/CameraCaptureListener.kt @@ -2,6 +2,8 @@ package nebulosa.api.cameras import nebulosa.batch.processing.JobExecution import nebulosa.batch.processing.StepExecution +import nebulosa.image.format.ImageRepresentation +import java.nio.file.Path interface CameraCaptureListener { @@ -11,7 +13,7 @@ interface CameraCaptureListener { fun onExposureElapsed(step: CameraExposureStep, stepExecution: StepExecution) = Unit - fun onExposureFinished(step: CameraExposureStep, stepExecution: StepExecution) = Unit + fun onExposureFinished(step: CameraExposureStep, stepExecution: StepExecution, image: ImageRepresentation?, savedPath: Path) = Unit fun onCaptureFinished(step: CameraExposureStep, jobExecution: JobExecution) = Unit } diff --git a/api/src/main/kotlin/nebulosa/api/cameras/CameraExposureStep.kt b/api/src/main/kotlin/nebulosa/api/cameras/CameraExposureStep.kt index b55358c11..3bc3ba3de 100644 --- a/api/src/main/kotlin/nebulosa/api/cameras/CameraExposureStep.kt +++ b/api/src/main/kotlin/nebulosa/api/cameras/CameraExposureStep.kt @@ -11,7 +11,6 @@ import nebulosa.batch.processing.StepResult import nebulosa.batch.processing.delay.DelayStep import nebulosa.batch.processing.delay.DelayStepListener import nebulosa.common.concurrency.latch.CountUpDownLatch -import nebulosa.fits.Fits import nebulosa.indi.device.camera.* import nebulosa.io.transferAndClose import nebulosa.log.debug @@ -20,7 +19,6 @@ import okio.sink import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode -import java.io.InputStream import java.nio.file.Path import java.time.Duration import java.time.LocalDateTime @@ -50,9 +48,6 @@ data class CameraExposureStep( @Volatile private var stepExecution: StepExecution? = null - @Volatile override var savedPath: Path? = null - private set - override fun registerCameraCaptureListener(listener: CameraCaptureListener): Boolean { return listeners.add(listener) } @@ -66,7 +61,7 @@ data class CameraExposureStep( if (event.device === camera) { when (event) { is CameraFrameCaptured -> { - save(event.stream, event.fits) + save(event) } is CameraExposureAborted, is CameraExposureFailed, @@ -168,25 +163,26 @@ data class CameraExposureStep( } } - private fun save(stream: InputStream?, fits: Fits?) { + private fun save(event: CameraFrameCaptured) { try { - savedPath = request.makeSavePath(camera) + val savedPath = request.makeSavePath(camera) - LOG.info("saving FITS. path={}", savedPath) + LOG.info("saving FITS image at {}", savedPath) - savedPath!!.createParentDirectories() + savedPath.createParentDirectories() - if (stream != null) { - stream.transferAndClose(savedPath!!.outputStream()) - } else if (fits != null) { - savedPath!!.outputStream().use { fits.writeTo(it.sink()) } + if (event.stream != null) { + event.stream!!.transferAndClose(savedPath.outputStream()) + } else if (event.image != null) { + savedPath.sink().use(event.image!!::write) } else { + LOG.warn("invalid event. camera={}", event.device) return } - listeners.forEach { it.onExposureFinished(this, stepExecution!!) } + listeners.forEach { it.onExposureFinished(this, stepExecution!!, event.image, savedPath) } } catch (e: Throwable) { - LOG.error("failed to save FITS", e) + LOG.error("failed to save FITS image", e) aborted = true } finally { latch.countDown() @@ -230,7 +226,9 @@ data class CameraExposureStep( @JvmStatic private val DATE_TIME_FORMAT = DateTimeFormatter.ofPattern("yyyyMMdd.HHmmssSSS") @JvmStatic - fun CameraStartCaptureRequest.makeSavePath(camera: Camera, autoSave: Boolean = this.autoSave): Path { + internal fun CameraStartCaptureRequest.makeSavePath( + camera: Camera, autoSave: Boolean = this.autoSave, + ): Path { return if (autoSave) { val now = LocalDateTime.now() val savePath = autoSubFolderMode.pathFor(savePath!!, now) diff --git a/api/src/main/kotlin/nebulosa/api/cameras/CameraLoopExposureStep.kt b/api/src/main/kotlin/nebulosa/api/cameras/CameraLoopExposureStep.kt index bc6f968cb..5129cff94 100644 --- a/api/src/main/kotlin/nebulosa/api/cameras/CameraLoopExposureStep.kt +++ b/api/src/main/kotlin/nebulosa/api/cameras/CameraLoopExposureStep.kt @@ -14,9 +14,6 @@ data class CameraLoopExposureStep( private val cameraExposureStep = CameraExposureStep(camera, request) private val delayStep = DelayStep(request.exposureDelay) - override val savedPath - get() = cameraExposureStep.savedPath - init { delayStep.registerDelayStepListener(cameraExposureStep) } diff --git a/api/src/main/kotlin/nebulosa/api/cameras/CameraSerializer.kt b/api/src/main/kotlin/nebulosa/api/cameras/CameraSerializer.kt index 0a01653b8..97769f311 100644 --- a/api/src/main/kotlin/nebulosa/api/cameras/CameraSerializer.kt +++ b/api/src/main/kotlin/nebulosa/api/cameras/CameraSerializer.kt @@ -4,6 +4,7 @@ import com.fasterxml.jackson.core.JsonGenerator import com.fasterxml.jackson.databind.SerializerProvider import com.fasterxml.jackson.databind.ser.std.StdSerializer import nebulosa.indi.device.camera.Camera +import nebulosa.indi.device.camera.GuideHead import org.springframework.stereotype.Component import java.nio.file.Path @@ -57,7 +58,7 @@ class CameraSerializer(private val capturesPath: Path) : StdSerializer(C gen.writeNumberField("offset", value.offset) gen.writeNumberField("offsetMin", value.offsetMin) gen.writeNumberField("offsetMax", value.offsetMax) - gen.writeBooleanField("hasGuiderHead", value.hasGuiderHead) + gen.writeBooleanField("hasGuideHead", value.guideHead != null) gen.writeNumberField("pixelSizeX", value.pixelSizeX) gen.writeNumberField("pixelSizeY", value.pixelSizeY) gen.writeBooleanField("canPulseGuide", value.canPulseGuide) @@ -65,6 +66,22 @@ class CameraSerializer(private val capturesPath: Path) : StdSerializer(C gen.writeBooleanField("hasThermometer", value.hasThermometer) gen.writeNumberField("temperature", value.temperature) gen.writeObjectField("capturesPath", Path.of("$capturesPath", value.name)) + + if (value is GuideHead) { + gen.writeMainOrGuideHead(value.main, "main") + } else if (value.guideHead != null) { + gen.writeMainOrGuideHead(value.guideHead!!, "guideHead") + } + gen.writeEndObject() } + + private fun JsonGenerator.writeMainOrGuideHead(camera: Camera, fieldName: String) { + writeObjectFieldStart(fieldName) + writeStringField("id", camera.id) + writeStringField("name", camera.name) + writeStringField("sender", camera.sender.id) + writeBooleanField("connected", camera.connected) + writeEndObject() + } } diff --git a/api/src/main/kotlin/nebulosa/api/cameras/CameraStartCaptureStep.kt b/api/src/main/kotlin/nebulosa/api/cameras/CameraStartCaptureStep.kt index 86c6e67ab..0e70c4241 100644 --- a/api/src/main/kotlin/nebulosa/api/cameras/CameraStartCaptureStep.kt +++ b/api/src/main/kotlin/nebulosa/api/cameras/CameraStartCaptureStep.kt @@ -2,7 +2,6 @@ package nebulosa.api.cameras import nebulosa.batch.processing.Step import nebulosa.indi.device.camera.Camera -import java.nio.file.Path sealed interface CameraStartCaptureStep : Step { @@ -10,8 +9,6 @@ sealed interface CameraStartCaptureStep : Step { val request: CameraStartCaptureRequest - val savedPath: Path? - fun registerCameraCaptureListener(listener: CameraCaptureListener): Boolean fun unregisterCameraCaptureListener(listener: CameraCaptureListener): Boolean diff --git a/api/src/main/kotlin/nebulosa/api/framing/FramingService.kt b/api/src/main/kotlin/nebulosa/api/framing/FramingService.kt index 3c78ca249..6a31eb37a 100644 --- a/api/src/main/kotlin/nebulosa/api/framing/FramingService.kt +++ b/api/src/main/kotlin/nebulosa/api/framing/FramingService.kt @@ -3,7 +3,7 @@ package nebulosa.api.framing import nebulosa.fits.fits import nebulosa.hips2fits.FormatOutputType import nebulosa.hips2fits.Hips2FitsService -import nebulosa.imaging.Image +import nebulosa.image.Image import nebulosa.io.transferAndCloseOutput import nebulosa.log.loggerFor import nebulosa.math.Angle diff --git a/api/src/main/kotlin/nebulosa/api/image/ImageBucket.kt b/api/src/main/kotlin/nebulosa/api/image/ImageBucket.kt index cc73e3e7f..967b709a9 100644 --- a/api/src/main/kotlin/nebulosa/api/image/ImageBucket.kt +++ b/api/src/main/kotlin/nebulosa/api/image/ImageBucket.kt @@ -1,10 +1,12 @@ package nebulosa.api.image import nebulosa.fits.fits -import nebulosa.imaging.Image +import nebulosa.image.Image import nebulosa.plate.solving.PlateSolution +import nebulosa.xisf.xisf import org.springframework.stereotype.Component import java.nio.file.Path +import kotlin.io.path.extension @Component class ImageBucket { @@ -13,7 +15,7 @@ class ImageBucket { @Synchronized fun put(path: Path, image: Image, solution: PlateSolution? = null) { - bucket[path] = image to solution + bucket[path] = image to (solution ?: PlateSolution.from(image.header)) } @Synchronized @@ -26,9 +28,17 @@ class ImageBucket { @Synchronized fun open(path: Path, debayer: Boolean = true, solution: PlateSolution? = null, force: Boolean = false): Image { val openedImage = this[path] + if (openedImage != null && !force) return openedImage.first - val image = path.fits().use { openedImage?.first?.load(it) ?: Image.open(it, debayer) } - put(path, image, solution ?: PlateSolution.from(image.header)) + + val representation = when (path.extension.lowercase()) { + "fit", "fits" -> path.fits() + "xisf" -> path.xisf() + else -> throw IllegalArgumentException("invalid extension: $path") + } + + val image = representation.use { openedImage?.first?.load(it) ?: Image.open(it, debayer) } + put(path, image, solution) return image } diff --git a/api/src/main/kotlin/nebulosa/api/image/ImageController.kt b/api/src/main/kotlin/nebulosa/api/image/ImageController.kt index 49e12d6e0..17ac495d2 100644 --- a/api/src/main/kotlin/nebulosa/api/image/ImageController.kt +++ b/api/src/main/kotlin/nebulosa/api/image/ImageController.kt @@ -5,8 +5,8 @@ import jakarta.validation.Valid import nebulosa.api.atlas.Location import nebulosa.api.beans.converters.device.DeviceOrEntityParam import nebulosa.api.beans.converters.location.LocationParam -import nebulosa.imaging.ImageChannel -import nebulosa.imaging.algorithms.transformation.ProtectionMethod +import nebulosa.image.algorithms.transformation.ProtectionMethod +import nebulosa.image.format.ImageChannel import nebulosa.indi.device.camera.Camera import nebulosa.star.detection.ImageStar import org.hibernate.validator.constraints.Range diff --git a/api/src/main/kotlin/nebulosa/api/image/ImageInfo.kt b/api/src/main/kotlin/nebulosa/api/image/ImageInfo.kt index 83a6aa217..25d2d8807 100644 --- a/api/src/main/kotlin/nebulosa/api/image/ImageInfo.kt +++ b/api/src/main/kotlin/nebulosa/api/image/ImageInfo.kt @@ -4,7 +4,7 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties import com.fasterxml.jackson.databind.annotation.JsonSerialize import nebulosa.api.beans.converters.angle.DeclinationSerializer import nebulosa.api.beans.converters.angle.RightAscensionSerializer -import nebulosa.imaging.algorithms.computation.Statistics +import nebulosa.image.algorithms.computation.Statistics import nebulosa.indi.device.camera.Camera import java.nio.file.Path diff --git a/api/src/main/kotlin/nebulosa/api/image/ImageService.kt b/api/src/main/kotlin/nebulosa/api/image/ImageService.kt index 0e65de7c4..216841c87 100644 --- a/api/src/main/kotlin/nebulosa/api/image/ImageService.kt +++ b/api/src/main/kotlin/nebulosa/api/image/ImageService.kt @@ -8,13 +8,12 @@ import nebulosa.api.calibration.CalibrationFrameService import nebulosa.api.connection.ConnectionService import nebulosa.api.framing.FramingService import nebulosa.fits.* -import nebulosa.imaging.Image -import nebulosa.imaging.ImageChannel -import nebulosa.imaging.algorithms.computation.Histogram -import nebulosa.imaging.algorithms.computation.Statistics -import nebulosa.imaging.algorithms.transformation.* +import nebulosa.image.Image +import nebulosa.image.algorithms.computation.Histogram +import nebulosa.image.algorithms.computation.Statistics +import nebulosa.image.algorithms.transformation.* +import nebulosa.image.format.ImageChannel import nebulosa.indi.device.camera.Camera -import nebulosa.io.transferAndClose import nebulosa.log.debug import nebulosa.log.loggerFor import nebulosa.math.* @@ -29,6 +28,8 @@ import nebulosa.time.TimeYMDHMS import nebulosa.time.UTC import nebulosa.wcs.WCS import nebulosa.wcs.WCSException +import nebulosa.xisf.XisfFormat +import okio.sink import org.springframework.http.HttpStatus import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor import org.springframework.stereotype.Service @@ -40,7 +41,6 @@ import java.util.* import java.util.concurrent.CompletableFuture import javax.imageio.ImageIO import kotlin.io.path.extension -import kotlin.io.path.inputStream import kotlin.io.path.outputStream @Service @@ -81,8 +81,8 @@ class ImageService( var stretchParams = ScreenTransformFunction.Parameters(midtone, shadow, highlight) val shouldBeTransformed = autoStretch || manualStretch - || mirrorHorizontal || mirrorVertical || invert - || scnrEnabled + || mirrorHorizontal || mirrorVertical || invert + || scnrEnabled var transformedImage = if (shouldBeTransformed) image.clone() else image val instrument = camera?.name ?: image.header.instrument @@ -246,16 +246,15 @@ class ImageService( fun saveImageAs(inputPath: Path, outputPath: Path) { if (inputPath != outputPath) { - if (inputPath.extension == outputPath.extension) { - inputPath.inputStream().transferAndClose(outputPath.outputStream()) - } else { - val image = imageBucket[inputPath]?.first ?: return - - when (outputPath.extension.uppercase()) { - "PNG" -> outputPath.outputStream().use { ImageIO.write(image, "PNG", it) } - "JPG", "JPEG" -> outputPath.outputStream().use { ImageIO.write(image, "JPEG", it) } - else -> throw ResponseStatusException(HttpStatus.BAD_REQUEST, "Invalid format") - } + val image = imageBucket[inputPath]?.first + ?: throw ResponseStatusException(HttpStatus.NOT_FOUND, "Image not found") + + when (outputPath.extension.uppercase()) { + "PNG" -> outputPath.outputStream().use { ImageIO.write(image, "PNG", it) } + "JPG", "JPEG" -> outputPath.outputStream().use { ImageIO.write(image, "JPEG", it) } + "FIT", "FITS" -> outputPath.sink().use { image.writeTo(it, FitsFormat) } + "XISF" -> outputPath.sink().use { image.writeTo(it, XisfFormat) } + else -> throw ResponseStatusException(HttpStatus.BAD_REQUEST, "Invalid format") } } } diff --git a/api/src/main/kotlin/nebulosa/api/mounts/MountService.kt b/api/src/main/kotlin/nebulosa/api/mounts/MountService.kt index c97723dbe..9843904c0 100644 --- a/api/src/main/kotlin/nebulosa/api/mounts/MountService.kt +++ b/api/src/main/kotlin/nebulosa/api/mounts/MountService.kt @@ -16,8 +16,6 @@ import nebulosa.nova.position.GeographicPosition import nebulosa.nova.position.Geoid import nebulosa.nova.position.ICRF import nebulosa.time.CurrentTime -import nebulosa.time.TimeJD -import nebulosa.time.UTC import nebulosa.wcs.WCS import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode diff --git a/api/src/main/kotlin/nebulosa/api/wizard/flat/FlatWizardExecutor.kt b/api/src/main/kotlin/nebulosa/api/wizard/flat/FlatWizardExecutor.kt index e79c4038b..23ca02631 100644 --- a/api/src/main/kotlin/nebulosa/api/wizard/flat/FlatWizardExecutor.kt +++ b/api/src/main/kotlin/nebulosa/api/wizard/flat/FlatWizardExecutor.kt @@ -1,5 +1,6 @@ package nebulosa.api.wizard.flat +import nebulosa.api.image.ImageBucket import nebulosa.api.messages.MessageService import nebulosa.batch.processing.JobExecutor import nebulosa.batch.processing.JobLauncher @@ -12,6 +13,7 @@ import org.springframework.stereotype.Component class FlatWizardExecutor( private val messageService: MessageService, override val jobLauncher: JobLauncher, + private val imageBucket: ImageBucket, ) : JobExecutor() { fun execute(camera: Camera, request: FlatWizardRequest): String { @@ -20,7 +22,7 @@ class FlatWizardExecutor( LOG.info { "starting flat wizard capture. camera=$camera, request=$request" } - val flatWizardJob = FlatWizardJob(camera, request) + val flatWizardJob = FlatWizardJob(camera, request, imageBucket = imageBucket) flatWizardJob.subscribe(messageService::sendMessage) register(jobLauncher.launch(flatWizardJob)) return flatWizardJob.id diff --git a/api/src/main/kotlin/nebulosa/api/wizard/flat/FlatWizardJob.kt b/api/src/main/kotlin/nebulosa/api/wizard/flat/FlatWizardJob.kt index 100b6c041..c73a491f1 100644 --- a/api/src/main/kotlin/nebulosa/api/wizard/flat/FlatWizardJob.kt +++ b/api/src/main/kotlin/nebulosa/api/wizard/flat/FlatWizardJob.kt @@ -4,6 +4,7 @@ import io.reactivex.rxjava3.subjects.PublishSubject import nebulosa.api.cameras.CameraCaptureElapsed import nebulosa.api.cameras.CameraCaptureEventHandler import nebulosa.api.cameras.CameraExposureFinished +import nebulosa.api.image.ImageBucket import nebulosa.api.messages.MessageEvent import nebulosa.batch.processing.PublishSubscribe import nebulosa.batch.processing.SimpleJob @@ -16,10 +17,11 @@ data class FlatWizardJob( @JvmField val camera: Camera, @JvmField val request: FlatWizardRequest, @JvmField val wheel: FilterWheel? = null, + @JvmField val imageBucket: ImageBucket? = null, ) : SimpleJob(), PublishSubscribe, FlatWizardExecutionListener { private val cameraCaptureEventHandler = CameraCaptureEventHandler(this) - private val step = FlatWizardStep(camera, request) + private val step = FlatWizardStep(camera, request, imageBucket) override val subject = PublishSubject.create() diff --git a/api/src/main/kotlin/nebulosa/api/wizard/flat/FlatWizardStep.kt b/api/src/main/kotlin/nebulosa/api/wizard/flat/FlatWizardStep.kt index c57d04d34..c71444fc7 100644 --- a/api/src/main/kotlin/nebulosa/api/wizard/flat/FlatWizardStep.kt +++ b/api/src/main/kotlin/nebulosa/api/wizard/flat/FlatWizardStep.kt @@ -3,25 +3,24 @@ package nebulosa.api.wizard.flat import nebulosa.api.cameras.AutoSubFolderMode import nebulosa.api.cameras.CameraCaptureListener import nebulosa.api.cameras.CameraExposureStep -import nebulosa.api.cameras.CameraExposureStep.Companion.makeSavePath +import nebulosa.api.image.ImageBucket import nebulosa.batch.processing.Step import nebulosa.batch.processing.StepExecution import nebulosa.batch.processing.StepResult import nebulosa.fits.fits -import nebulosa.imaging.Image -import nebulosa.imaging.algorithms.computation.Statistics +import nebulosa.image.Image +import nebulosa.image.algorithms.computation.Statistics +import nebulosa.image.format.ImageRepresentation import nebulosa.indi.device.camera.Camera -import nebulosa.io.transferAndClose import org.slf4j.LoggerFactory +import java.nio.file.Path import java.time.Duration import java.util.concurrent.atomic.AtomicReference -import kotlin.io.path.deleteIfExists -import kotlin.io.path.inputStream -import kotlin.io.path.outputStream data class FlatWizardStep( @JvmField val camera: Camera, @JvmField val request: FlatWizardRequest, + @JvmField val imageBucket: ImageBucket? = null, ) : Step { @Volatile var exposureMin = request.exposureMin @@ -72,31 +71,40 @@ data class FlatWizardStep( exposureTime = (exposureMax + exposureMin).dividedBy(2L) val cameraExposureStep = CameraExposureStep( - camera, - request.captureRequest.copy( + camera, request.captureRequest.copy( exposureTime = exposureTime, exposureAmount = 1, autoSave = false, autoSubFolderMode = AutoSubFolderMode.OFF, ) ) + var saved: Pair? = null + + val listener = object : CameraCaptureListener { + + override fun onExposureFinished(step: CameraExposureStep, stepExecution: StepExecution, image: ImageRepresentation?, savedPath: Path) { + saved = image to savedPath + } + } + this.cameraExposureStep.set(cameraExposureStep) cameraCaptureListeners.forEach(cameraExposureStep::registerCameraCaptureListener) + cameraExposureStep.registerCameraCaptureListener(listener) cameraExposureStep.executeSingle(stepExecution) - val savedPath = cameraExposureStep.savedPath + if (!stopped && saved != null) { + val (imageRepresentation, savedPath) = saved!! + + image = if (imageRepresentation != null) image?.load(imageRepresentation) ?: Image.open(imageRepresentation, false) + else savedPath.fits().use { image?.load(it) ?: Image.open(it, false) } - if (!stopped && savedPath != null) { - image = savedPath.fits().use { image?.load(it, false) ?: Image.open(it, false) } + imageBucket?.put(savedPath, image!!) val statistics = STATISTICS.compute(image!!) LOG.info("flat frame captured. duration={}, statistics={}", exposureTime, statistics) if (statistics.mean in meanRange) { - val path = request.captureRequest.makeSavePath(camera, true) - savedPath.inputStream().transferAndClose(path.outputStream()) - savedPath.deleteIfExists() - LOG.info("Found an optimal exposure time. exposure={}, path={}", exposureTime, path) - flatWizardExecutionListeners.forEach { it.onFlatCaptured(this, path, exposureTime) } + LOG.info("Found an optimal exposure time. exposure={}, path={}", exposureTime, savedPath) + flatWizardExecutionListeners.forEach { it.onFlatCaptured(this, savedPath, exposureTime) } } else if (statistics.mean < meanRange.start) { exposureMin = cameraExposureStep.exposureTime return StepResult.CONTINUABLE diff --git a/data/.gitignore b/data/.gitignore index f58680a40..6642278fe 100644 --- a/data/.gitignore +++ b/data/.gitignore @@ -1,2 +1,3 @@ simbad/ astrobin/ +test/ diff --git a/data/fits/.gitignore b/data/fits/.gitignore deleted file mode 100644 index 525457074..000000000 --- a/data/fits/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -!*.zip -BIAS.fits -DARK.fits -FLAT.fits -UNCALIBRATED.fits diff --git a/data/fits/NGC3344.Color.16.fits b/data/fits/NGC3344.Color.16.fits deleted file mode 100644 index 77f456842..000000000 --- a/data/fits/NGC3344.Color.16.fits +++ /dev/null @@ -1,375 +0,0 @@ -SIMPLE = T / file does conform to FITS standard BITPIX = 16 / number of bits per data pixel NAXIS = 3 / number of data axes NAXIS1 = 256 / length of data axis 1 NAXIS2 = 256 / length of data axis 2 NAXIS3 = 4 / length of data axis 3 EXTEND = T / FITS dataset may contain extensions COMMENT FITS (Flexible Image Transport System) format is defined in 'AstronomyCOMMENT and Astrophysics', volume 376, page 359; bibcode: 2001A&A...376..359H BZERO = 32768 / offset data range to that of unsigned short BSCALE = 1 / default scaling factor PROGRAM = 'PixInsight 1.8.9-2' / Software that created this HDU COMMENT PixInsight Class Library: PCL 2.6.1 COMMENT FITS module version 1.2.0 ROWORDER= 'TOP-DOWN' / Order of pixel rows stored in the image array END (! !!#%*...!! ! !#!(& !!# & #)%$"(##!$(-'6,-&)42,*.0/,-L_3.355]}[HYZL>P-:^9'.,1-1-4.5/60)EK140315800,1133...36:4238:>;8>999737?C<=;9a6<>9794?6<3:>8:2D500.67ASC9?FCB=7;=7537244836>.6=7471*0)'(0,!')$#!%    /"!&# #!!' "%+ 5$$,!) %)!"(& )&%*0*21.#+A+)&(,&.6,)8247T%ZMnHG500%/23/0162./0-*.1.01/*454339;6558688<65A43654374/:3044.1?>1:=C:5D5HMG8>;9;C<6C72@1+*15&*((,%#&'*%#! ""'%"!")&!#!""$% $!&'", "''&((5(+/*.Q*35%$)/+.,6AR@<:65+BD<1.+-///0+-.0-.,*,.+-2.[E/-.5.32,50/472*441:@97899A?:9<=?B;4::88:@<4://1:4306463<41.;602-?;6DB>4=>7?@48G8463-*--21),-&/'%(#)+' (% #&41 %$%"&'"!7.)'$" !!$'!$0+),)&,0.2*0)*+<7(,4%'+-107LO516?;-=1../116+/-.(**')**-/56120/1++0&-0543224@?7267789775:98?<:;;D@@<>48468664594678:<735=E?4467224;RLEFKL<8V89-4./-/,+A')(-$./()&""!")'%88 !#%0! !1$$#$+%1#!"  )6&+-#(&(.)0?2:9L20B/1'+(21+0-7E;67=:IQ,.*+-)+,**,.,/+)+.590/004100./,44.8,26422FE;8;6>@9<:979=@7?DCOIF6AC8<069?0,.-2&)+/'$1*+0!!#'$!# 1(+)%.)"#/) !'("%(!&$#&"($'9/ -()**+6:GeoB;C0)$&08.1/1+:7226319<3020,,0--*-0141+6201.>W4--/..,31,..2489P9;=69:?<@84469?A;9<>\AY??AAKA>9=?9?2BQBRI?cA:?@99<FA59=?XQ^kfHXIFM``aZocVSLZDDG<0/.42+4/())$#$&+)%) ! " +"9%.;C" ,'!# !&1!#-#;),:,*L'+&,*$);'*.2Ba W4V3/+(**,-.-2/05.*))38A;:R030.*)//%'-+-.*.348S,0...+(/0,.365114266;7:;:8:LBD>E?:8<=B@EAJ?H@;;>A9:BHB<[zNLNhC6;B;DM@HP[`uv[bEUS;C?HM2375./2%'(%#)36'!!("!! $#" %.'>) $)%#'" '*!!%((BA$)(41*(&%$+9(0C+<0.P sz=3-1.-+)/.3.+:1-380025C?q11.+*,/;/++,C/,+*-78/+(+,3*,-/0036453504356?;>8]=?==?8>DJ@6=CPHU<<@Q:A=XcJKACB?84>RNVUW*ie]EHO<::5286C01-1(+,***'$%%%(!*!(!G"!#"(Q4K%%!'" !# %,)-3'-$#)).4&,)-(+&&85/1,=325<3OaS44(+-+.G)-2+1-,/+-/-34FW^9008/.+.5,)-1;-//0-,+'++1<*+-0/+3020.252538=>?88?B@?A=Asm=G>=A@9HC?<=<@>:CCDCK98E[FA>Ml::;B>HZLF@EBEAC:=718:5342212+*)&))*%!!&*$ "!"% !**!&$- !# #,%#'5#'$$/-4/5:*RHQOLA2/*)/Ec'")%,(##+(.?J)%))++-)*/&+*&&*,*'+0+--+,:,/.(%189-/-00;-,-*;/*//*((,,-.0441/123668875==F?<>?@<9<>?A9??I?>>.*('*.+&$&-.&((&+"(-)'8'+/9),(1,))**+70*,0010/;)*0,+-274--.8+6-.0+-4/,0)/93,,135/314273435568P7MBFC9<<9::>===;B@8=EBCKCC>>@;:@<9><:73692+.287-,)*,)-.)&)##'#&"##  #%3 /'I &5,##%,).)#-2.0-/012=;;=6<=;8AC@=A>;DEGo?::HDJ:@?:;==<@2-,++%%&-'$$$$/,*+*-+&+,-)*(2'+/?***,;+/1/*0-/)-*(+2400.+135-93/0-010225554122:2<693=455257>65B:;==BD=ABAAJGDD>F>XDJB:<7ABB=E<4204=62///588-**&'('.&&&"%! # "$%,"'!%)"* "*0,@7'# 0.*C''--06-?6BE;B=:CFE@@?B=C922:7.221)1-A3/-&,,/&&1?*+$$&%&!  !*3$!"  ! "#-9""&"*'K$&"#*%#&')%$-:21H;1>EZrkaJB5-+-+'-(+0&%(-,'$##*)'((.'-*&&+*%)+-105+*++,/-13+*2--+,/05-331.-54..@;41.37828<95:<7578;9553=54<2/,0-.13E2.+)'(+)%-3-/-"$$$# "'(A!$!!m%.(=!$ &%#!!%%$$(),'+,9A?989?F0twLC2)/#.(+/%(&'))0.+%)*+,(P(&&+*(-)()-6:8;0,(+,-,-.-..,,-,2289/43,2557/127165/25108/7::;=68>>C<:6:::899?DD>GA>B<:>@O@CJD@AG<<;^fbjUORDB@A9>78:376;34?-.-')***1.-,+$#)+(( #,*"!!$ !##!*&$,%"#! %#!&%(! )*'&$-329=SpM* aA:2()/4))'%*()*),.+)')()+)*&$))+**.-/+.20/(**,.+.11/0,-/--7212032038B@902547F?92087::?E69<;7496>>=<<>;8E<>E=>@H=@@?FA?GD=EF=>DD?AACMOFE?<>99@NciUMGQMEKHAEO;6>>C\?AK@EFB>>=KDRLUN@DDCFDC;<<9;8AQT_TLSIcI@Q?>>:>76;6;D2*.'01.*-<7=8>F?@B6;H3:?>5<:389>?>C?EIBGEX99<:9=:78;;CDPD@@?=>KGP:=@@GBA=9=?@ABC99>LOZYMGGIGJO;@B;:<7;6621401:4*0/0+-+2*&(&$$!#*,! ,(% &$& (2@"!  $!("! !$ !#/ $&$""#(+'2Ku tLWaED@2.3*.-2/+,-*(-,-.$+-+-*-,.*&*.0+-/-221631313021-/-234452537453479;H:9557=87<=68;6;@>N=:CKB99?=@8778:=;99F@?FA8>CEF@=CB8A<>:7633101+1/.87>/402()4,,39!"% L.%& ') 4D!%$4(!!-&'!#!#"$"$%)$ ""&'(1;DI@VotO>D920-*'-4.;+),)()+2,/,.40-+.=--00447/1/8.000..02-/336055438<;9253:826:@438E933455;=987?QK;87;95=;;8?<;?@7=9:=@>BBEAK=CBE@>@CEA???BAEAAHEC>:@@B:I=FI`KE=J@LFE>:<;95362(-P=8DB5,.,40)(&)% #19"$!#  #!)'' "1 # ! $,"! "'" #3#%#'# %($&&+/0,I[pf`hQC:>997/*1/2,*,,*-).)*.0/-1,03,,1/1*-,,0*1-=21/-0-.20351126302-/07466:<_:;9?9753,6666C889=:>:94838@?:A>:8<@=:;GA?AIGD>?BADEFHOC=@@@GA@:FTWI]K?E?FG=AD6581213-04:?ZZM9-)&#)%,)* &*&"*. #"? '&%XR3 B$'$ %"$&() #$$!&%'(')%#'&),6XeifydCCG?-+'().+,,0+0:1,/0=,-/-6>:,/-+0555465116/.677148452456H34:8=;?JN6:38374799<>BH;799=749<9L@?=@D;:A:@GQ@?=<==?FB@BHEFB@B>A?:)=/.'&2!!")"B;3!!=,!8!#"" $'"% $'#+*%$&'((+)*@PbX -pAKIjP4).-,4/1,1),)0@A.0.25B90.572*/544621>664D:7;45C<757:8:;433:;9F@9<8:@OH;972<5646:?:A=@99C<=36H=E?F=:==?><<9?BBAEACEBBDBDLGH@>>B@?BHGFA>DFPABDBGUQOJIHG:;@713/1/4/5wC|L;3)+,('##)&&+)$ %(*"#&,$%11'/4p#&#""(/' #!"%&"2(#" "()$%'(-22FU!ZFWWJ8GC=..,0--*0-**239;1--428A1109793A403376@<<9<@@:C73565154869?HA@F979F341879<9><<8?D:?9D<BCJ=>=><>9:;A@@>EFHLJFKCFIGJA@D?FD?CERF@C?DWJHMIHGO^hgMFC=9<566,//22:}MF1)-(+))%#".'$.#"% "!,%"')!! "&&/&1.*  "#%$"$ *""($"$#,%'$%'%((9=M|<9}ca:C>=615.31+.5E112.231431..+322=:85759464:8:76Q@5887<>=;:@@AKGJ?YDAAB?ABHDDCPUCKCD?JQKTcDHS^~jLEE@;7;=:6/18/GYI(-)&$-''"&'$5  !#%#""##2)''%0>%& ### !'(%# ("!#.8("$(,9/R\No,#"^bUF<499:23.0390+-3/288:8242/065.471989:66;88KE48?=::<<<8?>_?<@?@=96B5569A78::=C6:RH:?:?7>OWCE>=:@=?@ADID?>B<1.399J=>39/.3//-)25.3016.399765P8;::888;98=59<==;79<=:BND?6;:77::6875::IFDN>::93888>AEKL;?97:===;?C>;?Q?@@NSMYNeF?E@=AGFCCABKEQ?DA@;ASJZ_Gu`EFLC@B975533+0.66)-4/+#'&)&%/+''###---'-+1E6!""## !  $!#$.$%'!"%)!" !"%2!./786@6/22/,-462.2210-8653115A8?;>3:=78=8?=2368<;9:;::<;<93<88?;A;IvJ96A28849<=?Rg@9;==L=@AAEH8?;==9:<;=F=9\VRYKPVCEEAB=BEEEE@GNGIFE<<=FEGd_oJJ;CH<9=8=3/..))-,,.0,+.$#&(&,'$'$#%** (:40*!$(""! ' !! .,#((23)'$$! #"%-0+-0>0D9<;5;@@?<==@=AFE=?;979@><;<<;959=:=B<8C<><>@48:BC7;>DaHF;>@=9;:?E[>[DB^JCEEFDB@A>EEEHEKFK]MQ@<6<==elNdZKD<@>8764,72+,2*+/1/(-&+&(&&)($(&(*0%@-4,)(!)& ((")$/%$'$(" %4+"%(+!#!)%$/(!&*).0,7@PgQD65Q8=C34722:5845259;68:==8H?7;9966;9;>>D@8?A7A>@C@?@>GB?A;=>@C;8F:=8:<<>==<:BE?EB;>;?K@B89=`K?=;><;?>A;@<>@@89:=98@AD=@D>FBHJB?=GJD?AB=A;B>G>N8A7==<>ABDDJ<7::6K:B@>=>AAJEACA@VFCAECHADDEIMEF@=F^[FZBIMFGYAD=:74B956/-.,F(&(()+%)&,+'./$*)'%'-Q E'& "( "# %!$'& !%+S%!%511,%'0%*%%'%$&+"$+',,565.;99448/1D74;A6/2597@;36DA@<;?>@8=THA=BEBE=;;;?GGDDIDDDJJCMECF@@<;<:8:8>?9=>LWC@;=IBED<8E?CL=;>?A85;GA9<:B>@@@A>@CDEA?FFGPJF@GCE?DKE>BI:CB?>KIafUEHECDA;JBCFJJEJLD@BD;Hf=>E?<;;=:A>?<@AGB=<@LHBA<=8A@=?=@KAEB?DH@E?MAVECDJEBM@A;3??GHROJR>A:=<3045//02.*.+2*1(,+'(03)(Nf))&")39`2+& !$4+=9%!&$'#!$&%1-K)(:#!))+$#$'.?))/%.-.,/2/60==E711/8225:G=995=;<>@H<HGA?AA@?@F>A;?DGBA><=HAB6>CABPPkCB@ACGD>9;A>A;=@;>CE=B=E@CCCC@>>DEJFGHGIKA><;?B?DIKIJGA?:8985546-3/0,'-0**)##(*.+)$*+)0.*)(/-$( ##'4),-('&#&&$!'"+Z<)'"&()*03&&#((,1*(,*464M:]KL?3:5244558<;>;8:?8=:;@BB@>BQKEhb{ZHEHBB?IIJJHKADCCGILKHJNHEIEEBDBD@B@AIGCDBA?>GNVKDBDAC>??@FHDBEGEA>IAFGETcAAH@@JSC?DC>EHDGB>EE>CJFEGMICBG>?96181291-.-,-**')$)*%!+((=+e=$#%26)*$>!$!( &&&  $!!##%!&*$0!)(.'%3)($&%"#3*/,33.704;:@88=>29AB8938>M=8J9>9A@BCE?DIINQ N@??JCEFHNFIWDLIE@BIFFCJPTLHDDGC?CAPGDGKGKGF@?GJPHJKKDGAADCHFJLOLF@;??>CEB@@=GAAEaGSC@@@JFDDMKEFDGHHMOQGLEFJHIFHGE6=AA@CGGIFC:?<:448B1143/,')0(%%$%'$"('.3.5*&%$%*,'"A #%8 "$ #%>.+#$"#&23&)-'%))*&1-.>7035@@<4ICJ@6CJBBCDFTRHEHN?@>@HJICFGBJNMLIWHHJDPIJIN61DHHDCIGCA<@:>818762:/./?')*(*')'&)('(4M'*-%+&$#%()) !#!(/%' #0 ( "$-(  ('*.D#!'0'$&*+*'054J0015-=CAPGFIWMSBAEGEGLLGFRJHFHHJKB>K^hKHNPXUSIMHMLMGKIFNLODIGDIMFJIMPPJPHNHPFNXHJVKIM?=GCCD?JF?CAKFJIH@>AEDBGARNNEFKIRTOFDLGFHJIHII?:9?KFA?ECHQ575973>-*),%*/),(&)/&#(/*)&/(/)%('' " #%&4!#"$/%!!"" )#'&=*(("(*,+)1+')2250/5/5KHL8D=988:6:7899KAA@KLVZGGHHDKPX[YOGGXLEwONPPGFHGIMQPKQVZmrhbpuhVYUPTTOJJIGLOJPNFJFJQLNNSPQTPOOIJLKPQKLOTMLIHELIMLE@@A?GEHJBMJFD]KHIPIJMN^SLGDFLFFIKEGEA@58AD@EECKFDAF:;72:9B0..-)+('*,(-*#%(-&0)*'(#"$#"!(!  *# $)!#'"!#% #(2&!)(()$*(+1&)032.13?=?76BI7:;885=A87G?4;98>C?CSUjxjk^SWPNKS`TLCGJNVKXVEJIOP[S_NPZZh3 c c^X_ORWQOPMJJNSLNIJIIOJTQRQPSNOQLPLQOG>87=48454-.6(+-.-*)&$(')++**+%$"$!"&% !!'#!*!$!##$)')#$$$"(%$&+$$'-'BC-+538993;88>=CI:445>8>?=<>:E?F?FHLFB`l,{dQ^UVWXPIPYMNLTMJQJLIESQUZYQWVUoowJ,'wcVVUQVQMLPMMUPOMJKJJNI[SKSYXOKRNMNPIGECHRUPLNHPVOLICEACGAFGFCCIDCGNEFOPKDIHJJGERIKPqDHNHH>;FD?IFBEED=825>56G4/-1'-**'4(*%#)A%'(00%)+&&$(&+$&$(< #!!!"'", !("#!!$'$'($#!#))-,1*133-33A?00565C9;??6CH[CCECR:SeGEL#!# '!")#&(&&"(#<- #%0$'&%--1/5-?)+0/./1-23/339<=;6:39:=A:7>=<=@@<>>:=C@7660-13-(,+)+*3((*&.&&)''*($&%)'$$.''%Gs!*&+03DKC>,'-%!##$-481,+0.--.+-+/903163;88<;58@B@A;<:FBU{oDBGKROU\\XZ^O]^RRQNMUOOMOTJRKOVTUQ]WgWXhk_Z]jk[\\c`Z`hgwaelc_ZZX[[UYU^Y]e^_]XXRVVX\ZZYbghfq#xVRSQKKKJMKFOPFLK\fIFcPNRLDBIFBGOPMQMMNLRZs<@HNGFFSKEBB?B2636.*2/)*()%.(**,*%'2)'&%))($(+$!"$.(#&/6446jxO1+)%#!7G,(-@/01-27(9;8754=@?747<:;A=E:7=8;98EBASJQkLQ[aj[O^MLSOSTSZO[TMRWV\UNRZUWQX]XXb[YU^\`\^aa]X\a_dh\sildaZ\ZYW_l_]^e]c`c]]dZ`XZW]~^a^\bUa]iVRVQSNJMIJRPNMDLJHSamN_D>E=EHIRLKPSMONHGDG>JIDHFA@B=FB?:7X?=2-**,+*)'1)->-,()%%#+*%')')7"%(''%+*'C4251(&83*&/%&8.0),636.643<=D2D<787CC468=QDE>:7>?:995;>>4=@I?BNQEGNQX^VUUORVOQVRRTdiOOXkPRSWU^QQWUX[Y[Z``Yd]`[Z_[Y_bhhfeke_`^\[[bb]b\^b w_bXXXZ[X]cd_a[ZZ`pXUVRSRUOMLLMIKKLCEDJWp]GFITFFAHKKNNTRUSW[M?C>DMOHAEKDBCL@<<:;500-((*8&*-+)-'&$%'/(*')+.$$#")'*<*($):4*'2)%**')1;,)((+)-+&*246:;=A@47?>B;664QkJ=9?9;:38JW=F>4<=AGJEGAJb]RSMPS[QNUHOSUQYRNOSSQW[OOYZOWXeXcRWXX[[X]bYY_d]_acnigkqk`adgf^Z`d]_ajnd\]Y`[\^\^]bXZ\ZXVZSTPVTYURQMPLLIIFIFNTKXMIDLICBJJMJMMQOLLvjYO`IQHPNIACGL@<=>:6921.,)**-.+,<(#($&%)+)%$++')'#&&$')(#)-$(&.1+(.,*')).-00-1--.+(06?IH==B@;;<69598=<:@B<>458ER?GMOLCDEJDENQIQWVYLUTL^UOTSVRONKNMST_rQVj[O\\ZZ`ZTVXi]\fb_]]_^f^_Za~nshefad^^^\[^]_fh^VY__a[]_\Yb`XWXTXXXUNORWSQQPPQROSLHHJGFIKNCBBEDIJIINOKMLLeeTHWG@HPQDGDED<<;9:BCQ2/72+*-)-,,-+-8'/'$((1/70''&-'%))&(*(#!*+,.+#)2(')3.(42)++-*/887@E9<6789<8665<7@;?=977=9=BBC>@70/5./50*,*.,.),/(/%(&$K/##+%&+,,%$'&#$#*(;/+)()(*+*)A...02658=0368C47>=:7:I8;61;@987;@49FP>?PPOAJCA@FJMndVOSGRTKPHQLF\MKH`MNTSLJOPW\Y\[[[^[W\\]`[\]Y`da]be_cjhiepkiogidbabh_a^d`[a_`Z\V\ga[_ab]b\\ZY[UVOXRMLNNKOUUPMJMG?DFLSEKQDCMWWPKKNRbcZNNZEMHMLUEFAEEBA;;960.3.+.2.%&())&30(*%*1*'+&%'++,+&&$.1)>(& ,,*)'*)/B,,149?C:5D6<7DIREA=H>=A;9;7=9>968:96AAEQcQQQ]TRUONMWKNUPHQOROQeVOMNT[]WTY[\^X[[X\V[dng`_h^_bebeemlpnjljdfied_`]_`^dea`X\_]_a`_b_`]]W[VTW]SWSUSPNIJINHGKX@DEUHEHGIDDFSJNQQV_`SJXRLFIKHJFFEBDG93775332+/,*+.(+)/++(8,)&(--,,+&21)('%)*'$%('%%$3,'+2&4*-3++1=26>28ISZ[dBB9=<8:589:9:8<>@?SFGIAMNFLDGHIQUVRNPfUQUWPTKMMOIKNRSTQU[QSTVTZX[]_b[Z]X\Z^d`dabgaccdlyokugqhjjpmmmjdcdigbbab_ce`c^`b]Z_^_YXZVU\[VVUZWWSKRONMKNGLGHJFGFD>GILQQSWWRRQJFIMQLDNIDMYDA=@;7?230H44-**/+(**)(&)*)%%('*./2>%*&%!0(13$%((&&)-(,/***-1/7869@<=8;@bP:F@=7CFS>>588OH3<6569:>EHDH@EB>JJ=BGKMLEQQO_TZ_cLKM[PKNINPNSST[TXS\Z[Vf^VcbZadZXjhc`ecgmelp|yiknpmosmkkqkicedfb]^`begba^_\^ZZWXWZ[WSMWZYYYPTMPOMLKGLGMFCBDCHLLNNRPUPNLTSUqqUMGGAMHG?85533623713+*&,)&'$'.(+('&**,//*0&"$%$%*+$!#&',#((<*'*((-,?97@7:Q?;94@8BOE>779;957755856=DTHAGIDEFVRHJYQHKUMOPOZTWTTSUOMOX`WTVXUVYVXV]`UWcl_jV^lX]`ic``badbmp7:}ttmnmnkhfozvmikhkhe`cide^bc^e^]_c^bYXVRTVWYSW]RUXPKMKKPILNIAADHKJLNUWSOOTS\QZ~RaFDDCDCF@>4456@5434.)4.(---/43+*'*%))./14('+C&&##"($%&4$+*+/)'(%+9<734123=?98Q73G6?675?;F><:3749:FFC@?{I:31<9EKB;?=<48<8<7:D9?;<>>;820.10.37/*/+..1(,,0,(++0/-.:,*.0%,(&#%!%'(-,.''**10/63437=D@?>ICXRA=?8A6QG<>9;54=:=BI9FC;?@FQLIDFJX]FJMRLPQNMKLJOXPTUPMONVQOTQ_[UX`bgfV^daqtto~#j^Za_]cl{ t{wv|v}ps~zxwpywxpnnimygjcihihnmoeck^XVcYV^V`ZT]YUXOPJKOSRQTKHLPKPOKORRGHPRQUls^YRIDPQJMD?C8B=3.-24///+//0,-)/*'.(**,)*(/,&/1*%*&$*!,./,&('.,+2,48697HKNSNC\C@D9>B8>CEZE<;:89BD@>:FJ@CDETLfCEHS`QMGWVKLGLSRLLMMNMMKTRXUTQWVY\[^b]dajdeghny -e\[\jjpky,|vyur~ - {uxwsppnim rgbflrp aha\\^\VZ]_YY\XUPRRQNMXPQHh]TKMJPMQNKGJVVQ_ycWVMJPzODLLGA<;631740-.1,.5+++.:[75+*''/,(+/;EB510*8.-),2-/480-'-*--.)0'.*+''*/>*-&('&1(+*+;38;<=CEVUGLC:<;9<@:?V`S=>@LNE?B@EKGFHNLJKP`qHGKU[IIGGPOIHMEIBKOLRQLQSVWYWVSYZZn[pcl]dY^`ienjnjiogppu| ?' -|w ~z(}utltrx qnklrlnpnlmlfba]Z`USf_\UZWX_SPLZ_`^khTSNOQ^RONIIE[]cuiagYWOIBIEOBH=?B:7462/-578-,2')+.-5ZG72-$*O3,/4'/*)+5.4J0/+))+.).65>?DITI@;5343284/-/,*)(/-+.08B60*++AA7,,+*%'+-*/)-./+-*'+088DDKGW_al5LsTI>:@=;E=;HFQNjxu}sQOOTXUWVUPjvLLL]ZPPHFLPIIPG>HHMGKJORXZV[cZ\``a]XZd[eguoohjehmqqpvr ~~y{  9cP$}  zuqxpxwsxnpnnwlkijshehxhhfd`XJMaa`aXYV^]Xa_le^]NIJGJMLMKVQW`_UXRUSTSPLC@JQB@I<::;6hEOABLH9?>?:CBbqk} p\[Y[`bWWb_MRMNJEJLMLLJRLHDMMNPMLRXZX^`abUWcbd`]j^fllr{ttoeovons q~ C2 'N;) wqpq~|y|tsppskmhkltsinlmkghUMNTZW^]YWW_Vacw[WWSODGNMPJNQP_gWPJONSTKJHEHFNCAB:>>?740--),8))/.G7=/,2/>.*0>,(,0,*-(,-65533,+6*028JMM]ZuQS[^vgVBCAB@CH=AIJ<@=;84/.,010/.0*,8136.F9**Z2)/-7),2:-1.3*/,).6.67JA9^TIUZ`SZ\e?I><=>L<<@?;Fg9! 3 v{ gTQS[SRLDGINORNQjrSLKQXSSSWRZ[W\`]\bfecmjkwr~ vsu|& - ! v # -  |tt{wy}pyvtryrro|s{nksmkoik_Z_]f_]\bSW[S^n tfXGMJSRQSNWVRfXUTSF@HMOTPYRKO?A@EPJAA:82,/,/-30./,0C15F*,*).*1*'.1.+0-2'++,*-**/+CI9CDNVbWJLL_RB?RGA::>C@>AFCKuAA05.$D|]RTRFHKGOQOLPd_w]`QMKQUPMTZNSbc^``wykflg|szyI53#w #   {|      -wmzzx{~wvuqzzulrrlju{kc__^]`WWZWVXVdt^VOSMLMPWUPXQVVlg^pwJPOTKKLKGEJBSp\<8876.-0221+/.12P5/8-*),0/2,02'30*-**/.++-0./16F:9N?BOMI5?@MHL=@>?<>;=@DACGgNOA0/++:Km^a\QNKHKGFGMLRaaOGGKIRPHPW^Y]Zebe`ryvszn{q2#(+H0  -  }~}zu~}}|zv|vwonmho|pc^]Y__^[S[oeW[e^SLJDLJJTUXQZ^\ZZU^ -rRNNRKSEGIEC<>D7386;D;4,40,.2,6>;>=5)6367979:.55//0,0--.,3C/25@<77:\H<9?>=?9<==;@=9=A?AEJLk*T?>5-:=><7648J=5=+-114:IED>2,+4D74/62030-++./0.0..029@=@GG@>U6::F@9CBD9>:9FD@B?EHKPs'99\^WLYF=x\UONLLFIILTOQYSTQTQVSZ\[Z`V_dailzwmhonpr{    #A575.,0-0<=?BHNQi4BgoMDK/ wdYSVOJDKKGFEcOTS`VUd\^Yc^d^\eb_bm|onntsw}}y~ }~  ~ ~vuyy    -" ~  ~}t{~z|tqv~ ymkk]aeaa`a][Ulg\QVPPNSKKNNPOXTXY[`][huXPKGD[JPC??;;E6846<8380/9/>5>@Z[9*/18832+5++*)-.,+/35+,26/=MIACC<:@CF;;JB:9A9=>>;9@?EITe-DCgz|mJNC+x__[SOLKKJIbbXV]Z\Z_ZXaig`engknwlqn|~  }  {rx u{}  -  x  -~t   t|ywrqkinl^cag]^WXZWVSSSLSPNNOTUm\aRSVTX]rcOOQIbUF@CFE;7::9507=>>533=;J:a@D3,086<2/8'+()((),)-+2/-;:N]6B:A7?IA=65594>7<=9;;?:@ ~ ~ wtvu~   -}  o}{  sliti`^eeafWTWWYU][LIPLOKRV[RTUVZb\V`_[RMJGTJIA>F?>AY7718;875@Q849T=:;==BJSQfUOF\x{fC2ZYUSKKLNROMPP]RV_YXdkgc^d""vixmgoxqv; A"z{x |uqy -~   x|  { -"}mm}h\gg_a^ZVWXWpRQZHOQOOOUUSUYXc[ZS_OBILKOFGEJI=X:577:32020:S;78F@3?A8;53666,(%%(%%/-(-00/424<56/<8887@9883M<3/8@8;499A=FMe>5/8KrvOR'a_WKILNNN^QTRTV\_obbydbZh  wusmgpohu   -xeoz|wzzx   }  -ww %' {ripjckkffl]Y\[^TSWR[OOONLNOSSWZUlgaccHBHDEMCBJMGDA@959CG).$%)$'' (,+2,2356568;H46103310:3+346365<EWJKHuy "- ~]VPJPVTZ[b_`egitlgkmquizoqsleemix -{|y    -"tq xz}wq|riqphhlccbcd[Y]VYXXUXOMLGMTZPLVX]eXajbnsi[PMI?BNF?DFFDCK:24+0<:8759E]{\TaMH?80-05$$($)%''-+),*-00/43:660143<036B83264a=778?JJDDEgu\amgslcd\YSLJNMR[f\]eoffkkjklf\ltkiisakm{~|}}||~xy"zt  -  -% - u } -z{zt~|sutpkki\efg`e`ZZbcYVVZPCGSXTXPNTV^hli\le\JAGD:?LJWEF>;C;:=144297:7ATn}QrnJ@=6<@@#$*-'&*'./(,331.628694?3//..62700/3;/:7:7Q_?D?X^NORY\YXY[a^gNLLWQVYek_a`f`ljgdigpgrflmhgkhzv}y}{{{ - - -       % pnzurtoosrbf^[nddfc^emml]fTSXNXUVVVMYYUXn__cquUWRIEPC>>A?H;@8??6:=6427@=ITah[]zPA7;7;3!""".'*+/./05>50324626/7/10,41/1345<8495Wg??@GHGMJKUWS`inombyWT[^Uh_gk_eZekhhigcgilklnegjxrvz||}z{ - -  -   - - q $  -kpqtqlzndiidelhdihc]_]_Y^WTZY^o^SuMQS[^ibhvwfjTHGGGBDB@C=???<;97;>4AAIH cI``RGVNEB;*$&&$-+)(*JeO=5=53<358/26/41/.4/..3639=Z^?>AECEGGJKWTZfmx i]vid_c`btyoejkmdokefdkmia^^jcl|y|rqzyx{x}~z y -      - - )qlnupnslckfbkfde__Z^`\Z[S\as bYS[X_tb_c"YUQIHHGDB;>H@=@@>8:2@5:T65;ESobmhcNPJ=7%!!#%).(./UiD><961.,.1//51.*20500.7:49RL<DTZWTgxx>ucgfszp{|ihjlhmjof}fada]tju vtzx}y}}ry~xw -# "!#" $",   vt|{pnlwkgnldhimdbfggeZ_b]pk .#y_X^^fad[aogJRQLBJCLR?>@?>FO:=8696>8AN\[_X`o pubcil~ 0- -xjoinmdejhmswiqu|wtozuy}xwru{ -{} -~{w   !$$"&%()& "#%$ | - xmvyqmsuiipziiepdmjgpW`lhci~gx[_bYaluc^]KJ^PNPGGGBCA9BJ:?;::9;7A:119IQb;>@IAJTOHSZ@2'!#"&+-+5306;94:0/.328J:-.)-0/12966:F@:7?IA;:CEJV\dl} xgiupq6U H@riqhmiep ospuuu{xvzzoy}{~|~x~q|   - %%(++*)'%$*'%!%$   |vkrusmkfhnw{mfkmjrm_]TZaekjrrvh`XUO[UR^`f];ObYPLFGCA;=;?F=LN. (')-^'=3B>^5/,871-/.1+*++,0,3344>7>=FLX^_px2)]lkk t$,}Wgnfeds({mn}ymuzrx{{xrtqx}y %&)**+,+**))&%#$  opmqxxlrflr|qnilqrurp[fcaeegjlzme\OGOZmkedNIRWTWPIGCD@B=<9>9>:A@E@4;3CDD99NV=:?;8>69A81")'%*/4_f7>J/-/530-4/.11.1+0+-'/.17203<>:=DBKAGMTWgtsn5Repm{ulxsimhhffmz~*C<ljvx2wut}~ -xy~{ - ~{z - - "'*++,-...-,**'#$$ -  qvrwplruqjuulpozpqu^k\cV]c`cjjg`[HMTR`V[WRZPJMQNEIF@?A<<>?=?A>EF@AD@D:@OD8J755=1414*1:#+&(18DI?;G50J37J83)026)1..+0.+/281/09<99;>DHDWLXW_sFSzfylfahxigisumhbgm6N.qirz us,' - mvvy~{z -  "%%*+-1001210//,(%"$" }xtqpwyxwjsmqi|-"{qtkkY`XX^^\lfQBFLQMPT^YXlRKONND=E>:=9?C?=>B>>AB>D<@DK9=B\HBCMI;7<447=0/,-()''3;,16714,1C170.,G=501.1-3-+0815.24/3:=:5B>LGEEJXOayi_P`udiikndbc`ksccm^USfguwonhhyxsszt -~2v{pvwx~y~!#%(*--/3557675432/,('# !v~ yz~}utztvslknsm|tojjd`aZ_dqTRUNGFFBFMRVZZQPZZICCG?IIJMG?BICB;ACF6;;DZ=:?79356<701,+(3*+C*835.&,,),/270+82,G0+Y-;.33,/:.1/152-5<;;:898@D@6;O2-5303.0.*)+),]835+.(0+0,5*-32Eg6611;/26635/.-/2:4/5>8:<@HAJNKNJVTY\Uaquyvlme_eY_]sfb^gxzhdiskciutmgjqtqlursujx||yzw|~ - %'*--/5768:9:;:986652.,)("  -|}|{lw|tlwspmnfhjufjilbbc^]W[kZSPLSMQWYUXVWbXPPPLNIJOJE@BB@AKBH?@<:C2O=@>;57,462//0*=*,,'*T1%$(-.6//,7;..8>0283A5D318,-.*.://5580><@CBHKLSPZTU[QLhkwg[\\W[`bf`nlvpnjqtudginhgnnqehfyix{u{xtxzvy""*+./259:>>==<<>;6884.-,*& -  - w|vjuoshyr|yifhlccorxdcb]VUW`ZTQKNLMPQVZbWWO?>>]V:A44./726/-+,0)%62E-$%./01-5-9E58K94@4E7+/;:--12,,-,75;5CBD>JCGIJPXSQUUL_^\vpfc_`_XVa]]jiejselircmfrnrrlogckks{{s|zvptr "%'-0259<>>B@??@AA>;9342-,'&! -  ~}{z|stksosonqhgmkamjklnda\VXWUZPOPMRT`QOUX_ePHKWFILIHJIDEIATFDF?B@7;J>P>717<73=953/,(&!   v|xwxzux~qrnkeamggmig`UUWVVQeJVLQMRUTWP[ -_QLHNEIMLSCEFG>GWD^CD@8B9M:W<=6053082,+,.,/(+#"$#8:2((5-1,2>89<4FME4:52002-1+.20=5587C@@CHIGJMMOQXSRSLQ^d]_e^gXQYfVX[f]c]`sbcemkgqnho`cmoy{u}ts}~svx}~ ~ -  %(/457<>DFHJKKLLKIFECB?<74/,' |{{~~y}t~{ pqq{ysopomnnkac_oMBFHONLO_OLKMKLQRPL>FOXWOJG@KGGLAILH?<8:?BC@4DA956,+''.++,,+)(+)!')J;%-/3@2224659ZJ3:5.*,/-022657?@C@ADFBFELW_ZUX[:Bemmdh_Y\i_]_f[}dW_ad`_^_eiijhjkfhpsss}utw -vtwz{| -%,138>>CEIKMOOOOPNLIGED@=741+&$&   ||~~~vsu~{rww~vnjksh`_ZPKRJEHKMUPULGOPQOOMH6GSZRONLIJPWG?E;AC?=N@FU75744@210,1*)')*&%,*$'*-4C3,;EJ:;5I.23B./-+++0633;;IMD=G=ABCINRWTSZ^gxxrtgw\[Za\k]y_Zf[laa]Y`ammoneinwrsqsooxyx}rwrx} -z!$*0127BCGKKOPSSTVTROMJHF@>:41.'&   -z{wrzz suxznjgnixli\UTSVRLRPLSKNFKMXNKNF=EPMPT]RMJHJaHCVXH=DCKAPB;9A411/001/)&.)$'+,&"#'6/2Q878LdLAB=?541?175-+-,16APE=7<:EGKNQSUXXZZWUSROMJB?:63-.,!! } -|z~{yvy} t -mckhsmqdb^VUWQULNLLMFEJRQQLTQLDWSUOTSLHHGHGLFOVA@FG@[F>:817/10,+/.-,+$*>+- !(%,.-FMB2ZWjoN5;561/,5=3--+25^I;8;:;EDFKHKLTX]\``bpkothkabq`TVgjfoago^\a_ccdafoqiyvitlltyz.|{xz}  !(-058=CGKNRVXZ]^]][ZXTROJEB=840.-"  ~y}zvyu - -rzxrtlfjjllicg^ZVVRVSJJKKJUOQNOSTUSTUZW^TIIICA;=BFEAA?LY@LOFD9.132,.,-17+*-)('7.!#')0&-Ff74DPFH<95510,1,8-0/,SKCHHVVttBA  -jhjY[YYSOPZWVWUVVW_\\Vd_W\cwjsusciqloquvz{jpbl|}   %+04;AFLPTZ^aegijjihfc^YTQLGA;72-)%! }|twxxx|zqyxqshkj}7/mi`][\VTPRSTPHKMHKIKUSVPPL[W_SPJHLNGH??B>>=RCOJHNEH>@613.88,2*+)##'-%2')(-4,1NB3BDE<8=>29431,+)7//,-5>CINSX\`ehkmmnnliea\WRMHB=53-)! - -zz}youz|xn~y}lfkelvogadZYYUTT[VNIKYLKLKIOUTQG]RU[PTKJGFAEHH@A?CC>QKXcNA9:/,+4:83*4+)&+,&%+*(*3/=;PIA9I9=A9.20-/-+(/+1/259>KD;;FEHN[TYh .z}tkc\XTUPQNZW_]jyV[Z\\YU_Wbkjumhhlrqknzonr|}}s{uz} - - %*-2:?DINTZ_cgknppponieb]XSNHB<72-*#  u~zvypr{mpwvtghomwljgddd^bW[SONILRNLLHHNONTJJ_TTOWQJGEE@FC@B@;CU5BJf@ O882.132?74.(#! w|t~yu{{}}vpuhhsxtjiafgth`_WLQQSTONJB>JPOONPPVUWRMQLJHBA@NNYEAAGB6OX E@-608/-21*'(((&(4:+2-121F_UH94,>A63./-+*/.-C+*33469;A>=JAPNYk Yd{y]Y]Taj[ZXXUgW]X^Wg[c\ZZWY`bX`lr~elprmpqrq|rvwzzz|  "'+.6;AGKQV[bfjnsy{uqomhc^ZSLHD@:4,(#  -~xvwxvsx~|xxtrihyvgbihvl[^\QJL]MLOI;732/900,-,,(66C7:7@=ECCDQz#eqy{YPm\Za`YYXZ\VX^XhSUi_Vbdbc_\suycRkgrojls{{psvyxw  %(+07<@GLQW\aekosx{vqolgb^YSMHD?:3,)# }zwtwyrzwz -|uvxsq}rkljhhobXY\MJGQELMNHMONQTNHKVTRYJLHKJFFDAFCDYoCDHKGHA;34602-/,(*-+%"$&#+%+577@=9O=36E42<2);J4.(*'++-2C>;:<]QEH@D]9lohl\]Y_[T_a]SYXTcX^`bS\ZX[`jgweeknxmrlfgisnmhoxv{lmt{{z - - $(+6=6B8R_YUAPIVgivh]PP_][_mX]Z_ps_W[][Z`[[^cdehgg\fsmjjf`klnlopyz|{knu{}} - -!!'-19=BGMRX[beimpqrrnkic^ZVPKD@:70'%! y{ux}zw| ~ '>ynmowrjaa[^ZWKNQOXKFHW\mkTKS^DOKTenMIINNSFAFMIJEGD@I>DFMA:510./)+,-+##$"!"%%:3kTce>YD:97351(1C5>B+(&(,5HRM@FB93/($! }uz}to{ v~ - GH7rsdjie_W[VUXOLNTRQOKST[QINUzSQUSYYLMWQHNFFCEFCFLO]JbXPe;8/19/,()+(($# %'%1.7g%{PD;13>;0./3,27+3,().07JAGdxLOQBGJVSY^Xg-R b\b]piaQS]lrptZSURU`aV_ifg^bpwnkvjiolqpoinmrlo~   "(*27=>DKPUY^adgillkgeb^YTPMHA:62.(! - wxwzvuz|zz <(}umlj__^V]QULSONKJJOKPLUSRLXRTXY[_NLIFJGJACJQJ]fJKJH_m81.0+,/.'*$,&"%('"'<<8KpH46825480..9-0//,-):5/,%" |~{vs{~ -zywmmw~~hl`a[WOLMIEFNFFIIHGIOURRLOVSWSWSIDLSE?CBKs_uPiIIP_kbH2,**'&-&)&%##% %!F;>K>527,,.7/5208239300(56/D JNKJNIFNLTSddmymfZZS^df\`_q[WWYSVXQSZ]bU_Ydltxwy~{tovpsmsjp|xb -  !(/5;?DHMQTX[]bbacb^_\WROJD@;72-*# { znwwz{|~|nkow{twsqpickX\PLKJKDLGJJFEDIQVTUXTRbUXgRJILEEBCKT}nZMAM{OhZVB2+%&(#)/*%&(%$#('%!=A<;3,2,-+-3.37=7/31<6:-,.4CFJORVXY\^^_\ZZWSOKGB<84-+#!   "(sxyv~zxvmkpw~ mb_d\Z[YXO\NEJCEHEEONOMRM\\ZYUU\KMLICDHFNJEMMGDPv;<;J832+'+.*)*%")$(7(&,&O73074/2,+.-(27A=2:5541/,*-6839JFHT?@TYMQ^`Z\^^WUVUShLZdft!(#piqVSQYPR[Ta`_nu1yseizxrrnksft}w}}|  $%/06GGNF?<:8@47B25.8,,-*(!'#&,#&& P[3970+/0/.*-57.61/0,)30-76;27;EA9LEVEIOPNWbYf^\WTjSPXhcfo,dgic\URWZWV\]xeij`ohihaoqnkhosovov{~}|z~  ")0/3:>DFIKOQTTSSTURPMJGC?=85-)'# -y{{~~~zwzstknsiuwnqlda`V]VOFIHMIIBEYMDPVZWXbXWPSYUXNDFGAB;KEABDIYFB=?2<>>81++'+1+(3"#"# %%:;@:1-101,6/1/2.154(%0/829AhDD?=LG@EN[lJ?4bH068051((,''**%!% &!%"15AD9430B/14,',./-(&*.56=6PeD=?<:>@>BDCFTUOMIKOXdSYRWkYgaGISS[_]^ZbPQ][\`[k[bZ_`fb{rsonlghqokt}vvy - - "%)//7;?@CEHHIJLLKJHDEB?<84/)(&  - }v|ow}}}z|uopmt{pjhh__[W`UMPKMPUILLRVUXQYZ[^a][XXSlsICCBE@CP;@7>XFC2552.1*+,,*****%& #$0(" 7;K102,020220+176$)(,./9>j)!D<:6957:BCKHSIVPQ^rciXRWZcblfkvV]\bYWSWTUSPOO[d_X]Y_bjzyojkiztpy{yv}  %*0237=>ACDFGHHFFEEBA?<:4/,,'# uurzzy~~~{w vkwnoviih`\Y\WZuRKGGLNTTTRPUVTWXV[WYOABK]_UHEE?AC<:751,)&! zzyxvxyyy xuqlwyphfgg]_f`pUIJIJO^QNOTWX^[Z_ZY`SJNPKPQKHAFEEBB:=<=923620/,/20,()%*'.-*$&$##%pP43>?*(*Z=,.;&&'88)--01Bk~G<35349:;=IKLFKKQYRPSTXQa`afi^bWUYUMQ\RPS^Y_ZcZ\XUg_^evoinrmf|u{{{~| &$**-156:<=??@?>>A>=:7430-)(%" -y~zzurx -urwusqnslgfia_q`YZQPJHKU\QXQUc[]bTUSWUSOPMPPDLC>=UP@8==423421,()***-(&#&'.9/+-$#%!;714,.))+Q90,0,'80(.-2:76BIE;15866:<=EBJGJS\[MROJRTS^[]Y_WKNVWLNZPVaROPRV_ZZVQ[e_`ivqo -ld~pw|}| -  &*-.246:;====<<<:752/0-*(#"  wyz|{w} v|~ zusuvqmmij^mtl`_^SOIDEQPSUXYZ[VXWR^WONSTMLNNHGSOFF>>4220116-,),*-(,+2&$$#$$%0K.''.#9040.3+/&(%(**501-**'72;4;6;451859=M?ERJAOOYOHNKITTYXURZa^\ds\LPNPTPQU_ZVWU[sZZ_cfkw -x||{w ~yz    !&+-04478::9:977641/-,+&#   ~y}~z y~rtqsw{~upoghkkk[Y[\PLKLHMLZJdVSQORYUUWQRMNLQLJFJDSA=744<:-++.+($,*21542++1-()0214-097A:8?>QFW\LICIMEIVQUOWZ][X`YUqpTSRTLMSWQ\N\Xqg]]\`]^mvz w~   $)*03367888765431.+**(!    - ~|~{~} xrnrtqn{}jfoyfa_ekafTMOQMMVWQRRRTSSYWVfQgTTMQNJSOKJD:;9732.2*-1+..,$(+'*#3%()("1(('"+2402,-0**&),-2)-543B0-+(),2.,66N35BEHZOWpVWDJSMTPLSUPOWTa`cf`VVSSLXLRY_VRRiY_^^]aclpz/$}   "&*-0243565357410))&$"  } vvz~sxzmlnpuvqlnnwkfY_a_YSUSSSUWXSMVSWWTQTKZZYWPNMNLFKIDEC>?62261+0./(*&%&(+'&*,*,&%.&'#D"524//4*/)-(1/+-402CR6()%),2,//-046:FKEQWSXORRMPQRPIT[RKTUa]h^PaQHRIHRVYQZ_P]ae^[Xaaplw%,() ~z~   !#(-,.122211331,+'&"  vy }z{|pssurpryzostqheg^W]b^SPQSZVo|NQZVUUWS_U[ZiXTSPLKDDJNH<;=.0>67+*-+&%*'&)(')#,++')(*=0*&)+**);*7/,,846==).PQ4+"'.*-69//27?CKPpjMYhS^kkUXTQJ[bRPYKTL]L[MKGJNMTXSX]WU_`T`^Yddno|9EQ<&  }~x { -!"&))+../0.-/0/**-&"  -|~ - ~yx{usplmxq}lotsjai\RXLXMSMSiTTUTWTY]VV]UXPMWZ]QMbDGCEC<5K77;:.+(-*)*2*(+&(#0+-'))()&)." !1,*-/+?6-=u:-491).4,2$.1.-/60570QBINqfUtuc_bcXd^GMPJcZQTLOPNFCHIONZaTU\aW^hd]Z]_cpimy ;s{X# }~x| ~ !"$%')+-0/,+()%%"# #  {yu{xxrnms}vt{~caaYQLNPQSVU\TRdZ`Vp^RX]WT^P^{e]^LCTDE;E=WC<37/&)(+.0((('2*4:*)./.83,&-#)D0+,/))--.13,-75)(-$*3,,66*C-,,=;??HONIVrY]S^ajxOTIJND_KRNTHFNKMIMs\YZMSRVY[_aY\]filr0mwU"y|  !#$(**0-*)&'!" %$ -}| -~~vuyxrksx yp{f^c[MWJPW\WXVSU]P\XSTQW\]_PQWhs`VYdUDJLG=<88C26,+.+-*'**)081<03139PM:00)*3-,,*0-=016,+%&,+#.(-72)-.170*07JFDY^XQk{udWY][TaUFPLSXJOPHEGDGQMDOYTVNOPY\W_fmcetkls -:?OC -{ yz !"!%%(,*)'''&%  -}}v{voynq|{wptw\ZROPSYSMLOXYRRSZ\WQV_c^X\^ fXj^QFAE=96;740.,-$*-0314/%,+*10@A+8>75(4260(*/5-(/00.4#%&')*1.-1+.0./>131<<164.74'*-./.+*,.,,-(I373/9LH86>921-*-'+)(/,2%''*)()+0.2/,+.//:67B=7BRbn3h3\PU[VHFKKHPKJDFFMEEFDDH>GPP^SOPRRRUY]hfkigk, -y{yvx}}  - - ! #%&!"!   - ~ yhmmtltru -.)~ned_^OJOV^KTOSQJPRSNZ_e_W\RT^Z\_IFSDA?OcWVPPTK\G@KCEIJ@HNUOLHGHSEDGGHPURLLTXOUY^aSgxx|qz| tm|mjy~     }|}vr|omqptntru(+ d_^dMUMNNVXPFOJQTLNI\`doXUcXTWTLKKF>BA@:99;320.2./2-'Z -52--0,+)%4+,.*+*Y45,)5/*+).--1%&22"'33'*'(++/*..328::=JIPSkr ]MXUTLGJCIRFBJBH][HIGDMKEDHHGOVOTIQ_MLd\Vglqjqro]rqyqzvjotzv~  -  ~~z vwywqxplrnnyx| ~wZ[ZSFELJQNaSUSYSUKPOTdaXZW^P[Q\XLFKMG=;;=;=812.1,+.+.-Q3/--.,0&-6-/020=we/,'4/-*2(+)*&(*0%#%F+2-+%'2)3/B?GFF:863:=20/-)(*(,(&(*.+',(,1&6(+*0,--,)-/-'(''(&+*(+((' ##(%'.,M.-01872@>E@7=<;8:6471,6'(+))(-+'/)')8&/1*)-.(&*&&+-0)&),(0+02%,#'""&$%/6?/-4/'/128:E>?@:IDHTRLOHFHIHINJHO?>LOF>EYALIOMIIEOTJV` &~dad`jvo]g }wy~r~jrpvlrozz    - y{|z||uoxwuyupmwxsnbi^]ZWXVPKMYQOQROQSVVXUY[TWYVUWVVTZWJEAE?B?G?AJLOJ`GGFPIT\cb\ebhhntwjqmsr -|suqppy ~| -  -  - -z -%|wwypnqwnyt{owqhpqopma[XWh\QR]QQNYTVSSUYZ^cXYXXT]WWTPNN[XG;;<6987:=GCJ6.0*+*(.)*%%)*+.+&--,0+-=),0%+2*@*$%C.*+-@c3_)''%())'47>9/6?1337GFELDHJ\r\[^ZdYr!mmjgjmu~|ntok}ssz2 yyxy -~   }|}}}||trqqmllktsukhejf iaV\YYS^PRSTTRZVZTUYf_YVUXOQQWQPTOGFDC?CCLB@<2G/0)'.>;,4M98@QGPQ]^c[]a\fJHCQLK@GR?A?JDBHHA>DAF@HGFHDEIHGGN\Ydhmwujmlglsrux.zhntlpz| - ~{~~~~~~}wztwvzpqqgojfljfg_]hb[\UQNQPO[[UZthZVTSQMNVPW__^XVSOOIFL@CA=HEDC??@D5SH=5:28-+0+)((3)*-29/*541*&(("%02%!")(% !6'%%'$" )/>N|~EE?T/-11205BCDFFIDFBJCDCACFNVZ`dkgjiipqfz|vojdksemw  -}}| -  -~~}}}~}|zvwytsqr}lqcegddcddg_[UYLMPUWW[b`VSORV[XWYXYaZYVUPJKHL_KDDHFJ\RA>L>JQX<648++-;+****',(.(15,2)0%%#"&.+'#*(6"%('#$".&'&7HN8'C=;601.2?2=EB<=4-+)-.3((,+,*1)),22C.*-2-"0*#""!"" "#7,8'407@U6D7+)'(+15A\:DFEHHEPU[]Ujxnlot@? -y >/qo{'=w}x}$ ~xzv~yz~|  " } - -|{|}{{|}p{tlkpqpphbbnn^ZVZYUQPTNYWZVf[_]]mTWWZUSVWXQUuTNGFEAFDI^`YeJUd<8CG8.,.).2)*)-++*)+/%0/8+%*'%$!$"#)#!"(")')"#&,27EA;@94*()('+9J54:9E?DBABCL?GBEJDKRLV[felarzMgy~ p}(mmuww{"zpsoutx~}{} }  y |y~v~yqkm {o|ah`{dYYV^\R_WRObV\OXahk_V[n^^[XVYUagwoZFIDGGWQSMEGWx~sMXB=:1.-)./('&4W0('),-+-.%%,6',,! "/ !$%%<6&$&1BEB0(+E4.(%)$*F262472AEXYIN]^dTOOQIOCEALECE;AADUCECHFGH>FA@FJRPbamvnlw"E xtwwpruxrss|zvso}wz|~}{~ - {!{v{ztkusnund_^`oW]^\\WXUMRQSeZTZ_g^ea]\WX`][WSSa*bHGME[@M\NLI@YB<:<2588;/,/-2),*')+2)+,,*,;3(*+$0((*-,*7##/&#"%'*195C;D5<5*)&'./,1245;5HGUxKGX[jLJCLKHGFE@EBF@AAKM?KAAF?F?MEE?=8<:9>3,+-)3))'-4.''+&)',))'0+"%'#13'),$%#$.93#2-NB_qB/8-.(#((*03/31:9@Mbb[TSWKLNLJCHNFHB;=CIDCCE?DVCAFDJ>B>@D@IDDRRgf/xrkn`jkaecqZcmr -rllquqxxps{yy~uq~yz~~  |x||xuntuw toroesqklgtkfbcg]ZbR[YXZX[PY\WWWTY]_[a[RTjXXVQMLHYVKEDCIVFIJVb_DC:=P:25?4+,.&1+-('.)*%'**-'=+T/(-#A0(*4''(2& $#5$#&5-_) {@,,,("=$@:4652;9A>FF>9LBBEMhYPKNRTdSAKLQIILKBCFBAE@8?BBF?DAAKKHI=CCCEN`m dbrnahzg\^deZRXbhmnnpjjmuvynttyxu~{ }{|}vqy|uwxrronw|wwmxlvinncf_ba[be`^^Z^WST]^TUVT[RZ\WTSQUUXaYUXURQNYTQRLFHC>JFEDMIDE==A=?@BE9=>EC@>ATKPW_]cdd`|~cjkgpiiZg\a\`s~vvgf\pxqs{wtswrvy -~wqs|wpminnqrjmvmiuqlpdafc^Z_`ggX\WXUVUWXRPTUZa^YZ]XVZZV_`VSUOQQNWIOOEHMBBFCD\TFG@IkU?99>E;0-1/-/20'*01%(+'(&0('.TP0*.+126$,2 #!P%! !'%( ($! !"$%##&2%+.:9F?CJCNHFIKUMZ\PNPVSK;8=BFG<7:ABBA?GEA?@?=<;>AILLLRWwiddog]sqi^R`b_ad^pupsjf\gfrun{rxuupqt|| |~yz -xgljlqqktlhmdanqf`gY_Ya]^]bWPTWWWUZTUTUWY|]lSd_\WWZXaaZV`TPNLIPRD>;B?>EF_ONP<>AC@A9/>5@/3?+.(',1''+,'*((&4$1))(*#*1&%(25/#(+#$!!!$"&"2 ! "(!%-()+,043;DXFPDHMKNQX`heWceJ86>;?@@@EG>@?DD@?GDCDEELO[,gpadc_jucRRlghbinpebq_Yfdxprvxxqtuqw}  ~xtqstvkgnqrm{smrru|m`^gq_ZYcZ^[\SW\SV]XZ^`h^WPWVRY^Yf[QVZ\]ZRSSYKKHCD@CB>=CKQNA?G<8883852+-.,.0+2A20'5(,-%)&$#!+%2)%'$#')&*0-3(,"!")3 !)$+!!" (%)*+)&(,C+;<6458:CEMBKVXYveqxY:7K87BP@;@@=B?;CIC@?D?C??A>AFKXddh[Za_ede[^k -mrptiuyqoe[`__ep -npoqtqwt ppnm}nqjlbf_gjryxe{whdo^kc_f`_zc\e[U[\b\X][\]XT^ZUYZ\YYYYVZT_TOLJMA@N;6FFBBAA7;2:9./0,322/---,.-.A2-("$--%&1(! &)&''+%#)+/(&$"/ %!"#$$U~% !#"$%#',.28FA1/7>CBCGIPqibgniD7563;IFA>;;A?:DD=87BA?EL@HDFPPQ_RVb_`hodfeegykhfaqrqdip_Z[cmolm#xmu{ozxrupvifkmjja`he`chf^T`ia__]ahtbbcmfkg^\\]WXY]\]QRMTn]^de^\[aYWTRMJGB@<<=?EaCHLGebdjaS^qJB99/;F@A@:9@;?<<>>9;CCER;=DBFRNTPWcd\fpiefcXSgppbhZgig`ddwjcmefkvmpgrnyssmbemgj~n`f^idbUgaX_Wg`Z^S[Y[`qdVXW^a_ZZ]YYZZ\\\YRTWVY\[ah\W[]\OMFHIG9>7;7;:;_a>27;68662111-2.*+.'/*3.(6(#+20+&&$$'#$$'+),:A/-(-7'$.!*#!")F$ # %%.'$,27565=?B:8<<=@>5>>EEC@AAEKWSTY" ]fnbadt_\beshg qgpZpkhnhpff^dnnmi\ailhihlfrbgkc]^YUX\faf[XXSTXcaabWWVVXW\aW`]UUMSRSOVTWUVaY]la]WTRMKDEI_>B;=;=B6F?J:9;85/06401+*+*...*%&(.F(%(-+*&(()'($(;*(IP#((J47%'!'&($$*$#(!%%$($(4326A9?J9CESJRNPW\XVNQSD956;8EcD@4:<<>6@@>@FCA?E=C?CIMQ\SjbWX[cbhad^edikir3lagqliqliiZ`df{Z^f^lfdczjdbmhjlc_gd`_Z]TV\Y]RUWW[_aZXTY]YaYcs^]\YXX\_]YTV\\^d\\YUUNHEDBBFL<<;:==K?:8FA@EEMPJUlULQGJLFQDE;67;Q@=;;:>878RA4?AC<747.)(.%-/**--*)$!$+*,,0()(')$').010*($%'/((+&9%$%& '!'! "  % #%-51-/3@I=>O>ADAAG><579;?B@D9CHJIONGJOYxb[\`ag``[chervokqglln|QW`a__[`]c^^f_fjsmivntbXYZXUae`YUS[X^plqeca_baY[][YW_mi^ja[\c`c_UUWPMSLMNNNE=<DEaEAQUKNJO[\W^Z_fhfVa`mjdohnmhnjgi__[WftfTWh\^dkehfvp}yfeaV[Y\Uq^iVXXdYapuzhlfei\dd`nZbki` h^a[`[e`YVTOHLTONVJCBDC<=E?89>A@?6B66271/**,,+.1--++'*&)+)&.-$$,'1+*(&(,;75(1"1+%&%  & 010! #%"$&'(0--71?^9@MB@?O>?I`j^HBHHGAKNODK_:45>>7?7884>:8:=CL65A=B>:;A=94;<7:7761./1.5)0+($''%%-2-)()'%#"#%.(*+N3,+(,'#&$,.=H!%!#*' ! ()''227;:7>@@GEOM\MQHWTWY[VbZ^ZZ[LeeekdhrpZdkhj^\eWT\a___Q[Z[[]aZkbWY]ZTV`[bg`]`e^^`\\[[]`a`djdc`d\ndaa^a^eXYVVNLMURLVLQE?CDAD:<<;47<:ED6325332/26-1-)(012+,$$()+*%'"&)37*'*4.$)-(*$*'QC"#(!P !  #&"((-177CEBF=??DAKM:2693469=<=?;<;:=@IBFCHHDE;7Clb62A488;5858:CR==D>ACIISHAH@GCCLKKRW^q]]y`m]fbfb[U[T^aaa]Zc``PPTYmxul`nc_[Z^_ef]ddd`deb_c_aZggaa][[jf^\\]`a^ZYUV]fxWQNMOdwVYbFGJF?A>E=>>8<;<<<9<@=;??A_SIPFCDSCCHEJKUVTT]ai_b\fb\__feiaYPQZ][_btps~uujfbj{kcd]__e`^cbkegfe_]fb[iggj\Y\X^VYaWVcZUWMRLJLGKPVQST=JGPT`GLEJJB<>CB;BIHEKACa@EBDBPNNTX\`W_]^c^^e]^pmja]^_Ya\Vioet x -}uiccagfb_d_^bh{mbe^bablakZZ`U]]WVYWUQPJPHJMJIHKJKAGEbZWarPdnB=?<<;;A,1.*363//-+0&-02+)$&)&'($+,(,(.(,'+%'$" ')&!+" ##+-/  %! "%,/+.595:A=CEEJG@ATAB=B>:9<:<:;895-,.58842299:=:<7HI85:FA=@M>FKICECKbXMXZVZZaXZ__XXkf]\`h^hjdfci}$zvlc|uohf__\_fkce^la`]bmhf^YT[TTPPLNKKJHKGJJBFKJCE@ALDNf-?fRD=;7<697?5212163.71=0*,-)''$&#$(++,&/*0,)-)6#') *%*$$ %/!"0 ,)!!"%*+,3145E?A>JC?CABACG>>:;<96=9;:=U;3+743157:I8;<599@98@>I:EC>FD@@GFft^VVURZU[W^XZZYUi_\_W\aX`ebfsuv:@)2znlm`_`]]Vbd`aZdXjmka^aMZSQNTRcLGJIHHIGKDOJADNB;BKHS dRFC:8;::926?3:3,48F-,1&,+'*!'$$ ))/'/9/5*%*(*$('"'&$&% &2 !  #$#+1,0AE?F>A=:I;DAGD@C@?EC:=@88F87APD48/7>:<@;:?979D;FDEC=GC>LMHNBl`SOTKOPSRRUSS\Z]_ZWa_VZXZ^Yffo -~h}wvvr fUaWXXbdUYWW[TOW`^smYXUNSKINGIFKODGDCCGLMJEHMIJ>DFKD^_QCG>?8:?:@f1>64M>532,)+%*408"&&#$()+P2.),+-')+*$&&!#%('!" $# & $*/2-59:9GFA><@;AGCGI=;FA=<;:;=X4CK9<2358;8576=>6=ID<:@??AB@BGINK[FMDHEJFJIYVPPPk]VWUXYVTVVXX\fc_uncmco|johl`SV[^RZY\VRP`XYXXXU_VSTJIFLPPJEDHFPG@GNFVWJ]NDCB>CADFPGCEC@=B>6BI>=5>A9D>EEA;;69;5?3:-9142/388458=;8;::98>FJ=ABG?EJ_jUCJABMLPKHVS`SQYPXMSZVXWUS^^beXYYW^cnci`\]bXXZTZQPWTgZTVSRNNNUTPPIIIGOJGEMHWFGEDCJcgigRZC@KCDB:8LJAON71.-3/54/)>8;8-3,)-12**13-*'*2,%0&'?T$"%()""!4 # "&&($)$)-/826;C=7;>EEFMB?>C9F@;99==E7=9;<1:07:82678>><@;C=E<:E?<9:=9<96BU<69C0+535'*1*/E-)3*),(*.,,0(*'*%/-%&$&.,%##"("+: # *'''!'*).86@7?>B>E>AAIJB_oA@87298;:41534146;61:83;>>AFGG><@>ECGA;EIPiC?FB;=:96:QI64;6A5390-1B3%(13-.&*3**)#,*--.-+5-%,+24)+':"#!$< 5''#!1$$#$.#+)%C<=>;>M?C=?@?=FC@@@<=:768492545559?9/>==BEJU?9;?=BKSUENKF@BEIC4;8:<588>9@31996K2.60-%))+1.'*1-0,-1-./-1+,((3--21577" 9,1!# '#!( $ !+*)#%(*./<1@<7BC9;G?FEOB@Bc<3:957CCFReXNSEB=C>DG?NhBPI>??>=CCAHDFEJZKLPFKCETm#XaROKFOYUQbZUOYSWNPPMI@CCDFJLFEI\QLC=?FG@><><9@?FEWAG;;_@<:;8;388950332260@5N71,+)./0,*,08,E:2(-50)((,.6)"%11-,'" 3G*"#"$. ) "*7*&#*((=15736;7;787FEFM9<79DN@7569569><6;=<15;EIFL|P::FF@@BJYPOE@J@56<@BNFDCFMNMTMON@Lw#y[GEKFMGJOMQXZQSJHDKGFDDECIEJEELEBCG@>A?B;?99;A?>GDCEA5.8@H=CBCRBD?KB:=BE@:??RL75A?ADDAAIIIFJ_HGJKPcQUFHGIKLLPINNYNODEB?CDG@?AB@ADGGGB@CA@AG?@?@:7;98;HBI;:B;DCI?]TX?8HK@:78BE>789:?:324.39C8?B4.2.+);-$)(.CN@0,.20&'*);5()KK11L092%)$!".281!:#/,$"&!,'+5&.1H=5F7<9?=9A;@BBIIC>8@GU;;;::AEF00:<=>C>97K=?9EM=PIMGB47=@COC=CEJGDFBEXVTQ_JHSNFB<>@=@F@ADC>GJKFKDCAGJB9@787963BA>4^?66337241S7;;1+-)))(3/+/-64120+>./9)-()-'L*,/7,#"1(%0$#%#(  #")'#")%&$"%+,1127J493>979<;B@A;AB>>NEKNMGIUjFK;8@FJDCAGGIAD=>U?OEABE?D?T]h WN?MFBAH@BCDE@D>DBDFCF??B=;9?<9<>9A===TEILcE>B99?778;95;52337T823107@><4()00.2F330/93159:P62@*1()#3F%-##%#%#)"1%'#* # $$7-'/-+*12@6<@@=7=9CJn_n=GA7B95ABBD647<>J?653>47;<>BEHI@IVCI;===BRF>>D?A@Gab}~ZRCBFCA<:BB>=?>>B?5<:>:?H99<@7448?B?;==5BEE;=>E639;6;?5;57243=;2957,+1-1K:,+157X9E33414795E60,*28->84-$ "#"&((&5$+!$1%"$73,..058594;7?9>OkhjC:6A9=>?@>=E=@<8=5;7:9=;=B67;?>?=>@F=6:9KE=>DH;91765455S@93:/.-J4+5.5244@4EB8/ZB9:8;;>?;?>OD5=P=89444228<;:<=KOAB?9?>>J=K??;C@?LJ?B@CGPG>E<9?:==<==:A@Q}wZ>=B@>?88<95:>D<:8430>?96888;<9;548;15HO318M9A-&&2-'*.0362038823I=A;@BA@99<9:SPC8507;??;><46<9?;>@CED@8?B<>94D?=>BQL@TB@@GKAA>@D;86H=78>?>D\[HG77>9@J:>;:=E:N89<=;C@>KABC=??::?=17666:9<6>9<:;815;4=C63>?:C=@=866:;<C:@=HNDE?XL?7:<8CMZK>IUVD@>bAC<68AAB???7B?@;E=:8:>>@9:??C<7>BMCAA@?G>=<:?GC;7565839??C:92;A37/87THAO:M6KBG=FE=?<>?H@ArJP79B>FW[==Q:8@99;E>=>CC@EB@>U@C?=:689A>;;AAB8B>EBLDB9F?LHG>C=C8=J:47<.98>;C4;F:548<:71XA?>G;; qC;<83OI6hc8=942-3308-.429@612_*)-2-,.-*+"41)$(">?//2F#,$6& ! 2#%" #%(&',).1*237-.>bYBAB:>;:9;B7:@8>B<28=O>A:C97DJGEL<;67;9B=;DA@NJ9>FB>=4:O@?E9C9=6858>P?9>KC9<:762-=M7/66]UI>5973:D.<=@00/+.-+/7;/0.4./.-8*/1..3:23(+'"#"#++.';7')!.' &# <$%!!#+ %.0.;/=2/0<:<5?@=<9;=A6?:5<:7aC91><DDE>B<8HC?KB?KA:D]EF;MHTEC9PMJ>97@A>7798?:9:E:<C?>?8=>@@HDH>:?A<;::<D^ZFFA<98=87:9AA@W?=:?7=2N9-JZ3275NF;A66:368+10461:+131,>@3/.0..0)*/-23.3<8;#&'3&$(.*%*4.*A1" # '$'$$5)1161.&0>2-1/*+18>98A`C;:9419;D7A<::K=<99955>A>O>@HABPNKNF=ROE@:<7>CE??7<:=9AB8699<>986AB?9@=C?L@F;JG>98;9;D9A>=9:FJGHLI;9;?;;KhV[eK@7;8@6567785/4-,.0:219>872-.24@853=7308/2/0(-1+//-61-/>,+?(*-"#&.8)4+&90%% -*!0*(%')G;6/*60.+.33/>3>>7>=>H;5A60@;<98;;_HNVPDBDPDGS?5@:A=98:5<8==E;7>=969;D<;N;=BDGE@A??@;@?>CMXN=DD:;5@E>C?A6>>>=?M[BJ6::?BUNNZb^HB9@38<;72080/3-'./36)041<0,*=31+67.>77+5-**.->:02/+=.*34,0)' (+)8+)(:,"-!$,>&@0$(+/7L;315+.13-05155:;;:CEV?8DBL9AADE8F:ALqdTU;:86;=;IYNSRDA=KEBEC4::E<@8J1463:::554<8C;8:@=987=ESVjTB;;;>;ACALgf?=F96/53252/.251.1021.//>+591?24-.+-././/*+5/,*(-31(1(%%5-')$$8FS)&')-,!%$ %!%'))'.3*-?8.16/.738>A=>AF>:<IFOA56>Nrh?>?:5D@GP_k`G<6968;>?598\F6:>P<;?:@C6647?1=488@>?>C?97=?:997:6CEAB?>=;=8=?97;D@@9@CG?_YQC8:854.27+/-387,60695+/2,-.*01=0-+8.'1).,)-*,&&&'7),.))&'&&+"*/)5-%$+!+#!) ##% %.,',!-+;+2529/-23676B9Q=TI\DJA>_n[<36CdkRD:5;BA@>HLY)!ZRN?979FJ;9C7A?<7;;<9EG<6C?=<7:>TNS]H6ETB=C611?;8;4?7535:8:8816=>?5<@@>=:>:77FJ=898/57:76::8DGIMK@?A6K:=7<68417;<:/:63497;732:=:7465DN3?:8>FR@V}C?F6?99;:83==XWOLCDB=73@3>.,.-0/*.823*'')56-)+*,.3%%'('(,&&-++-@38JmfD;90YI0)+*'#!'4)"#&2:3*%$%$,2$*-/(./)5-.3-:/==A@9F2>?@GCI?==?<228;=B8:?QZfo8TCk_LB9?=659241;>;?9;?3BFJ5I94N<>5569><79::;7<>C4366308;989943666>CAA\#E=>:IH7BM50:DSsJ;83C8,0.,,2;:/,(.61*&'8E94,+020*+((("()05*8/*-:DIi;C-jVP23>/('>)-&'&#%#   2C025'*" %')-57771,.80..11K==7?GQ6;BHRA=<;6@8=8;=3<=GX -uF:@yUKl9A;045-,0@DS>:964=}H8A2594247:M579759849>B9:<95667:38;;89425:@F<<[hN@>@:46;8@9UqA922824-,0-1-/34-',4.)0;482*22-(-.-,)$+-6.--;523;FwK[^U;DC21.) !(()@0$*"$+$H,&&*(&*)$&%-G2B?03655/4689<2=;8@;@=ICA469FaUG>ABNBHHXCM<9;@9308969;338:6?;B8@KO>D<>>?KH:76-748:21821/,**762+/L3:(1.,/.:265)./D3*&)*0'%&%*()*.3*/+J LTD4i]2=40%%)&,#0*)!#%+"&&:*'CR6%)++)/.04313A1588>;9;=D<7CO=9ECBeD=CSI`KpTUOHJ53239;88371<6<55A9==DoI2552635564358378C758::4??<;;79621784814:/,*+6-/3*)+15;51-.-3/)@62@.;3)&(&,,+)'G)#(/7;)%)O_9I2328/@=+4A$1?$*$'4")".(,3+!#,,*)&*A.,*?037684E:69DC:64846G=823652<9>?16HEE;:9350/685=4865:68/6;<68@A32A653=471240./+3<4202-240I3,2.((.4.(.74'6&"&'6*,3),'(148..(5(--743.,31(&;,12?+#&)($ !"!)103K-!#.(,&/8>.-+0-/27;9c61;NB>\D7LP;==:66:C974a<@:>@734697D<4486552097?:4678<756:P75CE;;5D1,675A.8@2454/6018,48717.,.,(/--,01+'&&,&&(()'$))(*.,277;0!653020/07.5-'*+//6D$"#&G,B2 !"%& $>65++(.;7/474>163I;;?<7;MR?FA<<?06;?581313963266566746;]<52797:97>C=D79~_>=:5:@CB94.14<-))@02;BA0C..56E/-32+&&0)2+&)$'/')/0+,)(3Q)23D,'/8:XSW9LX.**)0'!"!2$#-'++!-$%&$#,4)%,,+(5/2;54053?D8_;B;=>M@ARTFcy-9MaiwREINaR169:579CL56`>;0,44B:Py;BB>>E6;45=5/3<<59542/5526=?HGD542?15736:<49D6M7;MQ:6:684X7>=51.-/1)4%)./.0/*.;3:4/579+&)*.2$-$2H-(075.68'(,8*' (+,EbM::6B-/)+('   #(##"&"!$%*%&.1A&'',2234@9L/;;5869BD@?E=<9;;Ab ]dYynRUc\R\NL?9:<658;258;bC77-48<@%W6>U=2/5:B<9<;8=9577;7:5578=R]D505?>604<57:9;O597:C-:4;;64UB\O403)12.92+2//+5.-85,.H6=7/+3.";1*(*)155KA5R31+&!+%.(181+,13A1'&+9' &6 )#0-$$,)#&')I,)($*!&0,*12057599389=>C96I9<58?>8DLPOQVUKYXSMXT3=:3<8@jTS8?;BA:?725>\=6996EF555=C<:CH]O<-'3/0/2,01'$''+*,)1K=VUD5+46Q1'$#84++")J++-$)!(P"$"!)&(.'%&$('"$$$("%),(6?J8.252=8620:@9@<8D4FF>=G?dIHJZUQYtYP_?FP8;9J;730L1035;4@/ABJ769ZGA=5032969=8/7E475,%)88<4?-74.-.0130*,,-(13c-1;5/28:16:726*2'$*/,,6;ZLPeF7.=>.,H*:*()*"#K!,<**$ -:$"&#%; .($#*%$*/$%*%$+*39.3-.46.4+9@24;B?85C??>=CTG;>CBGMTsmTMK;437=AB7,81,.=?3;57:>:D79;OG05?95696=MDA;977<588@=444727.1/047;i35:34470701/72112,,52>:22/-2.39J\kD;3/7*%')$'&1./:Z:?rUWRg%&+1+M,*LB><%(-.%#!'!#(!#"!+$(+%"%&%*8&++,1,+33.350/094/0:693;289?AG]ESE@?E@E[\J226494@]55;5532;42263332<>@7<7<<<5:13>>88?SOVUPl;F>>733<;28570:41516A?Q54?11;80O.-+52-/13.5>?GA0+2@@GK.eKA41+0'+)#+A11Q Q92OA:;/<0-+0*=+68+.,)$S ,! 8#"-7.-14%$#" #$"'2(*+-()',0.2,622:7..4124831;;BGY^O@JL9BNLN`VL<07:;9BF8F-12;968747207765959;59644:C9<99FSPbl_JCCA<642066524/30*1206A8P//42.0.+),)-F,&:6658<9S;.*,=jvD&^S:,1(-;5'&#;3C9D<0)2+4)(-()'A*4'+.2;25!! 0"  #"&( #97,5-%!$$*,.5,&,1-2.1)-.//74.123/3:3:9:BVKHWGOF:;8BD^AZ=352:68M<=40.<35?C;42538415/9HD703:FjD?A@?CZzwpLLA6765303O2763242:73>249685:-86/),3,+-3.1;,8:;=.(-QKzskfYG>*-#'8$%>./1:E;:)-31*%+&"+-8%,O.><:0' ""'!+$>$+ $(?, #$$)I*(6-+*.-($&+,3>C,13409,1:;37I;HklGJK:88BG5F8079<7306:/6=67584?24?:Oc;vkLA4774628,481475>;A7511A=C3611.(.8)*31())6:Ug418.+>@LOOW]J>') "%$ &*)5.bP*E'1*)(%#D0'$?7I,/J/5%  2/"K%4!*!%'''#*A%,1+(052'*(*,-/a6114.8026934C6=IXOoGEB6.#)-::5500526:7F;2BA/3A47=>T=>5555>?1;=?6548@_<261H8;352:)20/1*(2DH,D3'/-9M_aRI@9-&"%%.)+''(%1^),F/1"$)&9*%<"5=#20*$$$!""%3-#*&#!"###&%(%+(-,E8,+*-//344+,6/C/,436-19:XEUIMOI::'$.092/5)/3;18:8903532:0878?;78;?5OA<5L=3:-B*3D=./,./-:,@>++3-+/*--C>J=261*)&&$ * #(" '&%/#%. #('%&(("%0%*$#& &*'!.#/38!!!" $ )(.&',(%5,**-/3(61:/,27/01340C5:LT@7?25489855=96;967755=B;66IMKMPh94.\BG6<9;11.45A:2/=4.823092/=-/101-52285<3900;33724,04/0,26*%$+%$ '!!1&'.$""'%*&(&++'D/&/)&" $2!&#=F89!,  '"%! , )M*'(&)+.+00*,).+3.54*?0773669A4954:=786A97.=,<5C336840)../1+*+,)()$+%$$&,!8!!(""& (%,!%>7%+.3("# $$B3" 8#!,'#*"-"#% )%$ $8+)&(0:B+04+4/514.2//59;12356;=BM=7D>@7F7DNL7-/..44/,-520*89@49EU<<1886643D51<@B>63040624,*B0G/*2/*.->OO>:H984275D636,0128@G?1-/1462,194921,n?\abc:4-02.-++3-)*%$*))'(($"*&5!& &  ((#$&,"! &$% ! 5G[5+(!!!", #).1'0.(2+.-(.2K@-*+)51621<8HM>9;>6>AE867?Zx?845667,9/2T732-7-40694>I<8>77554GKg0-3;>>E75;]@>>81Jz89P=C9CA75261**8BO?00314.,+,329K646:5~eF32<9=C2789DNUM@?;C310481713454/5/2;92/0344>H.4+19BV 3Y810%(2,(/0-4.:5#V*"#""$ '-"$"'$ !08'*$(*''!'#$'%"')3/)$##%+)&07-!#'V84*+'")07*&8,'9 """[e)'$,#+.:]/+5*A7,**(8,1..3,.-"-.6,=G86EFcc18AOG5528-.)<8+&T<3041+**.++,27?80;I=<-5+0F9:92>7604+-'*/M0.ZkJ45j9--)+%%2<%//!+'!0')!F%)&B3MeVd?9.)+ ))BET*#""",.ei--?*7?5),33.(-1-0--'/83-4.-3;5<@5NqO9-/&0+/0+1+-5/E3*02-+-.+6<236>vggF43006,56,4199//821/127/3368<7:;68C=;3768<56F-124A2',,B8Z311*-6);!&$#'D5'hZW52F8'0$#,5a(!#(!5! !, '(!+".*?1%%0.B%_01  $?5eE$ %*$"$2110^,0<0,4;rM7+,40/.&(59/7@*8;=/:,?7,543%(*3:6(2-+*-#).9*,(.13-556JmaKSC50,,;6153,..**-3*14.4,04176845@88668;2755?3.-5=2.)45/*.(--%#*A&)81()&4&.>N?BS,*%)&(%#"'3- +! ,!%31.<$&=bc>\[S-)" !%/.V*!!#,+"&!+,+D-'8>I>O48068+-+"&16*-42CG)+=-(5+#)(04,--)!**).$$)(+4('6/@199.AUeNGK>,*(*2-&*,*-3/4.,/-./-0./646/726L5>/V33431/*0;;,8'4*,3/$"',!&,5%'%'%%+ %&3<-%D-$"&$!""1&#*! ((263:@7ICWHnlq-H)!$ %%'"#".*"%%**()9-8Hop_M8($((%'&%%+,)-(*&6+=D+3:.+,((,*/))+$((%$-&%--3+,)%)(2:?IGIA*-)'*(+0,02*+/0+*-6:0-1.--2/324671>874445-H207510?01-%&;#$08$&%*%$$%$ ! M,3+/J$%!!7,(C*K(#9(()IQMKht*5( 83%%72!,I%Y4)%+-8@<./6?gi`GW9A-4.&/)%+)))+./,/4-+*(%23)+!"-'-/.*$%'/(%+*R&1**+1>A*029.0(,&$(4$(E.0.00*1')',1-0/O1545CB:2:."& -M1%$5<>?A,7D&&&'D)'3+%%#*,&(# '*6C,&#&$%%!$%'),+,(+)2,150;+-3$'"/(#-+>TN1,,%.I)).13B1163003592=9M>B>3?71>?>/(+./##&+%0 +6")"&'(.H'A"-"56Nd.%63C &A!'#4/CV`K35M/*>'%$$!;!&#%$+R6+ )OvG:xyV vU:1A+G*#$+&(,(##$%#"*%$$##'),*$%&+,I1)-$(%!(!#" '#()+&&($!#+%(&($"#.%+"%4_'0F.20..1/3\33bER18K9JHD?C45=294#'('$%+*'((*&5"2#)(#4 4E"")"''$#P(-XK9+E87>5IL"' "([Q'&%%)G]C:EAZbEM,:-C)("&$&!#)%% "$(.'&!'$&("'$$"&22&'**&"! ! ! ./2% &)/#!#&%2!%%,% %&$7*-;4-'0/7=0?54((&-"" !! !"&#%&V-(5#2! $$2+V 0-*38 !#G""2Z*'#),.- ,$%(M; -%#$$#/SH=<33!5gG4,+!*!%"$*%#/%( $+##$ #"%# ")(')9Q&'/*$&!$!!$*%5'$" !$'%#$( &($%%$!)0?;,';5:?2;]YdY]?71&.8..;2.-6*')"""+)*) #!$!9/$"1)*1 # :;8')/'$*;%3-%",%:c=)/"%*WOM3/4q#V7( %$,(!)#&!)+"'*&)$%!#'#"""'%5#=o!$(("$") $"!!%"!!!+!&-+.($%#)"#$223iG003?F=88f N^VF/.,(7-)( (.'(,"'')+#' $$..G/)7F&"" +#,+"#&B)*!2+P;7)2(F8VFA/52:4-/%"'6*'0%!%)%++$#,( $"# %#)#&$)2' "(-&#""?5/$ )$!> %#+  -! &!2:-&""%]Z9)0',c"0 -K*-&!5%"##C-"7",2/+0&*!#!##'&!!$"#" !%-#'#$#"%(*%397D7,IWbF9-+ )?9C#!4,!# , $ "(/$# (+& .uf=&%&$,)G'=EG',&+ ")$"$'!!#)-A404*#'!'& #"#"&131##" $'!$  " +"!!* 3#'&%)-21ZH("+""$#7#?!#E& -+E 4J3*"'"#;.-,# )$&#!7#!!#*^1#X#!$&"!(#!!.1D1,' %&"%## "#!&#$ ( ( ,(,&'$!=+)W$7%*$")% 1, " %',C,9!"$$7,/-*$ "$ !$%&%'&:4()M(" !"%(!"$!!#*$"#$ $(% !%#)$"! ! "!%@$%$$""% )&$ 2 +% !!"# $"  !! ""$ , "#%&4(*'$-0''-1)%'>_-(+.-ARGNpZ<;G3?j:)/,.)0-/+)'2&">F'+)&(&*,'$3+*+)2%,-,++((.7,,110.-02490312J/253.0/808/8>38+1*)" %+J89-AYEA0*(.-,/('',+,(%&&%)*);>'%+,+(+(1,+-.('.,,7=301100524455>3066544;?29,,3<61*./.250#$5,,0+L?;EGA:FB@DH==@723014019-&(46B/36:457I]PEMJM?9Y?M49,.),*)F$#&)'.-$$# ('79 !"1%#3###)"7"!"  +9'*-%*('-*,;-3+1(&/&2#&#%-(-+.52/0>7?S01)')%$&&&)+*,$&&+15))(&*)''((%%(',%&,,),?@237/52,-,.+//427A:;>D8<>786;;7B52-2C487,$9?A?3878IEM_QMAGF;>06>@2,+*, %+(!"1*+.  # 4 -&#%%+ +'!(( "$ $#!%#*'):1"+(&'&!-.,7<.,/%# "+5*-)/*3/)+042;@0*+.)&%(*'+.-/0&2/$"%-G(&(%$%%''((&)+01F455212:/2-)+-/362159U=Z<:9>HC<3AHUN6../+/%-*%(*$&#$" !A"&!!( "$#$ # /$5))&+(A>==IE5/32HVJCN<1/=5009OFAONLYGJDHMYeKG@8/+*1'(/)$&'$"""%&"' -#9 0:M "!. $% #: ") #'?.4=0,P*(&--(,>&))-&/>dx,,(&#%&)+4)+,06,))*,2>FA_51/*)&(+%$*))'"*%3+=#&()($$&*')++)),-+0./+-*,./9134=814513,24F>SG=@9<9=A>A2:n==Fe=++8/7H?BBGKYr>I;ebCB=FK/-3,,-/"$$!!%,+& " ! , ;&+'&!%)0$! ()$=A%*/:1(&'')/7)5C.>/',476('&.*/*(-,/-+;.&(,'(-3PN;/,&&&(6('&)D,#%%)(*)#"&%(&&((**(+),,+'+,/-/--+=,.62519=A7-/4<@M6;75IK8L@D?8+(3]VHHE|zJTJC',5,,+(#""+,?bh?+-3*'%'/(%)-4*+-&'$%##$'5$&*)(#)*))(+,++*+3/3/.1*+2249::53-2CQ@QC?PF=K@?57479jGD:;8?64ED>DEFOJD=bISSRQ>A?<-,5@50'&&)(%8 !!"!" ) '"!,0%J.0$ ,   "! +)#%"*5H#$%:-1+.'+,**<+.03**E64').+,)'&$*,.',..,))'"+7-4i:',*%+."6?)).6-0)%'0+&%%))'(&%(+,'&'',')***-0Yb1It3,-277644/788=7>=KJGFF\_R[A754.33.32('(:9<-!"!"$  !,%*+# 9 !%"!"%!"$('=I1@N3,4L;8%..()4O($&('.'(&,=2-+%#%#()6+)+**)()##"')(%>R&#"#%&)--).)/5(($*'))'%%&$%)('%&('*',*'+,103555?20-74636328598>=?@I>A:BC?34?`7bmBzC665567//11/=?><>:=FDFj532ADF8;945::9700LZQTj|VRHE?70782/2,21/*+1/'$&#%"!# " !!"$!"'@"!# (!#. !!## "#9'3)./-,.132-%.H0/*4+'&#$!"%"!"!,-*((,(%++/)*&8&%"E&#$%>&&%$$%%%#*$%'+),)*)238(4,&*)*.-,++,).,,.6.5-010+''()010)-A^57798345.03;@A9?LA;EB>:767]LRE9;36;<59).GGPSJHRG:7487--,1<-*),*995&#%##$ %!!"" ! #&!, %%!"' . -"&D7%" %(%/"$+'+3.<93>2@,/.-+-)(.*/$"&,-"# $'%'"$('$#')$&&''')%$$%/#$'%'(*(')P'0)'=,*$$%%.k3(*-)-*/A+-5+++/16113.--:-..-043..,15102751681.335<8J;AE==H<988:8>;?:446883*#DLIdIKIQ;=@8>4,,81+*81)((4-((#%'$%8$)$"%""*37"(  =6 $#"#H#$!!'##%#)'&+:/272'$*MW6560+)+-&!()+-&%'+)%!"('%((('+(#$'&"%*-&&-%$&%%'&,/'$*'*$#(&,+..,(,.+,-23.,'.0..262255/-.,/32/,1.-=3232549440.410=FLA@;=:F?@9<56G:]E5655767-)-CKEROKNJBIE7H5<-*(+*)-,6*)&%&$'&'"%-"#!!! $#5'$'%))w .'\'%$#$! *#"$((0',+7?;.-.(BwQ-.D+)*!)$%/)(&(++5%!%('(&[('#%'%&$$$'),,,(%"(&'&($('''%$&*,01,/.**),1+*+3+/1,-1.,4+24554.07<<72319211+7<@7:546.16:K:?Q>78?A=;89I8?=558777822.7\hsXSPNHCB;20543323--:)('"&%%%$""!" "#()  **! !# &!##&"(,&# $!#%'#" "%/-(&/1-2,K;-SOE'#*.%&)0'*'(*&(*)'+"&#'&%%'&%#"&(#%%$$ #'%%$'&')%('()(&'('&7-)),+*))*11/+.1.1:4//,0/11>:?6764--+-88DLMRLhKAQ867571.0,1>*'*'.-$%#-=+%(" "&$'&$# 6 2!l!" &7/$"!! ')!$6$&##'%b1$$!#%>5UPQ6#&#&5/%)(('+),**&&$(&!%&$&*2'()&)+%-(*+)(*'&()))*$(''&)))->2.*4383/03/9775613C.334041,00796B9?E:>;A437325104<35;:79<8C48><8=I:7:6588741()/;KLcTHLIEDT3:>5470.++%,/*(-3)'&-",%*# #" %')()%$"#. *+# &%+# %!$ *##!$%!# "/#""$$&%$%)!(007.#,3*)+(%.'.-1+/.,'##%&'(&+)&(,,($(,,&*,,)(),,+-**(',)*())+20,,*/*,0./03801/57:308;2.1+,25K79;N=20799454445434J88B?88:<846;=7@DF==A=;?:788;@;314.38KA=G`JWA93;99540*+(',*++/<5/).''&#-%(*:!#;&#$%( *%&$# "-*(**/-*)+D-*,*228*(,/,+*)&,)*,--+,-0/++,3/.,.*11-.29443?7012,162,25:WH9114308864<537676116<<;::4<3:899=AD>?:;;;:=:9AB85347:5C.*+1+&)30/1/4:<5<44314211>?=;>40207<9=JK<=<;;=>>?C:;>;:;::5@XWKbI:-,1(+--),)))29>,) %!)$'###'#",* $$5 #$"XV5 %=%-&!&! "!" ! $#$%!&&%($$%.762I^667*$)..(+)74?.+%%$(&)),**/.*,.7,---3;8+.++.391012.46-+25/+1/-1//0.D.-7406=DK5806140.12;:;D6664E30434K882=>42323ES:851..6775=?DB<:97:97>@:===:8>=ED@EEBMB;DBV=I3020-1..+*8-'2+0,%!###" #$KF*C/*#$+ ($CA4!"B%&B$!"&"#&#*%%"$%(')'$+35VsC5.0*<2&'-.+6,2**&(%,71*(*.4>20-04/+.1/1211=353B94@;4<:4/033..-.+414?9494/?MK510-700-/12175701<:9/2=4@;?426683312886590223399CDBG996;;;C=>?@D?48=HQ;<@>CRF=DHHC35550/),*,-&3l5+-'"%('% !%%*$ #'+& $-! ; 3%,"2^$(! %)" "!%"!1%##$$$*"$&()1-10;cLNW789,403/,.+-+'*))(0010-+,//4@0.-8695C/.2371>:<7=<;@06:<658:4=/./0-.002676F97@1113*,,1,,01:/324B9=G578<66843=:86338575A?=@AG<9@<>@9>;IA998>RCCE=A@ET^TJIA41/41/.+(,)(6a@(("($*##! !,&$.$#("#!4$ #$!"$  $ 4 /.)  ##!% )""("#&)/$%$$(& !/-4:_*JJ./3/6314./))*0;-,1,/,211.*,+/00==:554225085:96S7583048510.600..02..0/14//-8<60UC:20,.-1+0/34<654A<6;DWK;7?67=<67\>66642288B@;:;?D9/.)/('ML3;####$'"$"% ."!#"#"%&%"2#  %#*(:!""" ""#!"$"##/C+%!$&%7*FW=9HKKH122.,,7<=41,-/82+*.)*634306330221650987602764JG329601212-1.b723530.0C.0,-5*,179910C829:6A52375-4469A=?C@?<>;48AA@>:88323H9;IbyceN91/32.1'+***&$%$'$%'$$&%#%$%%!!'!%'"8,-*. $+"$  !"($#$ % $.*$#"$&-?580WD9:42,-1)*07?SC?11-,2++*&/412..0,.6<455O8986564;27;30354/P2201281657;1422010--+*/3KJ63,,..)0+,.04>;&&+/58A?;>:3/734379..0L4-.2@=JBQLH;A:8<><:=99A?K3740$':;FOVrKJJ<8B30.+****$'($'/'& %## !%" &!!"((*#'%/,1!!! &$ ("!"#$ # "$$"#!*'2*5:IC53BA2*,.5@32/1410.7%*+-,)(473.021;8;=?4;=76;6:;22376632347;=9634364>768333/31/.,,32B6:b3*.>+,--26325A(*.34H7=<8><8958=<<;7=DAA<;0+(()7[k -YPACA623.;/*'&%#&&%*'%&'# $%%'# ""$&($/B%&! $&$  (*! #1 -'&1&'%"! !$#&((&%-7)1-=E08@747Q984677599::<:5067957;948640496314420023/255:941334./0:G176:?L56/4<6/557?X43/F=P7)*1502J.3[>><>?<=;>8899?<:>E^FU5(&)')Wx_saM@6C3.///'2''&,"$*'*"*&'&&$#$""$&-,)M3$!"%  +(!'#$3-9#!$#( 5"!#(+# -&&0($&&#',%)2=~P4042U;:P33521333010547277<=9NA;@=86:=9969<86@?:A<::;:89:;=<747552/L17132171272;A:P>342340-0/13925,48=466516>9;032VA2+(/34302,0D@>=<>;>=:<9:@>@AACE>4.'J5(:IINLEEI29/,051*)%'")1##&&0&&*'%$$!#$(! "#$0':*/($* !!!''!(D6""$$#)#"",+'""  #%.'"$)'"&$'29:@V5446=5F40:?/.10/:2258<=;>?:?@A9:779:=F<9=:686450.32002546573>@G3?4465>.213//2704>+.281G18871769?<0-.2342610@?;;;9K?;:?9?.0.'',(F(&('()##$+*&'&&%###""-Ll2%$ "###!!$! $$+) ""#?!$93((&'2!$&!"!$$&,"*&%'-,)0;5479>1/8539C:,.362:738?@<;<>@A8>Q;@::??I;;;;>GHCJJ?<@DJ8IA;B?9543211005146163/84LPD=46?A>?51124E1(,00,/7D9.0/:36;5667F<434056-38;=;:>9?D;??B;Am*!)"" (!,&5#8#( ## "!%3:1..("" %'$,$)'('$&&()'+++,00AVR5?74722.6385;E68<;Yi?;<4=9>@44.55SI:05408D24-9-04435349=787899B30B9;;7;@;?6E?\D=?B>9;10(#+/>BNPKS=82670*..+.-+)%)&/*+$&&!"*)%&Lg%'&$&(;'! 3(>7!"$ !!!#/6;''A#$%%!! #);!"1!'()),0-5/9???@L@`JBECLIFIDLILCNHNPB;<=??9?;>9:;7777788912006?;;755;;=36277EMy56546965119590361586636=SE?5194<9:<=<;87=?B>=A<>841)%,11=BHJHH<;3341.3//',)(($,+#&%#%&$$")&+.+$&!)(" " 1!(.0"*&%% "" #%7o?)(!$"%%(3#%$"$%+!#',277M5\EK>29736668:BB:8:@99>:;@>DC?DQGAMHdXHFOAIBHMIILK?AB@BJGC=ADDA>:;;;9;8979>9><5743<@UG>==8;:854>?>A659144G3:1975>7FD>Sd<;?:?EJ618<3;?6;=7==8=C???A>939/*031LF>KNI<48705-4**4)'')-(&&"### %&'9*u=" !,0###)"!"',(% !!!"!//)/$*'-$"*%$"!# ##,+13/8:=IDA86<>8=>@E@EDELCLzO=<@K::8AHLED@AA>:<;??<@969;>?E<@;742423559377?=<9X?N;889A945BB;=96@>IGP@DBCD??9754")11.1>@D?:5645.+,7.1+*&''&+%  ##-/.8&" $,+# B##(5!!"$$ #J+2'('$$%:=''*%"$'($&)+:703:>EF;ZWH@8:A<:<854<<>=<>A?B=A@@?CAB?>ACDBG><:=@B6849432<;6:;88=IG<<@L852/>D>=::8:CFC@K@AC=@:79>"/;716A=:>987:/,120/;&&(0&&%#$"##%$$)7N($)!"" (!#(' >&&(3#&!  $2!!)'&+M('&+$"#&'&#/7:S224=:J>ES>=37:>:CD799:?=>KJH=;;?NE>ETDIAHGHCINOKMWNKEHFKG64BSZ=?INTQKIICMKLF@B>FEG?C?@DCABAFGMFJBF@H@@I;5KA:DIE>C8;;;@5==<;<9;99>B6234?>>6>>A@?B;=B?>>D@AB>>KB@N=>=6./0./(,-+#*#&%%$!""$#"'((($$"" " &' !3$!%$%###)(" !%" $ $,&;:+(334<=;A=<@AOZ9479<;A:=?A9@9/17E?79B<=@A789=89;68;97773;=NB=GCB798????KCCJo?;F=/%&18@VDDB>=83:;FC@>=CAC99:=<9@::=D=7:2D8DD<73:579;=>EACGDCCH:@,)1=8@FIHMA<2*-.0074[5&1('&"&+'"#$$#%5*%&&#")"0/!!  *'$'" "*!'#%!#&"""*'"$/.%$*91)/.,-+3;@48/214;?KH<6:J>?I]F@P>JAEMADGQEV4%kgy qf|urWPW_b^YLXaaeUUUMJhhlZLc`no]WTX__[WPKONXPMP[RLKILIKCEPB=11=B@FDCA;:6;B469<>=BBCB=>?>4'6F=?B?GBJH;-0;73./3,*#()%'&$+# #"!!$''&!)%!"$&$ !"% '*!#$,;(&"+$$&" )(+2.$&-2*+*,06).6S54024/,-.0/346==SpECNBAEBDBCDFQZ `eZa6vYd~cb`MMXLNQ`Ob|fwa[UDI[_{aUWWofcocj{a[XXT^TRPQTVUXVRKKLIGLG70.;DIPMHIAj_E:32<:@AZFCAB=<7@<>??0+/6CHC=>7;:65<9>HBEI>DF?/*1A<9AAGFJJ7D9=98/,)**,&&(%%($$$&"'#"')*$= """)! <%#$'$#1#&#""#/) ##*!&*$+'6+*+6'-11.--+/1*.097::85.522:>;??=9=B@>C>BED@GTP`\ac\WaunZ_xfX[VRLYWQPHRTSZVLRVc\bvoj[Xc\fgfndd`oeTZbcbfYTUTQNKKKQNK<:>AEKLLFMMOD?A9IY3@POFBGD?9469>?ACJGGAA1()1/K?A@EAD4<754.-+)+**%')(###$$%/"'%& %#"#%(($!&$",0H" )("%#"!%$(#$,.'+'$%./@E3-2.-,/7246515468D5:Q=597=@?>9GA@8GFIDREFM__uin\__bUYUNISCIIPHKSOTi`db^pqsa[Sd][_a_bzr`fXJKU\XYSXWNMLOUTPMH@FFHHIIN`WOT8=:D;=HLQJEEC:;@C@H<5364AADH?><;:;=@DLEHFBFAA>@./2:=DC>>98:9>;3/.-,*-,%"&&&$'('#%#,$!##!""""&$!#*!!';S# %(13628$#*%" #"$"/*+(+)'&(/*()2,0.45;50@94589?K?>;;A746;5BOW>?CDLJGFFIGWQoqSNTT[`XUNJQINLNRPRJ[[m[^heZY]ie[[\c^Z`e^l]_mhXUQPWTVTSTPYTV[WZTNNCDJKRTQO^MJJHiA;@GIECA7ADBEA;;4EI2:QEAGD<9=<8@@FEDCFKFCBd&(1768;HA<:99@885?011,0%#,(#$%%%((&'(&"!3 "#&$#$($"##"'2245ihJ('(%#38I#)=*).%*3$,0.322:9J;23958A:D946:>49923324>B?EIE27F3/?>BEEDDD<@6+('%%6=BD>;9>5;7<7F9-3'(*!& #$$)+/''*(#!!!!" #%4'#1&#!$*! ,C0(3X@%#% #'/V$(/1)1.7&0-,=-11?8GF?8;?634330.3-*EDJ[IGNFcTDTIJRZW\^dQVOMTZ\ZWLOVQTPVZTRaYUS]aea_fe`W][^c`Rjc_a[VUUSPXfTWW`W]Z^WSYNUQTT^wSSSQUIEKNLJJIC<>DADNHC@736:ARVNp>::5<@8;;8>8867_:2)$&#$%%&$&$)7+*&(#"!$!#$#%3 ##",%('#L7/;6'$&&%"'""<(-),4-2-3/+/1>2K6257IK8:;;EHGA;8:763663;7-66<55FRGS]SNKINPKOROU_VUSTVINVnNLIPQ\LOTSXW]\]`dcxld_^\_a\`eba]`]VYURSSSXUWQTVnbWWNPQSURU]]QVORR[RHIJKHGIB?BCBDBAL86681.)''$#%5#$ )%,&%$#")##"#$' " $#%C+%!&B7*$.)$""#&.=),%'-*-.*,2/.207D=26EDF>846IOO;<=86425@O9>5388>BB@JJ_jPJ@HPUKJ_KOSTPWNKIKMPPP@DOTKT[j_]V\YY\c^fma^`g]abjxeaba^WVYb]RORYRRSWUWXVUYUUYZUTQLPPURJKGFHKILJAFCBDB<<;:;9ECOCEAD@;8?A@DEFIBFCLH<+0&9@@C><=>D<9784391-'(%$#+(+%9%$$"#""#$# #&"#$ !!"%$!%(!(&,-*%&'%%),-(./)/***(%++9AF;8??:8;57683145>?76,/3AH4A@EG?BFE@ESTKWPQMBLMEWRUURTOPKGJMNJON><8:<<GH9>><;68677:9T/*.,$$'&&)''*)2!(##$-4<."")" $&!%% $)))+")6)&*/*)-4()(''*028<@8:26786658474B;9513254608:AU??CCCBDKWGHMVQCBAFOHLFfMIKVFHKHDHDBIQSPa]Z[\TSWXa][^^\\]Y]]bfimcttmga^^ZZTVQQOUSTSYXYVQVX[WSYTUWSRPIRLKIFGH@EFB@CIFEBA=?979=FB@6339CMEICGD=G?76>7%HQTCCFQsYTTWBKIKNKRLATFF=HDEIIA;B>ERY\][\ZSPZc]n[]cbbg`Z^d_bhijdpkklde\WY[_STSWVW]WUORQUaZXWZZTSROMNNJFFHGA@BA@JYGECDA:35>?N8;<57>DF@FCDCNFA93?%5?<=<6625./)'*'&'*+!%!$$&,)! %/"""(&&$#%#"(.)=#!%#B''))&+%(;'&**+,052<4:8CPUC?=H?;;=;<8>6<7065419ABTNEIIUI?BAEShURPXTSISLPXQDME;6:@=AJB@=DKU^[WX[]\X^^XZZ^ixmgcm[\]acebklmtmhg`acbaZZPSUUUXWWRRUV][WU_TURSMTNLLPKHBCA?BBDCDGFLV855D;<86348441+;=9=:>;<:<3155*)(,&)&)&%#'%(+)$0-&!&$%$"%"'(# "&$(&&%"$&%8)'(:**##('$(.0.651:BGWpOA48;?G;@=8946<8.218>B:PHKMEOXIJCGGHMMK@IS`TW`ZJEIIA8269>AA>CIJMNWVYWZ]a[ZZ[V^^bhdedee][Y\checmfkfhlkjljc]\X\[VVWWSVYYZ[^ZWTTVWRRSPOQMKGEGEKIDGGDGCGA66<=:710*7=EFHFKIFE@8-,1<51>?;GS<:8832:))'6+*%##'# $$#"!%&# "$((*),EFJIGAKLQ]^aqLEHVH>:7>>85Q[CF9E;GSF>796578431+00/5>VGDSE@DH]YHNNODFUENNGV[PHIKHFAISKMIFMRGEFCEA9>;1+)19>CCBJUGC@@EM=7/*,/+3*-,(# +#%%%)92$!#("$"#-/-%&'H !&#"+$#$1#)()+%" " *1--/0225<=:>A@[J?M=@;97?8>964.1.35GC@=@=@DBGFAD>NLGDA@3;;^_QJNPHEHGE@HKKQUXRXSUXYVT[Wsusf`_]_bigc]Z_`cpsy* rkl`bgimuptnlqsxfb]^`aYYd`]\bf^gVVQY\YUQQB;EMLKHHIMJHF??@A@?4*%38BGDDDGF>?@CFD3*2:87:@A<:=>GIHKIHFFBGKJJORUVSTTZWRVYbaee kfa[_db_ZY^[antqgzt~ntqgjnos|||tmrst`_\_]Yb\Y[cbgdk`WXYcW_UJDIJLMIPKKMIJDAFFFE8>-28CEGG@EIEF;?QV69NEE8?;9:668./20)%%)&%),&%))..1%('*&%(''&&26&$&*#.&(%#"$%%()+%"#'**,/02..587B9??lV@AD7?=S::66432=89?BV\CGHJDJIFFKMKHUKOKE@GHWPKQQ`XRU_bhn\`ccqlc\oqidQIRPR\amdia\[arm}{uk`k{ywhqzylffl]WZjV_Y]_eeuql_c^TMKVKEKHQOKPNPULI=@FCA>3'3@GBFFBCH=15@DBD;CEICB>FC??;47197)%'),)()%,-*,(()$$'''$'&'&*'"-0((((%+#(&+('&&)(*1)1624.@=BaI;O=AI>?G@@GBN<37756@?<44CMADFAMBW8>AJeVNIY[QNHHYSGGIHH@?=HMWNNLRSWYUY`___h`chkhpyyo]IFM^ihkszuibkikqtutpusq|rymr|qlfha\XihmaZY]`tqyt_a]UOQQEIVPNPTQMLLIH@BI<:.?B<CHI=;71++*,+%(&$),*('(*E;>'&%$+&&'&9L%&"%%(,+#'%#%!&&)-*2G199N@HtS>C;6:B;66::HEE96D?3>;:8;>?BBBIIGOBFI\QaNPMLQPBHIMVC?99@JALOMGKNP]XTOLhtdXmTTYTVZdbbbaSV^hkx{ { umbejt{{x||zr{ ~{pifdbas_X[^[cp~udba\RRMOGGNZOLMONMHJ@@A>@>oLA?DBIDBFM<23;5644:TNI;FALLE<>=<>TBG;9>40:-,*'-,/+(*&(+-,8^@.+(#)M0''0%.''&)(3K.)$%%%(&(/+16=T6_Sz*lRFSB<:7;76155YEEVrulR?DGLQHGKOOL\W?GFOIACDBKFVGC945<>CBBPACGNUUUQT[UOV]QUh\\]^bfemstprxo{slr~yh{yqzwrztyu}xsoqtkfnnij`aabggmofhfh]\SOC7@HR@62/0..,51))+)&%(/++,+66+(%'+I@1$'$&$&&%&2))'&&'# %,12<7;>Tf[l},zgGC98=;9=21=:m]ry|lQONV_RXVUPidKHPYZJNEBFGADG;737?=?@FINMMU]XUXUUYVWaTZab]`^c^`bjtuqoxysx - -~# - ~o|zpkjqkrplpjkkhmb`fhukgi~rd_ULD9@QPOWQQKFAGK_cFDIHDD?=@B@KLRQSX\]XV^VWYam^`oeejgde\bijnh{erwz  -1"$|| -  kdfjzxywropnrkbehjytisupc_XB69?GKTSOKEC@JXFCCEHE73??B=DIIRUPK=GBFB@GCCDAH74533<:11-*))+1((,*@37++0/@1,0:.%&'$&+)*)-*/.,%'6%,-0GADi_fbZNa!oYBB?<<=F229=Ku,+nttgpgk~\RRYIBMIIJGB@9?239AG?FKKKLUUb^[UYbUW_|enjhinnqjoghijpumht} }|xt}!$ *$|~}ifiqwtrt{mqskfiqpqipk} deRB>ELKQW[LC57GGYC<>@87>?ACAACFQKRKC6)1>99P;;::;Hp)2" -|zz\UWULPIFGIIEDEG6G?FCGCEIJMPYSS^\YZ^aa`plqoqonsrvboux}$ gh\)". - ~~hbhjpuiv~wqryoodwqymiqrplgl[HMLXMQTRLIG:GHfNGB9>;DB@B@UMN`LMB=)#7@JMNTMCH6;9DRM:80/+))),+/-+--/;.2E**+'+1*&&)+*),-2&((+'))&-'EI?JHQ]ugaZYZ_HE_FL=8=DHGV65%2.%&  (yeWYXMGHIJHFFJT]g7J?FCFBFFKNRO[_aagkmcdnqvzpu: }{  krn r ~j`kvrwvonst~vsitqkegqZQUUPIOLLFD6@:>@FGKXOPJROAHY?FMSGB=B?>K;Qwf5.-/*)(,1//)+*..e605)'&'*/0)+/*)))+,(-(+*,/*.01LD;S>Fpe\BP@MNRBCAA==8:=DFPXwBCA@BI=9GsdbaWOJDFGGCKIH_P68;>BFC;KZVY\U]\bUhwnuzr|gs% )  {{uz|x| -ujtt|{~wy vo}oklgcjnx_SQKJEJRODELJ;BK@B<96<9:FGTTWUTQD;?@HVbq%WZ\a_]]1sfUVLIGEJB=FIBkL@DCFEIHMQTW__Z[W_bhzx~tlnnrx#!5R5 ~z ur  p{nx} ~ztywyu{tpocedd`_jfdSVIYRSZR9KS=9AAD@4353>9>EIU]SRNLU]JIEFLGB@<EJXdnCJLVRNN[`dY?LFCJA:9>?<<:44912.2524/&',*26G?Nb0'$(V2+/-.,/40()-.0))),;0+22??AA<@>F?;HNQLOm<68T97:>>IU]t?cnzztnaC/vbYUPKD<;;8;,*3GHGNMPQXV[\UWT^be_nnniqy~uqy -tnpznkiziktefinq~|}  v -ms t}r~ u{kkilabcmnk]WPMOTUSMJNDPaJUKF@66665BCFKPLNSYjmdMCnDC98:BG><4449K07-659=.0(*35@[qE,$%*,+/*.%(,.,*3+,*+(/4<-7,-::FU<6?JDDCDVBAC516:839>?HT[pCdr~tnbK/ {fWSUJC:;971*M>JNXRVbfecgZb^_cb\Ybqhpx {~ - zvsvupxwzma^cci`wwv -{wwbxmyvy -xjxvyzy}moea\dorf]YTRTTRPQKVIMQOQOHH;><;=@BEJQOS_^`Y\ZWB@<8;WFO?9653E00.3;4,2(.?3712CWI+#*'.,,.'-#'&(/-)((+/+.11*3=B@BB87>>A?EO?78G311246=5BpQUUbdgbiiaeje`ijhjftknr"|~ |{oeitzvl^afnqsqoqlso~y{gc{zz -qmz z_gdcrh`a]X]XPXXVPTOLOOPLJHA>@=?D=CrMXRT[WVGHjA74;;`L@;?AA612280)279J37.11>1G-=++*/-867<63011143:9@AKT\iz3dmnuqfT6ieaXPB:BDC>9DCISUX_oxpwffmb[ggdtzxvnr #"& rxtfa]_jttrogfouvx{yqp}ouvzxre|| }W }wxwrbh ooic[Y^`RTU\R\QMNKURNPA>A?A>BIPKPSY_eXORDF9666F>B<o76.26517.?533J91-),:7=>2/;##'#'&"&'+.,+-).05:07>;NNETdB:;6691.1>844::BIPO\rAMY`xxgL4|]YVLE?DLTEDIJHJQY[`luria[ |{prjswpy  "(~mvoia^kru{urvpjnxxz}yz{pzuzvx sr~  -xgv vxnij&#rm{jY[l[LVVOQTTQPNUkNMF7CCDDCLLJQZ^ma\TP4*39>95::D??@>8;H?697B+,)0823068DAEMS"!'AQnsPP# p_[OF@BJKIRMONQRUV`mf}hfZZl~zyngnmcu~ lX[fmohproy{||~xzx{}}xsc||{obfv}|()~illm' iupdY^YOLQVYhUOVT[RQPMU>FCB@FIILR][mk`_O0(/35<73EL641--2/.<.)(+82307;GCELoeo4LMTH2jb^SWKICHMKKJKQNTj{xuqjnm{|v{|wslmgv |zyuonnemlpstwz |~ -~~{ ~}i~wh[jbu-Jxhntynkplg\U\n|RT^`\RRTVSQ]Lf>;:@AEHFXQdkaekfTO<4088771/)/**,-,-))46020O>>470-.?$'& !#%&'*-/..068640::833/1+*),/0/1+1;4559EBQxNKV --(-3%&~iZFIEHENLKKWS^_aj~rukzvuyz yn}x| - - |zurrrt}z|}vy{~ - -  z -   p -|zc[^'+ vktiijllxejkZL^G[Y\XSTSONNLMNA57PPEDMQOfv{dYUrlu;57;77:>=<=>2245/*,*+-.'+/2?[484F=N49-,AX# &""($&(*/-,/3=47524AA30/0-)01000122/4/2==ZMI>`tt}|aUPI?GOKRdbchjZhslmou{r~vzzjbeefy y -khtw  ~zzy}}~|  - -  ot v_Qpt{ -ytmnng\bgjka]VCIV^eLGRRTWUPO@;<8CPGGCKW_fb[XVbwXM57;03;96;=89hJ9-.+.8"#'#*%&))+,,)(+038585922316.1WNNRej^[S_`lkpr}p|qyflohhkgnw {|ujryysjpz  }}|~yyx} -    -~rflx|}|kXq|n^eqibhgk|mZ\HE]hfkeSZUgjYUKCG:DGIML@OWSTd^\UXT;@C66?5401AD=gM6*-.0.#"!&,&)()*/*.81-02573607/10./))+,3/42.2,;J679DA>BECLNKTYX`WQqMJPZQZajf\h[efmt{tppnhgikajpqo~|} {z~}kxorzun|~}}||}~|~wws}   -rnsv}nSg -~ucTdklkgvk`]\POXchkgYSXPXSTLDEFIb:HtAGLZ_jbb^LAY@446>686289;<8620+*-27522:=:o~1$EOM:E4795#"&'&%')$%6DH9371/;0;=4446+-((+)**.,+.2DD68:B?9BDBEOLOOZ\]U^Zli`VS_antsociuuxvqksd^SQS`fdqzvu}|{vswxysg}x}{|{tot{|y   -ztuyu}ojm1| i{nijlkhid[]VUagdb\^W\[SQLBFKLa[8EGHI`yi[cl_UA?@:9C<::38C989:4+0(0&-I3.3:Uc}DF:>I:X[961!!"$&&*(+(;685;MUQNQaujc[_[]o^_`jgjxhtkkpvqxyyjz\VMUVeenz~{x{zopglv}q^ryx}u{wvvssprtr{}   |ow}|vu} -  klsy{lfhua[dZW_ch\c_f[\OSOMKKWycGO?HNYga^WUFC0DID;76;=02376:F.-**))531<5BO^F<,2K?>CG7+(!###'$))#.-03@9M7//,0,<.-12/,*)++(,/*F@0.08256.5CPTRPMI^\WbhY_ce^yyxyoxmuwpdhfprr{a[cxvxxzwwslipsj{qs_`err{  wmyu}y~{|   pb_l{yfbhmZ]\d[b]jX^[cdMCY[OMiy[7B9IVMTVf[[O:2SOKI?;;648/4;3710--2-40,+:@EW<*&-33;<567.*)$&$%&)('.+1BN:9349349R8,***)'#(/+/-?;.-08.-/26;HQSRVVHaSbZopeni-"% uwaslrmgfrnx{zyrhmz}~ -soiimv|t~ydgrr{{szy~!"" ! ~uyyiq}}~ qcYdiyd\UZW\fkd\abgjiVTCKOLLXoyiSQ8;?BA=QahP-Aa[HE?>75/363=;/3..,.014,3:>SA4(*&//27.2E8%"!!'$$$9zE1CLn;50>=0.111***+((%('++90..-5/-/337IJJQW[\ -z[W\]WdhiwmfdRdrme[_u! xuo`jvuvxy}rynuckx v{vsw}}}ywnept "#$#  {}yjm~|~}uu[^^ckl[Z\_gfaY\ntoszNWVSVHBRYyZ_;1-6DCSd`>9FKEOB?@523683/503,(/5<,30AFG?6KN615-)0++.+%$(($)''GP:JW>77><865//21,/).(&%&)-0+)'//.454816=CB;:4576641410/.30.8F>H=CK=4E-0,+(*+*&'+#()$.(*.,@E8=V=>W>@,//4)0)+'*-)(,5**)-:1..1631B:FFUPXiIKUMVWcu|ixp`frtrqj_ayx &rumpypp_Xn -~nxamou}}}xstyvv|y{{} ##('''()''%" -wxphu~y{ge]^mdlxmhghk]jl|ysqhfSWLICVSO8:7*)0:99GQKLUF:=@FNU**+'),,)+)+(9"+-&(&-20/-76@CL878>.-.*-(*()$&-3,,*(,,.*)),)475=KOHQZYBAH>T[dfggbfd_dkxzmWBWu~rsnnnu}n`Tg|p`_hn]j xxzptwux| yx - #%$')**+,,*+)&$~wuikrx~{vrk`Zlnywgzkooo^vxpjck^VZQ^gdIC&)+'++06YGPGCVA230(2;484073=96<752E245cB>MJ7(2:*,-7)&''%)##)4&)0062/3K=?766S9410..(.,)'05.),*)'-0*%&+.677?G@FMQO=CVTcevordaZ\avimjVJEXZhhuoow -ymg]gngijh`kabrtxmrtxw{  &#$)+-0//..-,)&   rmfYlyy|~pyjfd`en{|rxzlddc_gleakhcZUPRYM?E=510*/8?ELLKLQI1++49879=988@;92685(*3=Z66912*-/-/*,%"!&'%4#12.-),+),.5?62@=5M82R+<.-.*(0()))++%).*++7I<=KC?HUNUYvN^xejurkc\Y\ffg_ThjdU\tvovkrs{w}rlfcuobdqnjd\_rynirxyxz - -  !$&&*-/022110/--'$   tmpdqyy{|~ypni^Uhorq|lmfe^__bfg`ajbWPURTN?><@87:CQZYaY[eXtntnqib]Z^\jb^Vlr__gqmmpznolljigdmeff^eilokhspapuv}y~wi  !#$'().0234653110.*'# |uply -}qv|yrcTewri_vpld\_^buclhpm]][SPQPE=:7V:6;:E6A0,0$#'')9+(',%,826:=AGDEF^]\fYMf`rktf^_\YYZY\Xeavkkmup{kmmfgehf]UZVq`kumqnojkegtzuxyxlgz!"%%((.24666776311/-)%! - yv{}ylw~wrl[g[\iawmtu\^bbgfrwmY\QMLOOK>;9=?GGCIQ[TQ;'0>BA@D@F:6=C7:CEH;U9H?H;bS0615*-3))($(',#$;#+H)%'.3/10:4DD:BX@:B;P>+&.1$$)'')'%)&,.;<>7GECDFQXZ[[WEVMSlhfba_]VT[WTdhbhufic|jkjjfng_]XVagluorti^_Vmvz{zxlv~#''(.2569898::9641,.+&$ yusvhqzpjqvvo\jVU`bronl``fZaqps{kVXUNIMI>;79BFJWCCGO_dF56I@?E@A@228>=dEAN>AE;;?=UB41611294/)%&($()&#)0D),1.,0/:5>BN97;7;:903,+'$''&((&(++.64>?A@GDCKMO]XQGEH`]`lb[WQUKOZRWXcc\undcfikkhhfeaQ[[fmlu{~wqj|ihiux~{xkls{  &'++37:<=?>=>=<<;9520-)% ~wpkv|t\nptkqpoqqkuxytoc\^`huobZNKKII8>8=9I@DPNLFQiOE=9C@;B@B312;9LiJjHDC=<:N4*,830,3<=EG<;ON620.,,.,*&&**;2//2@>@BDHJKJIJGKGDG:>]mfdf[gQKSbVV\aQYW]|deernfwfgcVQ]_lpgqwyzojsts{||wlaht| -#*+/5;=@ACCCBBA?>>;863.+'  |rh|~skatbqorvsux|zojzw^kiirjolaqRGE;3029<48;CYIA828@=knLE??@=6B8>>:53.+?,*(&&%$%(&#%#$#%62,-+,21.5=<;961.*% -zqqvmkurnvr|r~ysoivnukjghqpig[Ra:01/6;9;L@?ACACAFI>)2?NOGB<5A=ULCMRG>?;;>>A@1D<2/2(($&$#&(&$$%&&"(*<9)*24I17868;82.,#  vrqozxsystomz -qlhsu~pgjmwidZOD;A7//48CHF@:?BEB>=8!3BPGDG=DBL^GAK>?@<8C@AL30637<,+*)&'#%$##"(&"%'.1@..X677?//,()(./94;BGFBCGBBE8+1:?BAG@;B>InA;CIB572950,$%"ymvnzwofjpt &|{bafgj{rsd[ONCGBB:59==::ACCDDKH@2D>NJMA;;?=AGHNGA?GS\]XQUdai|gg_`fnTS^S[Wavpoce`cgfcgplffi]j^c]nwwvu} oujkjmv{|}x "&+/27=BHKNPSUWXXWVTROMIE@=82.(&% - ~vm~ztwmhokkvz  -|vbddgikupicZPIDEC?A39?:AKCGIFIJSD=HLO`LD6;98101489;:<@5BB>=8*-'(%&*()1%#&#%$'-!"&*2)1NnAFRGCNC<5:./-2-6+(),2G::5:40*$ -|wv|{zwrkcbdt u`bccljvzmf`WGCAO?A76;A<;DATIGHHB?BGJSWNK6?8;J-)/4;BdaDA?H:2=,+*B'*0,((&$))" *$)+86>/3RK:AB@_I?72/-@))/*)''+c776>@;>JVKNQO]^d`Rc`srxmYVUSTSWWUWXUUgu_a^dbikhxbihi`\]gc~dhl|qnovcmvu}}} x &(+/6=EIMRUX[^_aa_\XVTOLIE@;4.+& |{nz}xqumhehn}~pjifftvzhqd`VOIHGB<6>889;?E@DJJG>5FLS\OF<@@:9:,+79D5342/*-*)'$!#%#  '()1-2E\8/+5,)(%*&)**&)9I5@=GHIKHWWyYgj -npfdTTMMKNRRWRUUYkc^\ea][d mukX]f`ffrmvlY^NZmqz}~z~ %()/:@GJOUY\_bcddb_][VSNLFA;51+&! -|ytxtvlpymlhij~z|spqgheh if][SOKGECFMA58=:>@AMIQG9*?JZSK=?AB57/32377]DTKU`CA/4/1,'2,&'$%% #!$"1&()0:6>_Z97A?=B?@FON?-FJOfLGA>?62687;>;?G?PHMgE3-;/%#*,++'0&%" &$"+++,66EJgTPEH>@A;/1**)%""((..,300O@BBLGHTaU\Tl_zj]jurgaXXVMFRSXXm\`[Z_^^_W_kujknih_ejrrospsbhjtyzy||yzz{ $'+16<<>M4F@E7h8/4-)((,<0(%#$ 4#'*)/2BTcsAEI9<:GB2++.'#!(),-*+,::sA=EFHIPXOWScmne]KXmspaZUUUNRT^a~ba`pTi`q`]^c{ohhjXelikwricxfmztfs|~}|} !$%.3:@DKPTX_ciotrplhb^ZUQLFB=71,&  -yxvz}{ughhzjhny{yqqmx]`euzdc\]TZbQTLFDDHGC6/.)7BDC>>9BDJGFMM=:89;EDJJEI@A4E9Nb79)/,0%(1)$!#$"!"4A+=./4<^rabM69G@931+('%!$%5((1/209?D=BPHRIKH[=Qp NBNO`o_ZYWVs\\U^_pced^^\_hc^^szzP[mimfdit{gfmfjrwyd`pqz{xz - "&)16;BFLQTX_diqy{uoid_ZVRLFB;70*%  -{vx|zvrhjnqhkqx|uy}qc`cxwgd`V]ulUSSD;>R=95.*.8@DE=I6>DKNITGT=466B]QE]X?97:;;;4/,*3*F0)&"!(2"$"(2,<4/BA]RECC17F?=47+%<+(#())(11@/56>9FGHCDVgo:4210/2:0*,'$$$%# ! % '58;NVEZ<35B95=3+0:0+%&%'+,0O6466STADB@AxaYUKEINM\ZT]abY^X]k]]T_Y_dd__oetbir}ss^ZWXddf_lukuedivoujygtvt $'078>DHMSWZ^chlsvtmgb]YTPJE@93/'"  -~wsutyuqphhvpljlwym|'zivn -d|xtbbUTRQTDHC>=881<:73:<=9.0GOXNAFGB@=9FSIDFGmE:O@1U:6+-8()@(&&& "!$!##._SFJKHO5464684>21`B'$'&:/7865<:KLHE@KDPTXYiOB?HSa`]o\c_ek~`MVZSR_[X]`bigooivyrlc_OUcdbhknnyfR\eplozsxzls "',39?CHMSVY]`dflolgc`\XRNHD=83.'! }x{vx{unljhlsskpg{ ypwhhru|yk[XPMKJ@<:=D74016B=67;7.DBNclFCCFBD=8AKEJKJIKVBAAE-,&()#% $&# !"  2+bIl>TA764.01+4812?(+'*-7OA86FC5?aK@GQUcY\hjOLQNb_h`naSWaTQF@KYh^V`dj|gp{qnef^I\ggdelqstXTb vcsxwx|um -"&+19>BIMPUX\_adghfb`_ZVQLGA<71,'# ywzy{{rhcispkhp|ts|w~4znficef_UPVQMMC>=?>64141:5;CFSGFYX\YWev 7pVZa\i_JLVhpfqTJQMObaN]al}hg oohpWQbjjknmlrgUbovowx{|qxxy| - %-17;BHMPSVY\_`ccb^\ZVSNIE@:4/*'! ~}~z|yvpk_ghifn|ytxoounttocdeZURVILKJ?K9@/285/4=JMH@KINSWUSCA>;A?E9=DOPjsTW?>QA%%$($"# !#*' &&68*.P2.5?9636-11B/22,..'8W?5AJB9=:=`ScgOR`\o>$$!  !&%%"68-0*.-6211@164/2/2=..1(58.1rF?<:AMHEJIX\b_hvrm[`XWTXjmhffgJJIMMLPNVV\hQWRajhibnkc`_ijpsoqefi`Omxzvx}vz~{ $*/5:@CFLNQTVXZ[[[TTSPLHD@;51,'$ |}~turka`fu}|t}ra[ZbnknjjaaVdOMF>;9816/1392/>DJIIMDF[W^dND=@>=989?mVPWSZQ^OC*"! %$#$'#""!35,-,+/030.1/35802236/9**0118:528:IJGNJQLYm\TbqdgXOWVY_^shz\\FUI@AFILORTTVVWTPPOMJEA=93.'% {{{}qwfh }{tg\XZcuozcZ]^RINSI>B915,588-:EIGGD]SLRRSWGDF;4DQVWHQx55-C&$%"#%"$&$"'#$-# 4,05?/-5/+-+&+4<5/346/)+'*,3-25C@CR@@WePLT\YceXWUSZXpW]jjozWS\hDIKUOR`Wac_]_s(d`LRcm\hheorV{tjvwzv{vzz}~ -')/7;72*$ -|}~}|uflstfl (|~}rzk_ibr{#xfcfZLGXZGA8O8469-+1;GHJPPDQHLRRJFC<;<<78412'#'"!(,&'*&%!'"!! ?V5<40,+.,+,(,0+./.,/(,,+324*07M=;HFYFQNNP^c`hkdUSo_]fjhff bNSTSTIJTZXY_bm^VGRU^W^d]][Yfhfjtkqvywx}sw{| ))-7;?AEHJLMMLLMNJIIEA=972/'  ~}vecikomw|xum`bcdldcqtkld[XQKKGB;88?8706L@9HQRRO\TNHUUOQ;78999:G?;;JMM>I70#'-+)('$$$%$$4!!6A?=-/**-,72.-0+-2-%&0+5-11S::8?N@:74/*% |kccdflt|}wtch_mifqoskf^pTYheGD;GN>664<>FB>GSWZx [VMQKDB;538><@@:;:;5@=GTNTTTV[by]ZVN@FP=579;;=J81)(C88-*'$$&&$$'#"##! &# 5;D4.2//22-/3.0>7%&%&+-12Fbm023066?EOLPIPPYXZj|i^U_afpqfU>?>FLYQPR[WUSFFM\c`LRSWX`gfuyre^sk\pwu|{{v} $*+.17:>?@BCEDCCB@<;874.)%&"~|yrbYTYiru}~xjfhpikpehtofbXMMWG?F;46347AHCNPQU\X_\Y]cPXYYg`f|LC0:NqePW`YTYYZZQXa]ZgW[Xcg}ovwun`j|vzwyy~~| !'),037;=>@@BA?>=;97431,&#  xse_dd[hsrtwrjxqsqnnx}gx{pd\]SPVQHH@963=;@C@GPTX`c\YSQVE;@J450457=??@XTUQRR_]WZTY`S__ipkSXC414))(*'''####'#! ! %&! :>21,***+5-.*0,'/)'+*+3))37:5026::=@FRMSTU\dfRQMLSY]d`d^OI@=HSDN[TZdUQQQSOPRUFMXRUcigk tcZqi{|yxy{yz "%(,.1779999887630/*(%$" }yvtpl]Zdjimgl~nqut|uthee[jsbUKI>@7;4DCBKPVbVSUQJULFAGIEGLQG?D;<>66/++(((,'&&'$%"$)6 "#<% )721--1()&$(+')8<6)&$#:)*)3.975187=@RIM^UO[SVUMKGKUVZ^XTUPWSjvZHPRRWUSV^XPHKOvRQSQYcilw{~jyuw{{wttx~}qz| #%*.03357675421/,*'%" |xsktpma]imjjrwmniz~sliecffWDCDG<::C?HESIkUUQNPTNJKHJIIHTIAA@BN=421.)+F()*'$+3%&#""%!  #!! (=A/,,+-&&"-,1,:54&&*($"%4//-5?4??;@@ULih^P<@LIJ\WOS\ae[`VPZ TOZVSOZ[W_PQH_VYTTWNK^dj  {t~s{|qonz~qn{~ !")-.0124442/--,*&%$ wlkmvzzskiljprw{ypppmq~zreem~d[NQ_FMD>ABHLKSRUTTQRRQB:AJ`KILNJFNKHG>6741*)))%%''++#!##"%!'!" ,%$!&,.0+0*,.('$(--,--**)4&##$%/1.1;5O99AHOdXh^H>GXUYULX]WVYWT\_slTNOVPnVZ_aTFB[M][XTR\jgm'-" hxjzuqjnu~k{"%)+-./0100.,*+%$!  -slmtwttwwr{z}ln}uy~mmkmvwokhhxaPX``NGDDIFRVVNKVSWZSJA;HFJH?GKJHBCF@A=:?500-*')(-#(# """#!% "!!' "'O -.3/21))(-(+*)+1/+,?&$%"$+7,010368=FFU[[OSdYVQga}\ZRS[NrXHGMH436@@DycZ[RYOOOOUmXY\elmpx4KnxX7&nnwvhevw{zuu|  #""%!"   - -zwtqpnrsty}vv~splmqiamr~zq !lTZZLBA99=AHWNOPSPW]ONQRTQNNKIVZTYYg]EONTA<60C(2&$&&## !$!*1$1"$$0JP:+'1$)3+*&))(E'+)$&%!''".&(04)+-/3,*/9GFEUraR^aZRM\ef]fgQQQaZHJIE<:37BHBMVRWRRIILJHV]a]c`jpr,RU]Q2sjw|{hZmr{xyw} ! ! !yrpmxvw{{{ux}znualdnvios~}sc^IBB@@CBGJEFVSPRQUVSSSZWXMVZ]ZocTCDA;8/7/,%$&$!"$&'#(&#'&&')-^1,/-+*059/+'(&*)&3$%$%',)''&,2..2>411C9?U]|Ox`QHRec`RLMSVMKHFEE;847<@DOJLTYNM@>HDH\dVK_jo~/+2;4:oepmpsnZcwz}|z}  !!  ~|ysrsxyyyxzw oqmfafkmonnw j`o -XPI=<@HCGMHKIIROL\UffVTolWVXWQiWDA=>;810/**(!$$((&""%%&%&%^))3'81F45EE80'%'&'# &%7$'&($$('(/.3,/-.,7:6B>;>TXJ0^BCX``TLQOGNJJCC?B695:=>BFMObTLGCEJIN\_UMekip _ins|jlwfqwuzzruyw|{yx{}}~v{tpdffldmoolunZXSZLGB<>EQCMFQNHOPOKUY[_W[WY__jbH?TB?=;::G/,,0-%&%%*?D'&$$&',$'#(*'(*M,JI,0,+('('((/&""$&*,$%-"/2/0+.,0C22S?=DJHOCkIFMT^`hIFLFFII>D>>=@;?>NBBEGIMPL?FQHEMRUUQcYmcsr~{~k_g}cZrhium{~~  tetqx|z|~}||}vlirfafjmitmyaglh[MOHGBHD<>HOGEIEJPNNIT]blXS\^XWdXNH>===;853510-*&%&)%#V3+'*0%$#!($""!!#,,0-+0)&%$*(#$!#'6&((&#&##1-0*,,52<7AFJGKMHA7MO6@cVQcf[Xitj\hktjUcpcVrqgon|  }   zpoq{x}~zz }y{v}xzzyslkthlrihrqgkprXaPJFB>96??@D\GQJQMOKQLQTZY[WX[ZX`eRBG[C66542540.*%#$&'')Q3%%*%%'#$&'#')&+=1''#.%$'(%'$&"#%-%# =#+3*'*2,/,@9-)-3151D=E<62AUYha]kfTTRLCEEEC=;6;FBOGHGLG;--5FI\[XDPhypkvn`mfc\FV]ANkspdj}  } |qt{|oj}~z{zxx|z||~zuv|xushkkkgkmnvpptcaYcE?:6:<==>G=@DLHHHG@:4.9_c_WXZ`yxYipc|sUTSTLK`cjbcz - - -zxtr||zyvzxx{|~uxx{~|yy}zzxy{{qjqvnjlgnpnlvgb^^^RDFFIEEFIKJK[PLLLLQLJHLPX\`_^XSRPOKN;@7933333149/&*"$!%))'!+.'+11#$(%%6+&%$(#/1$(,*+*$.,*&'$!! "&*)-))'$$*)->86>G;9JNUhl`_SMOODDFHAO81;>@;?k=ICMLTFB?N97C=OiWVZfrxhZ_ljvjgejhRbQU[oc_s  }u{z}|yww{~x|z{{ty{}||~z}{v|vrqljozrlvrsnts{pm`^VJPIKHLHFQLLMMIGJHLSOSOORUX[Z]^VYRJD=9?<747E-2/4A,*%+$(%""%-()+*)%'.C0(&'#&&#(##(/-'2+',&')!!! , %$++/'&*-./446<=NLG^aUehjfbRNFFDFBCN7379@@=LAA??F@CA>A<4/>6FWWWdteSTY_liprnuo[ingflmck - w  -  xmwyzvzyz}|{| xxplqklkqmrwqommltogZJLRVJJGMJHJSOPIPMPYHALRTWUWX\[YXa~tH<;<@;3548A/,2+-)&'#''!""#$"%)9)45+:%()%'%%0)$#&1*/+'#"$/#$!"!! )$"**.*+03+//01@7=QJKLQYZb`[^_IJXBFB<;<56;;;ADBDI@@FC@HN621<,CTX\`qaWZclxpmhqig kpkmedo - }y{u - }pn|ww{z{'~vz xuvqejijgvrzplmiloeWYRObSFFUKGFSNOIKPRTKHIOSXX_V\[WSO`^C78764543/;::+)*''$###$"#%&))'%'*+4+0Q(*(""00&''''I*($"7i*k%"#" !#/),&).;,/01596=JNGKTSfke`WVJAA<>@FD:9:@<9CMF@<9;8:AOQS\]f^hnontxkkknt)&vfmmhkmx~ux}|u~yw}   -~ v|z~|muttuv urnieihnnwqgehpjeXXRRSRUJFKMRMQOQQLPpXnWSVRUe^gUW\NKDAA@>N142.31>m;*-))'("$%&&*+-4&4(-.O@.)37.(#>#!%%!0"&&$4?9'#"#(4'$)&2&-/).476D6B?<<659EjLPWYfZfxjlqjj_fy !uaohlor{{ -|qrssvv~r |wuz~zstquyzxy{|xmijifqpsq}i_`ecX\P\TPJUJKMMOLQMRLMLWRKIKPNSYVURSNGC@::=:F755418R`h0+'(%&$)-##+*'&(5/-.5C&)&5C%""$"$$#!%*1#$"&"!&#&! (")3.48013;GDRGMcn~j\Z[P[Q;@G>ID=>9:>>=>AK<@AB>B:;89;<<=HSYZY[\VTOHB>;=648:9:8:8GJ<:4-*/(+#!$'##%(,8.3*/43$)*$ &! )((!" "$ " &"'##(G'##!#02+-S05@NCMNZYonrn\ODG7EJH>CN?:;<<:AH?AB?>8:9:56I_T^ow{kpokmorm\ddaighix~y~{ -}~} qtnxxxw{~|y||vs|rsqsilnlpluneab\^c^YYULMOGFOSOZlRFFDFBHRMT]`_\[ZRULIC;9959@::8<7E8E4.241.$$$$!#%8(&+0?1*8=,(%"#!,*#!(##+%! $$)"0,#%)6!$%#'(0A:8EB9;AOji-yLHA0>^C>EFR:D<<ACE;@79==HDE>9DD[LG2*-:)%%,$#"%%&')1.57.1&,##"!#+&%!('1$""$!"&"$#%AF#5'(,"(?+5>=8;76@@D6d!wPG?5>YQIJMF=;:@;A=EB@GA<=<:9??9@<;EOHMovhnuu]i|kaW^ni]fjp  zy }qt} {wtyv|}z yrnmmllkxmjc^]as]\ZYN_LCLLKKMWYSHCKWVQGTSWTbab\VQ]PGE<>>F@>^Wup\Je[=2,4.)&!#&*%&*)-3*.-10+G+(%)/#!)+'#' " !#"4+; '! $))`""" %& &1:`89;64P@EGDM jnl\H;6=LLJ?=?B:>A>??:DJMTNj|bfpv  [`snx~}ywzvy   ~  }y||x}yzywyrlkqppocf`er_XQSYTNGHIRMMMcKIRTkQRPYWRW\ZYTvONCB?7:@EO?WtYalH55.-&%$"&''%'*)**(0+&4,8'$+'&&$%!%)%!$% #& "$"##%'$!$""$" *2O8288I>>3??LQr``UML;?D?AO=>AJF><<>MA<:>Lg -VN7-+(''$'($#$0]3''+)('31",<(++%$)1""%%$5K'###3$#!!&"082713;6C@;@7@DK\PCGC=C?=9EA>;8<;9:75<;KNYV]grfa|r~~ -lOnsnrrggqy zxjlrurvolox  ~  {ztntpq$ pc_^\mWYYRUQPKHHGDPNJNRZTZXYYX[e``fXSPthEA>E5BIG]8@HDCHE@4=8=9:7OS=O;=C9<;LEC=9A;?<9PFOWZd]in~{sfqg``Mdkso -vrx|}ob`vnpuzt|y~     }~qykplmmrr i{mg^^]TPROMKJHFKGIMGLSPjk\Y`\XVVcSPNJUeC?BK:=>FWAL7M\<7;:-/+%*'$'()+&&(+4&&'+%'&*$&'0/%$&$,3#%."$"(8;3"/#),M.' !"#)./.4348BGZIrVTNR?FKJDDHMEA1/3=A<<<:==F<9>>GCD=:@8A;7GF[Q`ksztyqdifUITqNScmz -wpspp}}mrogn}zy|y }|   z|{zux|yqspmloutfkwfegg[ZRVJPNLJNSLRNIJMHOY]_\aZ^pYYZUNOIPCA=@>?NDKKEC>?;/5W?(&+%$#'(/&((%+'''(&()$4%>*&",R9'+H/##/#!%&<&#5$,{%B  .#3A1613>9=VSHTzXWYJQKLES[HEMV;;>69?C=89:E><9C[FJ>9B:979=EGYu~u{igmr~hHMSZQEK^ |[aemmtx~svo~|}}z {}}~uvwmnpqu{~pqm vjwhphnhqqznf]fWXNLULLGFMRNmUSPJHKUS]_a\\\^^c_U`VJLAB=97:;8@S>:989>89?DRD=9;@Nh$xvzbXrlSV\\K?IXgh~]gjiciu|rnxw -{|{}}zw|uyrplgjv}{lpwmmlcf_c\W[\[__YYJDAOOODJMKNVTOMLIORY`[[W\XXVTZUTKGG@8@79<<@?83=DJk2+(*.'(&#'&+*').(((4$%&&&%"$7>'"$7-*-'#5* $1('!! !#/$$*6-.R:=:AEHINDJFVRT_FA=;@B6-38B?DUB67;7<7:=:=JDAHN`toqVgtqvvpnc\Na[[YXeqmp^`Pdwu|oo}rty|{{  ~{yvy}rkkhigkohgpm{tksc`a^ZWXXURWc^RNIDILC@BHL\ROURPUX[Y\__Z`[WUThPILFEK?;<=6:=<655:8::=DHL?@Nd^QZxnl{pWANOZZ[WhlbndSGT^qqrvys{||s|{ w|~nmqghjcjmkskdkablnf]dSZT[W]YaSONOTLMOJFDEP[UZPa_YY]c[da_biXRPOKGE?=8?;:=9g??B126,)0-*=-<,/2)++')&*"'&&&(%$7'(%!"$$(0%&)1-/&'."$" !; !"#&)+),32ACVAICGOIIPQTNPZEI6,-1:47:D7779;@D995:8;:@>>=9;;A>=9?DAG54711..*,,.+)+)(-(3.)'&7(*&'$' $/&1"!$##)'#('.;%2 !!!)34!&!$")(=*6675438@AI>DWQKi`y~F),C/05F=389869=DE:89;7:<=<:4@@IgJXt[anptkkWP_idc`ll[HFHR[i gdkmutyuytbhgm}kc_faf^`bh -z`jl}b`kYoZWQSSoYQUMKTT^VTTORLPNbSP]Z]a_`]^a]]VVTVQB@F75=>:>>;../,02*)&)*,,)-))/'*5*)&$(&.$#0$!"( "$!$*%('%!2$% (M  !$(-0FC5.16?CBDGTp~m^sV3&).-68=;63769:<>730654AG;C4;EGG^QT]dfrzmmb^^}zhffdwgwo^ZIBM^_jZ[yklyqz|mehmfiifg][p_YXb^UPTcb\YVVVXYTShie`UR[ZZTTSOUMJJNQm^`ki^_^da]UTTOI@>:::8?:::99/,/1131,11/+5'+*,*,.nC*($"%#%"%  $" #&(D7Q4(-"##'$  'E"#(*9?487.8>D;866:=@MQQSh\`ppjiltXU_[oe^zZ_jOilgj^YRTOSrfknh]akmofjjj1jckcZVRLNQghyYOONMIZRXTOUWUUTW`X`[SSMPIJEPRTSY_\\ia]ZWVNFAB@[7:6:34??@CD7741/+.415-&')))))%$'$$F&$#''&%$"""!+'*LN)(%6-5)+ "  #+0+1:?HYOGGTXfYVHYP9-*)-+0W5;*(0793:6>748::A787>CJVUTHIZ[hjwta\WaY`hf^kR[V^bck\]dIWWV{W]f]bdfksogjyuqabc^YWQXTUXT]NLSLT[YZZXXe]e[^f]YWSUVV`YQOT^_betjc[SQLCBA?9A=6766:@O9>;gE553+./..+)(-3,(&("'(&'%)$'#$#""! "")&+*&&+(%)='' ##'+*43@;IJGHLQEDQfOGPBBIBD>:5//,>82/32<:645556A>83:=?CILOGLGL_aeelgS]_a]dcaf`^_mnhWXULFXTLVV]cYaZe`]_ozoy}ck[[[XULTYTRQQMN^UVWRTZ[W__cbk[[\`gUV_ha\RXi[ZZg^aQOIK@A=;:M=68225\A6FDD<436-)'*)'-(&*)((%#$#$&#*$(%$#""$#..-+*%'0+++)H)! $.#")!*((+-6F;>TAORIGJNQW[OADHAA=9<3Q34673446:760136;;:=6ABAIJOILGTqicdfbc[^Y`^Ym{gfe_}_Jm_u;JKU[Z\g^Y^_a_di}qs{lb]NQTVIWfhVQJORZb`]Xd^_\a[bc_]Ygrh[__gil[eeZ\ZTNKKHIHB:23538@74421;4>>9A[34./-*)+&%&)(('&&$$!"%%&&'(-* #&$+91?(*,1064&" $)!'!/* !')!&(.A.N9DHJNVCDVgtZTMJHJAF:@G>%(111/6/6.41746696:JG\FBVSFD?Jbl_cdepf[KNQXdmkinj^U]_iSLM@XnYMWiZW^ebfbrnyobfVHRSXN}WcTUSWSYfe{cegg^f\ibd|_lpf\qepce_ca]VQIGDHKRND6765/2=:648<8:4=8704/0*'))')1**)&&#"#%!"')$%(%)#"&A;6+7'<5'&!'% #"364$ !,+%',3A_3>GIH?VFBDJ[VMHWOFLN?>;@7*$(/5.0..-/513307845BNBIHSLQ@HS`bYidkr_ZOUMmimkszgjUSQZ\\YgIFXbTRSSRN^]aj}~bYUYUXXTSOW_^^Y[gs tcgbdaffghabkbseoefingidgTEHHGHURNEC5414DGB42469<721323.-+()'&'&'&'))&-&&$/"&%"#%!"$#-$&&'#-#b+$ &'!!(N ,%(+/0?B=?D?GHCFzJDCJRSGYP<>9B53(&)(,-/6/2617;3386<37;DFLMI>GDQOU[gif\UUB;Vdde0_`UY]`VGHGFRZZXWYPKMSZU_efcWSYZ]U_WTY\Y[[^\``d^\^gb`ee^hospkiiokmtihbWYLMTMFGV[JC663::3<;56-;;97307-*+-*6+,$$%&($%&''$)(''""# !"""8&%(&)."*)2%:>!# $')%&$',068<:CDEENOLXRAGSNKFLB?8;9M1/*&*10-03485566355365:BAKK^=<>MO^eYWWSJTRH6P_hr{v|\abfZRNNFMX]UWOGOOPSU[TcfYXYXXTYW`bb^`e]\Z`_XZ]ab_ajdhhljrnqohfjrd]aYOKKHKFMHG<45>;@46852169::5011/22,-1).)($*8.''# '*%*#%$$$2) %-1",+&$''!N?  0 &$&,88;@@GANUKMOCaJCOIFRJ@;9;;@65B*&'))03748467446432@B?@E8E78ACTYRPJS]VWPFVne`bpgbYosgZXWTQIH?PNUaYb_YPN`ZR_]\^]]Y]Zbdd[XYY[Z^d\[afeZ_eebdrfjplk`[f{plWTQRPLJFLV@;6>9SA35:943C99A7504CVo67J+.'*%&)*"%($(."'&$($(%&1&'40#&$#/".0" '!  !$"#**5=B9DBMOPFHKJIIEOFHEA>??:89bH)%0),04/5338BM8:=96:=APE9:0;88C>IIKVjYWjIYQ[X\YVILN[][[WWWV`F@HSelr^Pa[ZZSSdljZcdcb`a]\_[^Ucc_`_^\qqgb_hrqja``bca}`^VOLWwLRi?::@;=>?6;92958@@F;5950,0.,,*+.(%&1('%%%)j#&'&%"$%'1&)%"$#% %-./ 3! !$#))(1S82H>GCIDGRQOIER=;A@E=618B[21'%(0//1/@5257::283>@D==9GHNG<=BO>9=>B@=EA87<8:>N=F:,/1.0.3*-'$''&&'% " " %)5+$&('$%&'#" %" $"!! # "')/47A;4337EIJFJEGAA@=?A:>JJLLOXeZZZR\XVe]Xrsod[[YNQKMZNe r ffXahe^Z`cddcgkj_`Z]fgmfva]e[``\]_^VORNJLGPJKEEFIDEDljZ[_hH_w9;>=:99C01-)22..+-,1&)(*%!!#!!!#%&(,%&()&0'&#!!""#$ +"!!"  3!54 $#%,+08504:;@ECMME?QAF>?>=8;9=4012.$#((*+)),/0262-/CG2,4A<5;J7;RPJU]Z]]YRSWRZSwqb[`e]d`m_\`tx |sXZ_bq]midhhe``cjziZdvhbd`wup^]S_VXTWONLPLJOGKDCDBDB@?>FDM[-\IB:<69375C;20/03..<-:-($##$ !%))*0)5)**(:(&'!*$&"#!(9" $2#!&!%'()0082J?==KIFHHCC@I@>=@A97>53:;S-)('#)(+-/@/34*02<308:C8I>76:?/71+/4I)(,!#$!#"$,,*2.:*&&'('#(!&$#"# !(9  !##+-&2D@AIFOERX`RSPLGQT]`b\`[QVSUbU^^ajslbU\r}~jNWQE[NOU[`^\Z]^VVVb_ZdbZYYOQIGJGHJHPHJECC<=ADEIUNJAD@D:NVJ?F<<:<=;>i6A52WI8++(%%#&0%)!$)X/*(-))$&(*)# %%#% $ $* *,&/29=>OLFDDHAEQHJG?CEC?:98:;g3?H2?/-0*)(*).43,2:>79>>:>FA@>D489IFGJLFWWHGFXUSWSVUTNNRUQU`_WkfV\dy -tqYIPDNQXLUTXXUVi\YV^aSUROOHHBIJHDABEFSHAEJ7GMSp`NFLAF>BAOBEDD@9@?:7?r[H9480-,/+$'"#" ;+ !"!)G+1()'$$##.7''-.[($)*("& !-!'&)1!!%&$:=8GOG@9DKAIFB?GAGHF>9>:7/@/5)0-0,&('%"*,32,/2654=AA;;CDA@AXxY:H=CHESJISQ\PP_ERORUSVWQPVX]^_[YPRdmko_ZW[OUZOVKI[\j\]`\UUNNNLLKHEACLDEBBES=FED>:MWpjbLJF<>@BACCH6@D8=E25PI:GE.,))-'*(͓-!,(!')-%&*-'((,0'%/'+Mj(%$*' &: !%&$ "!',.17T=:AD=>E>:7OsimoaGXD;9:@@IFCEGIPRFlI=8=7?:/2-*--...)'# %('0./2?>98;>@94<<@HGHGJLMNRNQZRReGAIQKHMSQU[YMRNRPKICMMSPR]KDDB>E=E;:<@=D=F@<9CL=@PAJDCEDBELKCF;?@;43/3,/45721,((.0/5C:C;<>>?7@B?I>:79;FFC340/++/291H2,30-?+(/$"#"$(# ")%'$%$%"&%&")(09.+(68A<'($ 6%.!""$ $'"&((#%*(5LIC;73035;Ii8+)(%%-27OQ@JO>:8@9;93R}HMK?=5,4?BCHDLFOdD>C8>DA@DG@>ESGC?9??@;78;::>:G=T>H=<=;=HHXDK:==o=74847.100/*-++)<,D1>1&&$"&"&$ "%&#(&!$&2)*''+2@.))4.//,%(%FS)! !3 ' "+"$"*()A87B<9CKPO=41222=@:3001&&.:O?:QeJ58CA4'.4DIF=FUqbG4.:@B?AH@9CJG@@9>CAC?BE@HDABH>9=;D99877?:=JJ??;<=@;CAR_TLYM<:88;=3.('.)$$+"! $!!-! $"" !*+2M44@C@77B>B=B@BB?>B?FT\=:G649A93=895)#+BAA>JD),99DHFE@HSD>9\ETOP?IDD;558@?>?@>@L@<::89<::8;=B:::AABAA?<;<<=89:75788:I@L>;C;F?C+ ''#" :6@((!*# !!!-+26*06WI:H2:=@<:@>@KIX>?E@;:9899654858;88=;?=;E@C@:9:9<663A>;588;C`LP@8@>D@?=;JKF=@<7<9319;8/R9-2.0-,+&J/12+'&#""!%&%'((&.,*)4,,3+0,)2.W70*;-&*52'-!$)% '&!""#%##'0369:>c28;C==;9CUF_JNML;D8FVa7410311-%7-557898419=77M>Qg?C>=>XCBCH@;A8:@79289370.+*/H/,*&((0,31)&')'%;-/)+7*.21=N614/3*,,;O.3*)&()".%/( &%!"! #7,%36:/59G89;:89=8BN|HKB=H<6C@EJ734;6:2)(&/116B=;=?7;<=BG9;JKe>4/.04::23:Crg=@4566564::7956<:8<<9:8:=536666;I48:;4386?EE<<<5:<=-2:A53894364:24/-+01*/**))+)-R='',43`JV1354324/:-+,04;/?<=1.'$"*"" ($ !3". #-4(')8?1357<<251;4?8@VvpvJ;8B;??@CBE>B;73=3(,(+45899AB8:;C?3763;BE4@4/41=<@:CHMCI@42/87<6468:75;CJ@;8<8<:582555516@7>=7:>5;7465204263792585<;?H8:>9<;7?DSG6>X613()$%*27=967GM>:<6;=:J2D6735..C??::A@ME;95298;55985::@^[H74:7332/200298278:9:6574A6;4724146:RF:9131?A:847877674267/7?I.01S55996@24>_;,2/2=>2>33;1K:_78C/-15=<./10+)0YS1.*&$ %&&#'$# "J#.#)7>==*%0)*2.879/223004RGPBAIGJ=:<99VQF71*.474/+,(472726=B@?=79>3444>:012?B7M;;;F[B<7694719923636:F9DU32404I43153=4C9=3247;8996876727=78?>55486:>=5=6=984/0956BS4026:T<E6<7@H?>4JC5./29>EV?43501252536748999639DO@:665455456IE98764639=7=6625>/0-115S651F85?c5;/-3zT0AX80LB77258264620GO4/+%('/15),*3,(-*&,)&9*,?: & )#%:'  2B+.*$$$)))+.*-/00.3//2@BBII_?Aa@?AyT=8>.053?;51,(-0642869NBL?AC79898?66g?C+15=?MI36Q83A679G7;2:98:AA>5A9G;=9E8;N8328*9495;1<=77,1862/N>74>66`K=7215770x|98876/43/901357=32.j#').0)4)0.&?7+'**94-+$/+:4K+ $2"!$!$#$,'(,,10+015*(/>A>?A>?<<@DE:AE:88;.:4B:750+.2;2F47H@FA<=A;M998899489:9?@A3974;54:77A:A:12124;[G7<>:868/23-170E7A0;784F7),A-/419-.3/2;/21(24074G//1.)E83+(*'%%'%(&0+*,06;)((@%&(.,%,14-dG# 4%&"!2'/0-++,/4/.,)),/6F:9CgI?A:56=>I=M:03F642--''145H=;>:@FMDE>8NC>=.+*-9B4:4?890:?:;;;?B=;@BB?E;>N:85;=S;:=57<799679A7;4644>A@:2`S99:;53M^M=3A3:276>2545420,0(((%,4/<=;4/,.+3CA95C?4,--/)+%')&*,(/).,:-/D+&,''%)3)2**6C4"$3 $!#$(?*(.25./.-1/.?5A=;@FEKB[BEDurKBE,05665+*󼗎X:;CD<75G=@H1,4/47-.616966A=9G68999F9:UC>>>F?;<A=9;B?@8?G:;CD;94>@<:4@245768AC8U373;9WLS>C=8?88.96952-3+*/*$'+-4*14/:*+)G00+970;<5.2+(&*,E>*,))<1+64-5/*$+((5-'%9)!<$#:!,!$&((8(229+/11*,0188:A:F4@57AL@570//4678DTL]Z@<4<;656/63=41*5+-2145658279>E>?@@B8;B@E:77>?>4:;HKSY<=89?D98<898J6/8GDAA<575<.24847EgG75:23111/23-+-.-----0+016&-5->0.-0./10.2-(+:0,)()))&1*%$9'*&)':VX&*&&!!!"!#$$$#!&-,.>6,/2,*426;DDFJQE<=CI\D=?D@P=-/25aFJk77;,,;;AGaxq?513--6>743;P5,48=49998=3/987367T[K<17221+07+,*/31/1.7/2),,*+))./80,+6-(3*+)(4/+%##$*")-)%&/'%,#*0.9-&"-(#  .*%+.+=+24280,-/237NDWLqNsKLDT@JM`bI4*-1ODB607>E51/G@X`8699552683@CYA//0541,*0++&--**-85D5+)6&(&.*,./+4+()+*(/+*)-&$)#%#+-$+'&)&%$#)(%%*'"" %$!& !#)'($/+*.,1.15E-+/2:HK]GGQCB<7WCFnRVM>37?54B=?>?^W@26ARWpL>5622.0O99E<;;>5..9;44.372.0476464364:37:D=?<4<:A>B43=4L4;--'2),)1.1,4/R/=+))1-1,,.-,59,%%+((-(((%*.$)))"##,&*&8"")%%#/*#!!!3#%%)&&$/9./)4..708/125NSAB>D=7;:SJGSH>2R4414B?EB=7lL7.02.455746;<<89-,12005343/552131668100.JK6A;>:5-..,022031.0+*4B`>?XxY4>F6845730175VRBB6=A:0*;/7*),--*)-2)5-+*055141/..4*&'$#$(&&($(%/$'5,S,*(-+WA,&+4('$+4*%#!11*$#$&32#-.(*+,0@.-2.<5GFIA:O5E4525456624516699TE:BH0.54JSs7.:2?*$**..*/@+'')<-'%,>N:3-1450(-%%'%((12':.)&)/54WvA+:U+.9,')M,1'''$'#"89/2%(!"$'(-8814.--4/0/6:ZLD?@>X?AMOT@8594=759?>7@DJOII712TF7T544.04+*.CGVC/2/.-A+(8*071.069K1472343/4;?5550,.1,-,,3+3.1,-,3<41=J;:8DBF@B;1.421.?P0.,..&+%).+*,4.1+'*.+)9B;<5*43-(),*(&'*&*((+?-'%&)1j7L//1?>(-**#$(*%F,)'"##M)$&&%#(%"#(,J->5,.136/38@B@7A;@JCFAHB=,34>DF>>DHZQGD],2.4(*,,22;/11-36@LZ=.+2:1+%"+-/2<752I3051-4705?74565816/,*..+.5-024.53:1@VC9BFD?AE@60/(/002-,.*)'#$'2/*)2Q-8&-'-09I:64-+.@-&%('.'#&!$"&)(%$+$+Pg05*,jR(D61$'+%' //* $$%&A/&?T3(%*))*+,13.1726?>@A>DDU?>LS>5GBBWL@?G\NkDrB=;6."##-/45115/:5;V1-0,,*)-,,+.03-,/91+.754?8<;803/-.0,.2,.0)%"%-'+,'+)2-52/+-+1.,742;)?4%"#$+'&$"8$!&):' &L`/.-/%.,@;03T(+2#*(1:!##:(+:5'(0)+(%)C&(,K221382O>5;SIAH:@FWI:DOKg<>H8BB4K^VrA6B&#'1465492697>>=23601,:_:1*+434/327G81,-,.-447;0125B53-*+))))-8.2/./3--37918B@3370/)1..*.*&&(&+*-++/.40-:/*0+((.3/*-62'7$!#%$#%'""!%%'%&(;,(*2-+,.02((?4/.*&$''&"#!$"&010I-$#/%/(-5M)((310126:y80BYDH^KBFGB==HHk9;6:>@Dsn`eN@>-).01<447=51;F8221042-@:5>&'.11-2C560]15..0-,0021C51+-0.,)(**01-..(+,-05L1+BN9929,(/,-?+3F-,./(+.*0+49923*)+**/,,+,5+'$!')%&&$!!# "&$(1762+=6:+.4..4-5%#"((*AQ#""Q:=2$#%'(%&;6D*'$*?:0,441./,,+5%)*-(*6));621/+-:-'('-0(0%"'%%#-8(/-K3*(#-.66E=02'& )"$$% &$)1!#&+"&#&&%(0@#&$+0/24A:O.7+).+/,+$NP4((5000:584//33752200+***))+.U/&+('-,(('.+-00.<,0-0.&-)2575[Pcf48;,*,+02)-)/*1.(/,$*K/B0,*4.&:)'&#%)-+.-*D70:)#2/62@E3,.60G*! 5&(#-,$!%)($$&'P2,$$$#7++*746348:8=;IJM@>QEC;?@;,*4E59BL?WF=T639&//-56?<071>)+*,-40-0,+++5;95<9676D525/2MF/-)64.0112,-051)+'++/0<4104,*)%!"-/12@I=7;;-0,++**'.0+-?+*:,6((-*/02*/,&$&$'')(.-*QJL4+4GU4+)":I4-")F/)*"0 !)'() &$#') !##")*)*JP=-4:6F:;7:DGA><:J=I:?890K*9?LSDHFI>J*/?'.0I830/D*+*/278++.:+&0ZI?MA:4;B:1-1.OP681>158866655:7.(*+0-12011C1-$$2371C6@5552238-'((**1-o//9/+(*-'/19/70-***.'',5IGP{X4,GC,*;)/%&.-,$J$*B$!&  $"%J *%)('$&"%&$$"&*'*G372.36113?:D=7A@DPB/265@CAJq_:@.0,.-4..+,/..C".410/24H523?058/)/,)6-+,'+,--,.6..-+04,'%%&,&.+*46>P dHly""&'(>%$GWU:"%)+#!!& #$ $&-/""#$'*7'/(('(073-27124<:23<6A;;1<4@BTiWa=849,:Hm;2'('+6+2V/)5121191./0,**$.553651B?10*-::64@R?=@OvCW;:4125?50.-+20-0-1<3c@,.405682h3,6:722+4,,2760)()11-=E2-,+/+:)**'-910DkK=?S299-6*1'+)@11S,-/2.1-+0-*8T.+@25093/L1&&%-ZL@H05&'1'0>/#&'.2C2472,,&.(*,%(*S46+7G::.(* " !""=C.+! #!$ "$'(.*%)/-303,/121:8102226?6>B>IhZUkPQ8,1/44>+L1+*(2?9R8722.;37?C4100/3,0419?C<4273f:7;>CLQd^Vm+*$+H-6%%*#$+#$%(>F(4]AT@:#+ #8)*"0- #$!'J#$3*))0,*&(,-5CE+/282:.4<>7F9032G=9/:..,*/:.-63-..+1:C*'2$#4+35*18)+!#!")&'1FG# R!$#($@-)-SLM?Qc:2 ,* J") % $#"%""B!$+&%)-0,.)(-43b4004.929796)C<(! "$!50"%*!"#""#"%#,(&&H7,/).11543,,3.O50/2915;CgP\RME617 "*-,*3)+-849AAB87341423446749A@SA;69@jC91L41GG32.--/;/AF28A201(*)9,;,(0-+$)# ##" -+ ($&/-&)%)5-)#&& #%0,*9 !""$( & *(/$%$/(*+/17*7141,07552531F5Bd$eF745;76776>:768=38/-(0(,..+)$'"#"',"#) '!&%#+.-*G4+1"  - (!!;N5= 1 &"$"!!*!/$"'%(*+-01.-*.+0*37,M>6556??L>CF5B9101239=/-+.-240-85630P5>7=^9765::521<@;6=L82545DE<9ODxI72=3265<0368AIH;<5:857.6/2851-1O;69O4A078;938=9.31,/--*.+)'("""' $*% #"%)$"41'/('! %(S?#8 !)&#(%$"+&'1! #(/9B,052G1-/.(*-0AE>35589@BIR@7L;:4B8?JY-&.,*13//*7/1.:7;6>JD68OD<@4788880E,(23U@>4;-C467D5<85=8?A4=306/32)C.--4$'*%(!!!%+!,1,!$$$% ! !"&&)'")#5" 0 E" %$*)13A)1ZD1+.,)((-11384WBB9C@?99=<7:;>@??-)2-4/3,'2(:0*0./.,BW\87U?815<6D605%,.-18>629049:=96MX-/1462?DA88M28@33-.;E6/2:8;650rAEG[MA8,/5..'(?4)0$$(#$"!##%''J%$)!!*!3(B4 #"  -#!%'!(*+?:64'06WQ)'*$*,/6:I;RB?96>8GIF=?5B]}H70-/32-:/3A-,,'7-+,1:;BF:B<30557INT@,+,3;476.0-=GT7:3I?*(/3:B::A?316M762779JGVE=6@542Z@FdkV<@119+,'&.+@<(%$##'' )$B"!'":%*  "%#@T-"!!$ " &! !#'"%(@M?M;/23()),%%+*225>=GT71525fAITES==<42-56.,5>I4-(,,:/.--559J;;85661572MBA0/459>030.2:?727=C*+).45823113154384.41=92:?*60/7=K{H;13,-.,$))*8(@8*g( !!#$!$#&""# 2+#"$#!! #,Y+"'$#%# '$8Q:,ZV;O,3,*+.+>9(#6##42W7Gm5;<5Y9/53FD68/,42O1, !$81"2,5##!%D*%'(#" & " 9GK')3&6\(&.0P80++,A.20.4#%$"3.7+682/AGmFK\hd6435.-,E:,+@99561.)*.,-/.?K822@A253,)1023,+-1)061,,.+.920*.,133@1/22/=<<262D?33?OD?12,0J6;:3;,5(3*-&)+R327@C/0p=+($("%BW!&.) !%0%&%+'F #%D-<)&,#'$ ) ('=1&&#bj&'2%1=/&+/0.,02,/"'!*10-4+++;;98I/377?3*-)93U1523(1'="""%E1'TI?1>fI)( '6m+'%+!>!!$,%$&!''B=/)$&&4P7DB%#!",(O &&&)&:'0.%%+>`D9.1,-'#),,>>.:EC1?3VPB=2'#&)6>8,;()+/'*+=+*+117,..03iC<*$&$%D6166,*,'&+1)1204+.00355/3?14878F897:?5.01;,.*7-()-*3.%#'<&(6+%')3&+@@6Dc0&"($'''(9';*##1& 1#",-+J,+DN6R!d7(' #%/:!  "'H$&68A3A(q6998)$%()*0)>F,/H207.'&#.-(1..%)&).())&/6+-/.H+0,),?oK1.'%'%)45))(&+1,9/.0,/1/0-,015,5;4U:C5f564773*1@0/4--$!24'&')%)>(%#'&"%"&!(>58)4.)!$!'%$ "/(!)#1"*+"28B==AR9J}5T/'H1H&!% '$ &%""3(2?CILA1*&"& !##)%*%(&91IN/1<2++)())3/,(%"$'(-(&./3),+&))-,35&'&$'%$()-/++-*))*..068/20,,-0+75=884AD@:7214Y70553:@21''$:#".;%'(*&%!""!""$Y-$6).O$(&"'!!*+"#(?$S&&;.28``ROPI k7RP$ #.J#S3!!$**,"&+3R~VJIe4A)2*!&$&%&').*)193+))'.9'&!"-*.,)'"&'+($+)Z*/+/).02"% "$('%&+;$'C*-)&,+2'(&*1+.-H1018N<4;5T6/SR>O=21,Ia?/,-%)+-.6C(%'*,2#%#!"$!$0'"%%(2AP*%+48/-! '3!%#!%o.Ej rGM'&%&%$$"#*,+)(.'(&,$%3)'#)*!)$)#$+'&11&*+%*J'$014:-/72:1075799SOV>4<0/:8A3-.R0&,/DE6% #+V%%%$%#*&,+( #%6X-*.""4AT'/--# #'%G+]CCM/fhX:,M&<;=## %#$%#%%$##&"!%$)''&#.&'$%/,""**(#"#!,+'!"!$,!& %&&#&)+A+%2,*&%*1;7TDRodE0))-*5F^BH0C20(%'/!"##!" $"!"#'"%"F"*>19$;)##+& `#9/,(:"$$"@$%-2%)3$ -}] !#!%>,(%#%z5>&-+* "!$,"!,$(#,!%"%$#'&"&+')&1L"##/'"""# !  !<$!$   ! #%%'&-7>:('5(*124cnvg[/-.$)5&+/)0/8%&&#%$,**'#! 65)#3% .$!)"#"(.#'#$&('$$!#!$#!)%=&3^"#+'! ( " $* /$ +%! "$3<;mM*.,2/1..uaeD3*))%6)"!"'2%,6%+'&&&$# "!$.!6J85@I* &!!!(!".'))(%&"&).,#"1#2*;0/ !#* $2(%0$$',(&%! ,(!&"" '%(%%#)& $!&*%!!"!A""# "!"!<'5&)#,0%&'3/WIW.%$$&.'6&'%01-O@3& %"("" )#.&%$#M-,*!4! )!!"!,#-s0YC '+$-T~q?$ "!%###)'#+*#'(""( !%&"#8#$! 2 ""  #"$-"$!$!"!;$!.>A2NDo'&#%&)',# #+/-87e" ,#"-,)%7#8%&3E"'%&*""2*!1i155+!'/F.QH5*&%# #%)*$"$,("#/)%!&#$&&*% !%!% !!$'!! -!!E&)%*).J0PNQ7"""01=&".($E%&'4 )!'5$"#(""$3-#!"/?'($&j&2G+" :!'%!"$80-C169.$)#&" $ $ '% "%#!!!'#%!& #)% &-:,6#".CZWV#. 6H18+ ,8.!!1 $  %#* )#  ."#&    NC*#!)(Y(27="'"2!$ +$%")*%$1@N?B+! "#%%!*!$2!$""#!%!! ,  )!2"$#! x;"#* "% *8&"L "+#5$!0   Q 4?)!#& 6)!#<$%/ !#" 3#$$#/U?2H !$!"%!#!)/// '# %!!"% !!,#!"2 " 8%*_(0 $$!&,!$ /&!(" ((;F0;#",)+'$!! %! #&'%$"&@2,-F## #""%!# ("#!!'!  ( ""*E!'!&%(!/  &#"!$""*! # $%!"!&%##%%&"$&%%! $#!!-!#$$#('8(#*$-.')./+(/1T(%,1-;ADUy\;9>3FoA+++-(-,/((%2 6=))&'&$#((&/+*(',"'(*($$%,/&)'&+&()/15/21-<&-.1/.)0/4.8A74),$%"#';L/17C=9<2:>2496'.020:=*,23/1*'/'''34%'" !!$+#")%! "$" ! &!% 0%#%&# #"$- #,"!!#("%#$&"&)+)5-0"(?,)'++#-))#/)4-1,1.-824,)0+*)5+./501.,)/(&*$!+32&23N84I4MNI=I?>;;/74*,/574.#$5,*.-UDAIIE=GGELSBD?CP9@4+.-11*,1'/)*,(&%! " " *E""(%!! %#!"!*&$$&!! $'&)!!'&&2.)'%#$((%+*%/-(-.(57/3/5-+%>?,,0*"'(,.4L[408UlJM20//-74(++,'*&$#$"+%+-+'$&0$(*%+'++''(+350-3/+0)(%$+,-78737A988:2:8395C:31./,,15)%#17C038=69C2;IF8.,*.!%&("#1).3 !#4  5+'-  1%! '% "! #! #*-!$) ''')%.,/@- -*''&!/2/<@,'1#" +?-,33+62(,/04?D0*+1*'#%*(+-,-,#/.# "*E&"#!"#"$'%!#'*+>0000,,5(,#"'(+,.(,38Q:[:77>E?<29E59+6[?K9,@-*(/,?>MRQRIELZJSBDU=DR`43.(+(-$+$*%% "!! -  !#%%!%'"&!"" "*!)-!(.'%/"+%+)*-94*&%-2*)%&@?EgL-$!!$!&2>&-(-)0(/+-350,-).-,,')*--+A2.%#$" !!$*"!$$$&)"&&&$,*$(,)(*+0'!,.4,10*(-0PFEHF?I;=<:F@+(+GI=6G[2"(50)06,-4JFFSQSZJNKJR`k[R@:0.+-&'1*#&(%##%$$#&!/+%;# 0;M%%&) 1!$$& ()!#  "!$$$>#$',"#)B3:B3-R1.(.103B*++0'3>/-)$!$&(/4*++28-*,-/4HSMf<1.+)(()$&)()% )!7*: #"$%" $&"'+%#&&**(&*&%$$#&8,-097*03++#*+HBWK@B?@8:?>A.3|B=@22FFAIHL\RFDjJXY[NA@CC/.7K:1*$#(',B  ! $"#'"$+)'! 5:,Q4%# ?1 "!9-%#%!&"'"$-/'*'.;M()'B5:+0+13+/B.138.1G95),/0/+('#&/1+./.0,*$ ,=/9zF(+*"++ >J')*6.5%#%0)$$&'%#%$"%()%"$#,#$$%$&*Wf*L{0**/431-0*378<7?>TP@CLQ8T3/1VJH;L{6.@JRFh\ZVJEKJNflbiG<77.68098)#'95@/ #!!!!%. $"$!"" !!%-65#&##*"8!$'&-)%# !$$'#%)+*CN?O=A;DDA2/>f9@P^6*,D?;h{J E?DFRdY|rC9I>@>46@9,+,0-0%#"!"" $$$%"!!"#)" "!!7+1%',3,/'(&)*"-'# *#"0*%,&$8,1,;D-B9:>TE/&##&2u1((0(')'(6O(#&('*6*+*((."" !#! !&?&"&$%0//05#0.?'&%#1()*%$%%&'$)%&(&&'(%$!!$+'.-3-17/8/110/-(/0J:;=9G9?BCA>75698:PNM>-43=@JeSeHABVU`~qL>22<=L:88/-8033,&# #'%< !"&,%"   "$ ) &# !$%, " "$%&&*($ "# ##(%*.D'(7#!('+*+3..719ONY(F(&"!''&,$&' *!$'(%D(,3C*-(;4(*) )&%$$%#!!; !+'1*...,,&7*=()&!%.+((")0-%%&)'"(&*'+%#" ($)G1LEH123401..+,+)474:B<>QNH;:3/49BAE@7804:88LJYpLV[\MTMJC44::=712-((.07/"%#$)",+"%%!#%#%#"$$%%!*2 %$) &*%# "!!$&)'(4,$/+(0-*.357/028GT*74.(-'$  !$$#"$!$%(+',-(*/@X()-E'%$(#!+#$%%'&"%$((3'()9.%,<('""&*&+0'-&)(&&'')1*0,+.(&"$)-,(/55A654212(+***:>=::7?GDDf30.>KG5<74.8:62+.D^Zew a[MIA:2992.2,/--)+34($%"&$##$"$! #!&! #%"*.G(#""'# " $&9%$$""&"$#&!:.<,47/254730$-O47.60*'%#!"##""!#-/0)+2&%,-0**.E)"$A!"$%B!%" #$ '#'#(*(+*'876$3)&*&+-,,*++',-/.5,3*),+%!#"",+*$%;a20054/0. (.:C@7ATA9BA96217^KVG78029;03%'NNX\ SMUL97387,,*39,&(,*?=6$!###$ ##%(!!!"!!$0/%2$$,'#!!' *#$$9#!2$(I;(( "),);',**375@=6J4@)87--/*+0-1$!(,-"%"()'(#&*'%%),%)(,()*$"!%2""&&%#(&%(O&0)%@*' "'%0m2*+-+0(.?()8*+*-.3..1+"(:%*)&,2,*(%/2))+31-1-*'--095N;@C9:C961466=:?710355-"FKRhPSPX<>>6?3*+>1/(=2,%&/,&&$"'!(<&+'#'"# $5$<>/-&"#  !# $%$%#>2.#$)*)$Q((!$$!$*'*-(,*+2@8482'$-el6553-//2(!)+,0'%.+($"!")''+,****%$(% %04%$*'"&""%&&1(")*'$#'$,*+--(*--**/++))-10/110+//**,)',--)-('>',*+342-.+(,)-;GH>@=97E>?34-2J6^E211121.%#*CPMXTQVMEKG:H7>0+*,**0-/)($$&%'!("",%%"!" "&&41(.-3:!  %! !$!$$4.n32"(""%&$"#"$*!'&)/,4,228?=--0+Ja3-J0--!*&-1+*(*,*>%#$+'()d))&$'"#"#"#&-)%$)$%$#%#"&%()%"")(.2+1+)'((*(')4*-/**/-/3(15.12,+3:@4,/+:1+)%37<43/.0&*/5M:@S915@?7555L4?;6.33445,,+4pwwbYQVMGE;30556038..@+%%$'&$#$ ""#!%#',&% ..&#.#" '"!#+(*).*,>.$##)"$'#!(&,%$''%&(,00.)12/63N<2a`9],#,2'&*1),,..+**+(,$%#.+%''(%$#&($$%##!!$($$%#!#&((''%#%3+&(*()*'&,2.*.0.030)0--,00:K.255543.3385./-20727817=332.27<<41=?8478345:C:89621.)01`{_RP][VUMC;N52<4CjH.4_*-*2.)#""+F,%",!$#("$'%)%# !(%# "%*W$:5%$,,W01'"%&"&$"#6-&N&)#((,3,55-*,&8E.[m>p9&$/*&#'0*,.84*+)''%-%#*6(&#&'&%&!%$%&&#$#-' "'&,% "")+%,5*)7**+&(,(&-7041/4.,6/..*-.,*153=317067744/021-0512;1;=6346/8:9436B2>/02./20.16.1776780?/2;:69H=L8;66?643115440)"#)6KPq_MQSPJ\8;B:76/-*(#-0++04,&&,%*(+$#$# #),0$$'+0!$#'>$.3($&.+,*'+!$"%",,)&()%'%'3(&')*+*'&+ &1/6/',6(),**0+31209//*$"&#*%%+*')*/+''-/&(**)&'+'(*%($&-''&''+1,.-),'(,+-//4/0176=2-5E4/-((/3H6::U@0/2600414-/./3L43B@2568/+58:3DE@=<=;3:97646<9.,/&.8LC?JfKcE@/98=;2.*)(&()),/<7/)-'))'-'*)>$#% 9&&) !! .-! ?](.&&-0(/"''$ /)*!$'&$ "&)(&,+.'$$'%$#'''.*4F:1(3,+/.0*031B-$)$!!-((*+1/*,0E.,))238,'-.-.*%$&++*++)*-,-*++0++)*'0.)+,9633A8/01,/40*/2:SG=3-/1-6675?103313,/2;6843*3+4248=9F><96875888?@501-4=6D=I\[N@7B8GCB;43>+(+4,&-C1$A@,*)(-,&%#%&!#.4#&!$&"3 !!/92'')(51+!'"''!&2''%"%" '##&4)(&*%"(,)'$)*%"32:W>8D4%37//.-027.()+"'$)'&*+(+0+25-)-,1-/01,.)&6,-,(*-+.)(('+,,,&+&)(2+,003d=65@A4.0,4/))@:22<9B3+../39<7;343.-,-0??97:-'+(1488,-,(,/.)-+,(4CH/.#%"*'(""(,*(01#&,/ "!$"'($SR8%*<-)0/&")" !$#'#& "!'(&%&$,(&)''%2463Yt839+$-0+',,86A/*%&$($)).)*-.(-/7/10/4=;.2+,/4@5/21/06,*11,*,**.1/-)@*+=314@CM:6.402--+,9=:A4315E1/502G860<>/+/-.GX530-''/203:?F@7<93686==8:;=53:?FG>KICNC>DD_BO202,,2//*,6+#3.4-&#$$%#! #%ID0H:0'+.%#"!!" !*&JMA'+H,/T," !!!!&)"&#&,)+&$)&(**.*&/45^1 L5/3.C3#%,1-=-3),&)$)50)*(,/A330010-.323453>735G<4E>8;94002.*(*.)0.2:75:1-B[M80+-9..-*-3/:240.;46.39/@8<1164402.0:3113'*+),33?B=B792889C?>/1,>q*0% "&)## #"")%$2*$&*)'-&(*+-4.44Bw_]l?=<3613./2-3,&(.((100.+,+2/3E-//;;;5C0/1651?>B:?<=D27:963371=-+,+**//1666F1;B0./1(*(.*&*,9,0.CF375<0<5;F367@356408544+*/+--<88*%'(($&#"'-&#C#42(.#$% *% '%"+%%'%$*19*+%'+'##1.6?mI1`W00<2646<3.+))1;++3,212/-/+)*001@C<487426265<=4X84930252.+*2.-*(-.-,-,-/+*(364-SA7..()(*$,),7F=32A937EWP75C82><32\=32.+('01<7Y778::;;>8638::D886QB6=N2:@f&hVK3208;7/.0+$(SS>A%(&%&$"'#! 0*)%*"(&+..#! !$$*(0,=%#()$$#" %'"$&# "%&'((9Z.)&'''=+HW=:Q_WJ9201..=B@97,.0B2**-&*720106211332894:<:516976KI7.20+,0/-+--]1/.10**1D/+(*1$$1=@9,,88*,%.&+OE8>H*%301329FA:393/233A2-0-/%---4=9:E99:6::95,4::>9534/.0E88If&wwS<4023.1%,*&((#)&*%&(&&'$''#'&&"'$+"%+2*6).""",.$'.(!%"( ###'# %% $!#"('(&$)'/8,**&*+3L8<6jT=?43..0+/4?C[NE251.8++*%/303-/3.-5;869S;:67788:69>3-/0.,N-//-15/1514.001...(''&*4YQ32&')*#*&&(,3;4!!&+57?8:B7/)400.16*'+E+#%)>%*).1)$9830234;77=45:4<;421653.,,367876///2262350..-0.,)&%15@:/3180($&%*3$%94CI<@E=:94613856638>8?;8,%$3`~$jYBCC6-509.&#&&!'('+("%(#!%(%(!"%)*)+3I*'&!!'*&#!!$&(7'(&&%9$- #3(1&+*'#!&(%)(+,*'%4;*63CK/A/C;AHB<0.3401()),'5+*0034:;UA89669S86469:5;<=<>91*39833352510--320.11.-.2.)/0.6=462//)++6J2578@H97-2:41424>Y1*-K9I/ "-0+/B'.W<>:;8598<5/47:769C\AX/"#!%\tgNA8B3./-/'3&'&-$%+()"+&(((#"#"!%)1-3]=&#$$%##"4)""#!)')98I-'*'-!$# G$!%*1%#"1()7.&(("%*$'2CV:375UG?]75;3471220,216339=;K>WA11/-2-,..,+711%08=145710854+10O6,#!(,/.(+&)C@:99=777555878;>?B@;-'O1!9KSUSJGJ2<0*/32-)%*#*2$#)'0')*(&&" $%*$'&%*/%3-1-%'-!"!!$#%'-+%1OD%!((#!&!($+%%.1+%#!!!'+4.+'*$ %%)8HJL\98;;F>R94=A0-010:323<=>;;CACF=DBC96=:87<>BBPH?D<=C:259C9376130.0+).*+,.001154BCF4F/..4;*./--)/2*6?'+47-F/43-.042:6'$&+0-..*':;3683D747=4<:9=@?D92+'2PI3T6AVPH]=7/-.*=01-&)-)H((,*++&#(+,&)%$&&'&$$-Qx7+)$&"!&!)'&).)%)+;8 "%'#1 "&G?0..+7$'%!"")+./&"-'&(..-9C?:==E614:39E9,,292;90:???<@CDE:@M>C;;=@ALIGRL=9;@E7I?:A;401.+.**+//11.1/+20OOHA22:?;=1-*-/F-$%/-)-5E4+)*>-25022.=2..0+00&)16972628=587A9@<<@2%,1$56:XB?NfJM@7267*1/+K((0*)'('+)'''0('(23-%&&%$%D|+',&# % #0&11?0@*0((!!!"'"#''9F:13+(##(&%.(-,.+%**,-(-/0178HPQ9B<8524.2269;I36B:`d?),'4'&(401/-2:345655<*(=57537>380A:::926)*"&,=@RSRT=:0351&.0-2+*((+(/(*"''#%,*&*Nh)*)!'(,@)%## ! -.%#KE&%%)#%#"%%%!"$&=@:.0L&!%$%"&'$%5""0#(),.15163=;D:98<<9;C>AEBE@>HGNKPIMADI>aS@LHNSJMDOJMGPHOP@57;>=4<7957811111220),&)2=55.-3858.2111B\831.35/1,,4,/-01+/40504=RG8,)2/60479;423=>>88:761.)"',+9GLQLF9;123+,4/.'+%(($*+#&%#%&$%$.-/0,'((,*$%#! 3"&048&.*.*$!!#&#%"'(AJ,,*)%((+=)'($%#,!#(,588R9`ANA5?=7?88:9?C:8C=>CEJJCHUG?PJhaJHPIPJKNNJRM>CF@@IC@:E425)20A+7*:/0=5CJ6Qd85<6;DD.+37.47/363<74:@<79;:/+2'").+WI=KTD;38415-1&+4*&&%,(%%"#$#%&)>,|>#!&/5&%%# $! $+=&%#"#$.)%&&%&$$$##'?L+;*/,1'%.,'&%&#!'#-+3:67@CWNG=9@B:>Z@>J783??AACBHHHMAN -^B>@OJMHQNGJ_@@GB99M932;LIE?>;;:679B943?@:03.-7;99887593/37:966014:KBL==570*./"*,),9:36<FB>@=63<;>=dQiFO?EGGJFGIJUSNQQPPIMA;27E@J7?MORUDYF=F;<;6:=<@F864869999=<=89;:=?J<;67<>11-0,,(48/681/7BA=87658.,1/..7&%(3'''## " %$%1:R,'*!$##0"% )(!"&&!A-(#!,;*)$&%" '?%#!)2/*.X0+).&##'*&!2;Be34;>SJEJWCHEKKIDNRQROfVRFIJMD31?Pd>KJQE=<8FB@7=>;>>9=872658GC86>?;::9341")27./21@I6D9+(.41,;" !%$&(!#"&1#%#/40*3&*&#!#'  %#-#&$$7($).8$%$$%##!! #!$*.4,.0-.(*)(5(%,79D@=<8EL]YEG>38697<8>=?YLBACNny?=9?BEFLVmbLOaOJe__XZNKLHMRHDOWMZUQONZ`Q[VJZSKICA:BC@N?;B7;G?>>D?EFECA:D34SB15=D9/043333512430104208652K766<>;A:JM>4-08<;??70+0' ,//98796.*++7/<*'%''&!!%"&-"%'.)0''%%" #$$!!$## (--+'/&%&&(#%%(!#$6)##$%)&3.&,&(/26085:<:;>:9NMg@ALCDQLMZ_dVMJW_ZbW_\PNJPOYPoKQZ_\{}Rfc`WUU^QLSHAHA=@ELDE638AG9=@47:88:@=>=;46?*#%3.8KCBS=9;3++.+.)*-,#&$#(%%!!#&'$))))''"$"" !!! "'(%&(C.(!*($)'')*) ## ('"$$ (2,?5,+52:AEAGFEGKadB8>@A89B<:;;>;?1/!&0?6,1:58;3-.17345.5240-/*28P?5A>=-0368:;F>@Fq:5D5!)3;KFE=;4-$)*--/N--#%%&$%#&%*'"&A&,-)-!*(""#,#%!"(5#&/,,%&,$,$'0'%%#!"$!$%'&"&$(-87.3/2-59QL>9;<>Lsa=9630:9<20235384:7>202-?4FC4-(0++347;=;HCFTmLD\ACFMZHIJQJaD>|ywt ZT^dmc`P_gf(qTVVMIjrv`Jaiy{_WUV`][RMLLLWKKLXNJGCBCD89E4(#&078=5790?KA:62,88<;:67;23497:4479@68<:3-38%/2586?>\JJRCBKJKFGEMVk%ovhpIdunliONaOSUh[drd_U@D\djXXUokeuhg}a]UUT^QLLOQRPSQLFAC@:B<)" 25&"2*8?YF:8965.89::8*#*2FHAIVOjhqtccneb -r_`YUQZYTTHRZW][KQUa_g|xr^S_Zlpend`_ocNU`g_kWQPOKGDCDGCA,+/6:BAE=DHMA67'9S'4Q SA<>>85A<<<5-)$3G@D9?2,62,-358==G@B>:) (*A5;?AA=/6623-/1**'("''(&"&$$+"(&& &""$'*'&"$$*0&7&8O%"#')#%#''%.#)$'.2//(#'42KO3+000/2767:736697?8D]G9@7?>@B7FF>G=?7:(')09A>9;9357@;4/4*)(/)&"&$#$))%$'$-"!##!$! !#" %/#'D[%#'-6/;5;))/*&&(%&$1.+0.+'&+20,+4)1287>:5G634<;AMCB?=C:/481DT_=>@ELFDFFDIaYYXYYbea\PHTLQMLSQSG[]o\^li[W_icXS[c[V`f^mZ]pmSNGHRPSQPOISFOSOVL??9:=ALMLK[F:ACc9/7CEB?:301*HC)1DB:?A7157497B>=>AHC?9f$/-37EB9446@866@0/0/1'$)'"$'&'((')-(#3!"!#%*)!', $** (&8<=DxrU0,/)%>CF%,?.+0%+=&-5+211:9\J8482=??EFPA@LSdWSWU^a\WKO]WTSPMOTDV\VRW_q`J[\bk^]b_^S^\VXO\a[[QJONTPNTNQNTTTXKMFB?BEJM_NJMdB@?>::@D==5,6<7EC=(0K($3:JN?LH/.5769:>;>>B?79, /7@E98594:8;9I7,0%%'% "#(,*.&(.)$$$" " "#%8*&3'%%')""4M9/=oM-($ &12Z(.2-+519'6/.L,.1A:KQM8=EDGM?L6B@;742011*.&"@BFQQGPFpYHRHKPaZcbfSWOMW]_]UJMVLLLUXPP`[UN[df_ahf`RYW]``Pf]Y[WPSPNFM[HLO[OWU_QJQGIGPS^rJNRLK>>>?CB?A<63:9?LB?>,*-08r6=Py@34/4:7@@AA@B74# "#07<;3663<;379c=3(#$#%&$%)&$*6*+'%$%"$$ #&#%5! $$2')%#O;2H@-'*+)%%''?.1148+2163*+,>2P5148JQ??>?OOWJC?=874561A:.64:13FYL`kYROQROLOORXeVUVXZFP[m}HFDLLWILTRVV[ZZ^ei|me`_[`fY^b]\X[WPSOKKJIKLMHHM_WLMJGJKMIOYUIMKOM[N;@BDBAC686<;@?5B4/*/9Ln>AC@:4569:;9?E?D;69% 03639A89=K88:;6-)'(%"$1$%!+(1'&'"#'$%!!$) ! !&$&J-(!'G:0)2-%%$#(0@.0))0/11/072-/.9EC56NLIC=78LYTD@B:9805AQ8C6.48=417121:4B>@60;<8:<=A;<7C8- (.6:<8889A?<959491-'&%)$.(.(;'$!!%!" %$ #$&#$#" %&&$%)#..11-*++((/14+13,2.*)+)--8AI>:BA;:@798963:FEQIADGHAFTXPfTRHAHKD\Ta]PROPMHEIGFJJ1BECF\[VZUUSUVnYetuf_Z\]lZ]eckjZTNSVTRMDEB@ABEFGJHGOKNUOPPKGGNKI@H=>.+23(,-8,))()+057>B;;37;=677;;<7A@=73303484>EMKNEaHEFR@AGAAB;7?ROH^^XXXNRUV[_\`_^^ZY]Xa`hjexul^_]\USJLHDDFCHHPPPMHKPVOLSKTRNKH?LC??=<>5<<;:>DDA<:471-25A>:.(*5=J5D;8759:5630($$%)-(&)&&$,,"!"+" !%C% "''"$'+ "("#'$2(--.*)-*+$H.1).*+549578:G69E967IKVRNB?BBGUw`WXVDH?NRNYLD:3744+/79G223+.6?@:>641-106<>O:;8772433,+)")($#.,"%$#$'*(!$!#, "!%'-&$$ !")/';"!)(O'*+-*/();'*1+'+253?8?;OSUGI?JA<9@>@=>9=809512>EBXTAPL\J?@BF[pZRKY[PLWQR[RAIB2.03/7E=34;CM_]WVZ`[V[\QWW^jpmgjWWY\_daflpuhdfW\`[XQNFHJHILOKFJNQUUQQZMLIJCHFCBG@?57729;=:<@AIR0+,;63.-*)12H>?@??B<47%)!,68:4788:70,44($&,%)()$&%&$&-+$.3&#" "%#"',&$##&&0&&&')*)G+,.?-0%$)+((/0/895BMToxfG:>?BK>@C;=7<<8/116=DATMQRFTcQJGJJKYQKAL\dZWm^OBGG;0*,+27759BCHIST[VZ`c\UYVR[_blfeac`VSRU\g`]ogjadijihf^SSOTQLJNRJKNNOTVROOMOMJNKJGJGD99;9@C>BABD?C>/*160.,#!15?C@@CC?;6.&!#1,-:96AO:;36108&&$+()$!$($!%$&$ $&#!!#*.-*/A!#&"1'?4#'*+-*1+2+8.)"$'(**/7H866;;koM_GAGLUbmr~LFFRC5/,4649:CNJMKYPPTefdo]\eg`hqoogicc`[TVbnrpejlcdjlowwk`[aYVPQORQLMOMUXRQRQKKMLOKJRQG8-9IIGGCG?DG?>8-.55)' ('5;<;;AFG3203-1=/+0776E=;42.+)))$&)&+" $! "# &#$"&!'%%&,))%"*#!&0&#*++)$+2G'%+$%#!,/+HFA=72?L>;ABGTWLSV[[QTdrdrZdw]afojead__XXXh9 qkceeaelmihlilqa[NUQWQNQROKRVZiQMLRNVNLF<0/:JDHF?FIA@B>=9282("'08;<=DQA>;6>E21;5$F55:765:1*')*(.(.&$! &"!#'(>3""&)##"$-2-&(&I#'*#.(()8)+,.*%#  ,3../449:?EBJJLf]KQ>=+37ccWOLJB=?B@9CFENSPNVPQSTRPXX{~uh^b]]agge[VY\_nq}Bnef`^_ejpkqhgkptdXRQWTMNYTQUZ`WbNOHQVROHG7-6ADD>?AHFB@7799:<-!).9>>>=?@997?@DCEKKQSPRR]UNRU]`cr lc_Z^_]XQNVSWlrmhxto}onddgnpyxwngfsoTRPPPNYONSZabZf\RQR\V^LB69?@D>GCGJED<;??AF4:%)-=M=BN}cNHM=BAQ=<47:63>86=I=DA@C@@SLB;AA^ZCKENBHH@>GIGFSJKD@>BCSMENM]VOTaafl\bgbtxfXm{ocKDIGJS\fah\UV\ojxzrjVfq|xsagtve_YfQKM^MQMTY_`xsh]_YMF>M=8?8&+8G=??;>@5-,7>;78>?J=A;BB9:8-3.65'"%'+)+*$)/,,'+)%&+)+%,)(&+($01*+-,)-)0(.--&'++-2)2A993KFNlXBPHKPGCOEAOBN967>54>?<36HUIED@NEY8<@F_\UG\aWQEJ^SDCDCF<97FJSJEDLPVWPWc\]`f__jhmu| w]@;CVdehqxta[`\fkspoejmqnrfl~~hd_aYSFd`dPRPY^usztY]XLGEE:>LBJIMJFFGBC7:B00(4>728:?<>=50+9A9CKNINN=;IL:?CB:83/)&())%'%$'.-&)(+F>D**)(,'%(&9J(+&(',31&,'''#'&+//6P7?=`IVaHKD?BHC;8>@KFG97K@4>:86:=?CCAFIHTACFTYgPULI^TCGGOS=857:D;GMLBIOJTVRNLptgWhTOTSSXajb^ZLNYde~z- p`Y^ejuxqwuzypx -v{kc\WUTkz|TLQVQarx\b`VLGAE@9AWHDGFHFEB63719;sN86?=B=<@B-&(-@GB4RMJA=5269?B=<6F?4/<2)'$#+%&-.1/./P5)&.+,+*#%),*$(''3:2*$"!'$'(,@/1976CFT pTIN@EA:6478PID>GAMKF<<@:=@BDNFKSRKPsX^XcTVGNVa\cb]\^icpm|(utcspfl|}wqlp~ys{wqgcXc_cZe`WUW[__failgXPLGAH16aNHHOLNWF6/A8TI]:><;@BL>>,*'#CRRN7JZOJ?95995:()($,-,((,(*//5@cA/+&#)M6)(0%5))(',=R2)%%)%'%'2,48@f;afOcU_G@A?:86152VFEVolcJDEPE;BBAGBXGB7,+06<:9L9=;;62/+JlTCHGQSE>>5<4=IQ>42//.-+2,+,-&$%,4//10;3()')0SM2&0&)(('+.;0,&&',$"$+45=:AH^fp -#H|VK?8?>>@20=:eYnvw{iNRPW^WUSTO`^IDPZYKOD@E@;B@7*)-48=9ABFFFO]VRSQNWVT^SZ\^Z\Xa[Y]kwrqgrupr  ~) evwvsob`lhmhbhbhcafWW^frhdn}paXNG=,6JDGMHLCA<=Cgj=8@A?A654:88FBCZNKIAOQL=>=9+$e\KEGG:;/380&3692AHILPJE9B?C>=B@?BBF1.311>>42-),-.0(,2/I:6-.53M>39B/*(&#+*---,*/,)#(6(.,4HJHzvsw`x5? -lKEC><>I90>?Ev $&osscrgmwbXR[KAMMHFC<868').@GGFJTR`^ZRYfPT_}eskfmllqhnecfjpqifq{y{vp}/.7   z~ x]^]dqohlv|hmoa`enmphjkbdG70:CBHOLC7+->EaC247.+248=<>@BMFLF>1!,58AAI>C?60.AK-2/0/-+,.,,,321+08/380FP0&[1-+#+"(5E--)1*+"%-/*/3FDHdgtu SRED:=P<;8AFBRFGOI@?>.>AeH?8,43:688D>=GPGU) $&$"'~n\\XMGIHIDGDGPa}.K6>EBF?=.52Fu=78<4/54<@FWLLHFQ<FPVa|+119FC641qfgdYQIDHGEAHDBjX-449;B<6CVQTYR]\dPk|sx~we<"$!/   -||~{qs nox}~xyovkcikuuxy -vrl ldke]dk\IF?<<@JG=C0)+)+?5.)3,((-&2GCD6/(11587+1T322-2726//..+=-37HI@@HsZOJFODKRUODJB====@LZp|FT\dbST(vjUZPJEDI<;CIDuN;@BDHYePLJJVYGM=>FA@=74?24677:,*,(F9.2**++.5CCAC1$!.D;40,-06341.466/./-,/1?>HROL` -YQGHIFVP_WOD>K@99=DLZn{'PklliqU2 -zeTPOKGG@59;GI;E^GIGLLTMQ`YWZTV[^gex}{upxrq} m#-,#A8!|uxerxphiqzxn tkq Wxyvnhuovxycghna]cZ]VXUFDFEILLF<@0#/@C9:.**%+06AJLXRII]hbZ=E==E@62:@<9754=-2/09731*+.-97QNUw:$#'X4,11//295.-462*,-0=.,26GKIKGHGTJATa]Z]C<=W85:7*--,-6462@I8;12/5L4;-98:;15*.6>HV`t 7bq~uk]># xeWRVLD3441+!H=JN[UWhkmgn]da_gd]Ybtft|!~  un}moohfkn_OLMOQIggi pitlWjelhpzsbnzrwvvyhlZXW\np`VPKEIGGFH@SALPQSK>?/4224;6>FFIPVUG?AZ330048?@CIXl1^s{|seW4 u^[NI=77750=wQVVfmvkrsfljg`kpknizqqx-" - -|tsvc[arlm\MORY^c_Z\\rx}zf_n{khXTpln}zgf{x{~ tUWcbki[WRNQLCJLOIPKHFFHCA==6815A5>lKSRTa^UGQpA@4011A)(4;9S;90/2A1E.C)/-4-?1))"%&+.,/(/2+0003;=`8E>EAFL>C>=9?860/1/46<;BAKW]fq]ilrpaK& jdfUK<6?@>60=DHRW[e|wkmrg_mpcw~{tt 0,. -~jon]QIM_gga]TSaefegc^^qtwy\acotcadVsqq qK}~| {t}xtlZahjbWLLQTCHLOFXSFECSOIL@056843E156J9:+)-;7;C:1@&%(',.*,)17/+.+35;A48>@1.1E7689=FQOOYi1@R_txaE) z^[ZLC>>PSB?EJBHQ\`gtwjc` vvpwwqz$  52$~nu} y]XSMZdejedc[W]iijuonjnlnbilbf_avjet~|~qWl}{ wtfbg5,nfnYJRbQ:OKAGJLHJHShGHA,9<6AC]=40-6.+52/4P5213*'1>9@B59?='+)(+,)(9...0.;:@A596FHEACME9<>N,**5<33167DBHMOy|6NjlFBf]^KF?@IKFOIMMRUUVeskol^\u ~}olqndv  ~kRPYafZgcckloruhjdklx{oqqytllukttvnfjssfTjpw|kk^QXkwv#;7$x^cgi>dnhYLRNB>FNN^OJNQWNKMJL7<>46>EFKR__pngdG(#(/5--7AEP@AC@C&'#(.&(,*/117,4<@=E9611414G*)*)763,3:HDFPhZc{#EHL>&^^YTYLH@AKEIELPKWo}vntu{{{ pnixztlbi`Yfbgigklomnqqwwoq}zssmjdw|sskoUqyqfqSLYSn|:\qcin|zlejjaTGS^sDITY\LKTVRT_J`75558>DAVShpimojOK3'(596-,;K@:8569-.$0+**./+.*190)/U=@:8421K()(!#&(').15402<>865A>>6436,++040+,+:C2207FDO -P?Np!#%jmYEFEABIJNK[V`a_n 2yyq~} -ztx} }rlgimjy{rprw{ sefiqxtrruvw{z|qneruzyvw`|owxjSKR,4pcncededwcgjR=O=PORSJKPMIIIFH=//HK>?GONim]Wrn4./31-.7:9:<.122,(,+*02'')1Hf541NFV9=0-@c*$%$'-()-242.06B;9764DF5047/,40/0-//0,3+.<>XOL8Nkj}{h\jl hVMC<>MKRijkmnZmput{ u |nfbab~ -v gb|il~zw~|qkjelqqlppoclvtxx{zzyzw{uvZiy}tGAcj|vkhphaU[flh^RH1DOZaEAMMRXSMD922.>OA@oj7>}WA3,,2>)&(*0**--620,+-05;6:3=6843<23@\/+,1/\2../8OlB?>8GHR^YPKDYTzdMH?9G:2./24/3,.,).,4///EY;96@;ACEMLHIJCPLkS:;9YRMQjk\YWc`qtvx|xijphijcl{ zzkaivmbfqx|}{{qmnlnljfa]^bfpsooowx|wxz|wlhn[PWhmn}~mYDg}wmNYk`U`ahxhOQ86ZidibOOHglUQA>>/;A@EE;OUOSc_]PWa7;>-.5*-)2AH;=474/+-+(',-.;O`Mn>Cw&^9)++07$%'21,+,+.5./61.248=596>3532,**+/3/1,)0+@N164@B;;BAHIFS\VaSOmJHMdW\gqpdl\giv|zzurnhhbkooo{ -}zyzbrhkskcstrv{soqpmiifjf`\gglkfmx{tosuxyz{|}vfYW\`n|ypq_?\zsRFXaegcwdTVPCCP^iniTKRITOMF;89B]4Ao:9ABDDMJKOZag[^ZkmeYUdnx|thlwyuqyeZMKO^beu{swzyrpuvu -pX~soyw{qiomeW]wdjii_jtrvvt{~zyy|ww|{xe^YYa^vytm`[ey4~{ \rhcehebd]QRJM^bdbW\RUULKJ49AIb\2>>II`zn\dp\S;7621:558/4@6432/*.$$",D/+3?^o H2:EO:9;762$$**,)-/.0@NB@?67761?<8462+),+&*,*,-(*@:10+:6/62;NTSQSbzu_TX^_w^dcrlot}pms{q|ZUHOQd^o~}qyxlgcfpwoTfqwexiqibfa_ZYZY\frvpuy}}}|}xz~{wokcVckhttqgdqx iajuve`aoZQ[PPZ^gU\`aURBLGAB>TyeBT8@JXig^XW<=(>F<10..1*.0413?)+'&%&;:1<:I[iK9+/U?<.68-+*),*-).,$4169I?Z<77681F3056-.,)),&)/)E<.*,2---)2@RYRQME`fYhf^adad~(' qstjnkzys_Xctvyzzvvpgal%lcnz{ahwLLP]]qmfqjkljpnl| - }{{xt~|{rrwrmcYkeenkpotu fUParsaR`bQVPZU^\_LVT`^A7XWGHo~_4>4?RCKNn\[P0,NJIC840,+3*,4,0,*(*1+2.),>@IZ>)$.218?)--)+2*)((),+)717N^KD?GGGVynLO496:44R`hL&8d`F@76./(//0:6-.)+),000*5=G]E3%&'-+/7('2)**'&*'%)DK>O^~H?7EF401160,--((&'(+*8.+-)3&&)-.3FIFUU^\}c_ZWYgmn -,ujg[etsh^d. {s qYhxvvvy}zq}gmY]r{nwiehomqgdeZR\`inpmml{|   -~}zmngmunehcT]lpwtw}ikROPY_fLMOS_aYUXktssvHNNHO=7QWRa0) *7=Je]/->HAO=87+)+142.2-.&%,1=,0.FJOH;LK8./+(+&&'%*+-3&3*,]\B_kMBCED?A8//37/1-1++(&(00)&#.,(0-/1+07@EQQR`P2a]hSP[iryi^ccinioxjj %N%tu{QSQsvz~'}koqvjx{jbhjlkoogpl[Zflntywy}  }}}skaemioh]WUdk|ewyytxvuZURhXTUX[dhvc]QegssyTaPR?D@:NCKSB8A10-(''%&#)0),&&2+-05KOGN_JG\DG1044/1+.*.,+(+1-+-*8-+(,1,';3?IRPZpNKQMTVgo}diuzxtl_`z~6zxpu|mjUOn gvUjimyz|ysfhlfhjospcbgdgnqv{  -}yulhhjvl_`WQfufw|z|~w`UNNaTdqgaehjUgizrofePRA=\::;33+-0,.+-$#!&()'(=?5100-+.5@I?=JFCZA1S/>3..)&0*,+(,*#''!%$/D:?MC5BOSU^Ldcsyni]Z^hdf^QgjdRXvxu{otu|oh_ZjeW\hjxeZNRajaY`dihltyxvz||~ - {wo}{qt~`XUL`mmossoc]YMD_`ngzgg_\UU``ab\ao`UKMQOF31/2,,.3B:@HCDG@4""41319/,152/28@=4-)1CJFB6;M4,,,"(%)"%&&)(=3/5-31:22/<6<=@YPFL=SEC:>M:U@B9<8<(1/%$%*$G*''"(A6/-.766035AK=?PkL=C@N>F9--""&%&:,#!)$&6-/8?AABAAb_cn`Logtp~n``_[WTVXTcdomryvqood`ad\TISLhS`qddcaXZSPbkbhhcROgipsr{   }wtprnnxe`fkupl`hvj`[JZKK]Tqjw|UW\[`cr~nRSLBEJKC21067BB=FLQPL5&2;8:>:@403A49@CK=b>QEU?iT5819*/7))&%)%,'&9&2J1-+57466E:LKFUjMAKG_B1*-/"#*(%+'%'"''86;6LGDDDP\bhf\BWHToljbbacVSYUOaicl4#kjholli`j^UQPE\bgsfjg\NNC]emhgdT\eoso|  - #"""!"" -}zwwuoqmd_\aYagaXfgedL\IETRmnhn\[bT]pt{gQNRCDF>61+/:CJQ>1((#&+%),'(.5E.2;11;8B:DF_FEF?FFB35+,&"%'')(&()(&10:?C>GADILOh^X>:D^_jvg_XQYJNYMUXbiYtdcgfjhgf^]VCOTajhoy|pi`sa_WgjsqkTXZ_equ~ !$'(('%%&$%$"  -}yxwuqnnf`Z`hqi`H^bd]dbgiebzuv{k\RV[jzp`UH@C=@08-/*E<>EDF?LXGI7.<<1><@-*)68NqSoLIIC=9XDX>6.-1..2,'&&,07&-#-<+=;6,0@>45=GDSNE@WYA45.+,/+*$(+)>2/.,?>ADEEFKJHJJND?D9?iuokk_kSHSaVV^fRX\iiefonezd`WIFPVgkdlqv uf`klcnslgXJN\bdnu~ - %),,-,+***)('$$! wwvqnnomg\YmqgWThS`bijptrvsll~uZkagqjpm]nO:=2,#%2,*328>=@EH?EL6(56=SC<4)2>@zQDBGDH7@=EE=42-)?**)&()*')($)-**(:34206?88ABLDNK]QA3B.1+*+/45+-9727:RKJIMNPOKXRF;>@9FFpqwy^^YLRbZY\]YXdcdukaf^rrfIFIOQW]tiyxswlg_`lol]hZNO[kpuy !%(...00021/,*)''$! wuppqlote\[aaWe`_gcsh}|snboghfcdnpeiWF]0)"",/.4F78>A;:9=C6(9IHC=6/;>WVFRRJFHH>CVAGEJNPVLKeSXKG8g~Wfxqkjbft`_`njab_flc`^Xa[pi`TMPG_\ZaohmwhZf[\_akl\_KINduu}~ - &+,0245545530-+)(%# ~wrnouq|e``]okfoiicfz oj`lslfinxgdRG<3:)"#*,9>A:4:;::68/&;.((*&%$%&$#&+*%%)18A12CPX=D:DHPFDAPDGEKILPTTVRBEgnnz|kuc\^]__`n\ ipjl][\_cd]^TOL_Z[X`Zcqrsre\TY_`a]caTILRjuv %).0156888::730,*)%#}{xqovo eYepj_fnmdbev{ nnj^hubgpl{joKC<>=4*+1.;:;45:<8:<0 )+6@?C96>QN5;G4.)),,0#%'+%$ --)&"$4-7L;?BK\QGOBSJM?F6>8-/**125[aI?HDEFLlPAJEERVMT[efj{}^esY[hii\omefhjobgtbh_^OFY]]XPdototysd`V\^hhekaVSfksw~ !),12479==>?=:74/,+'$ {{spqoqpeZsplbkhbXbj~s3 z[[a_l|ts_TFE:=50*)/3544989?;CA7'98GHE:24@;GD:38B;;87:cN@9;/1'%+,+,*('" )P4*'$+(-:4KQH>YjhjE?E:@834=L2.))0/FbN??ABGLMRMB@IT_^YS[iiq okb`qrWX\P^Ups|gfaflecgsffbaR^V]R`wysuidYXUcgmllwiutw| -"(+0357:>@BCDA<9850+(%!~}uwonmnpc[{rmjf_Z\__mz {_\\bimvqh^TG>79<44(0516D<>=>BBSA4;@PbI@.142/.+/278=B89MC>?<*,(&$()+(/&&'$$'#1#%-3807SvNUjPP]PH;?49571:-(&-9YA>@DHE?QRQONXS^blY?avkqnr]hdf^cXMWbUbudcubjkeqnfa\i_YY]UM[p{w7p`ebfogiouow{v|yw|~#*.167;?ADIHGEA>;81.*("~yvu{uojhdfkjj|gh_NTYl} - rYZ\]pi|~laZP:64G73()/641<9O@ADE;79ABX\P@/6986&!)1=H85252/(.-($#"&'!! "-/0528BIGCOemKIPe@608.,&"*&+/+*'8O;L?EIMPM___in{}upSXKMHPRRVTTW]ugd`fcb^f q sePT]Y`\prseRWCM`eotrzpejw~{|~ "(-26CKGHJWbrcgI  wtyqlR]KIHURWe]aY`Zao^g`Xc -}pf]SUU\g{pgfZJPXdkmmqslkZbyz{}|").4;?FNSTWWWUSOID@;51.*# }ywurlxkcca^bf[`ZrgP_oq}jZY`Y^sida]XGGIA>=?50,*984966AHE5"AHPgGA8;;3..40=@@ETIQQd~Q;2B2%$--*(%0)*%&$)4220>DY\yb^RRGJD@23.-+&#$)*32-385WHFHYNN_o\h_uh/ix{tgZ\XJETQXVubc\\dcfcVak~nimfbR[`nrhogwfU\_kliimljggdsvz "(/5;AIQV\___[VQKF@:510)" -|yqmosebeglncW]UkdN\z`adspZ[_hua_WSJJVZDCA7<38A0.8(49=?@-'AFRKF;;<;26559>;BCL8OIMIv@04-'%&-@.%%&'6)-1,6@QfqPSQ@>CRI4-.5+%!+*5/-,,BHzKFLSSOW_R]XktyqiM^p|{i]X[YQQT]ighgyVqeyh\ae tcfdS`gbdumaVnXbuiZflpmknimoty -!%)049AKT\elkibZRMH@9630)# {xuopqedbipjeVVZr]ZcuwuigfwXZbr{c_SVISfLNHB;?A=<,$# ,9<<71-9@ACBML;7648A?FQTNCE9T;cbA7(1,-"&/'#"%) #9K.@47@Ktx{ZKOduf_\YYz_\Vafyipjceacpe^^~ ' {JRe]k`^`ow_]f\_dchTO]cfkgcnrx} -#(+159ALU^jvyrh]TNHA;63.(# xtpomnhbejkgbV[bi\^epwstvm]W^r{f_VMZ|vYOR@35J11,"#,7;=4?-7@GNGVBT>127A`TNi]F87;<>6=0*06+E0*&!"*6#&".>/@?7RRgYUS9@WHD9=-)>++"-+0)73D5>;@?G`y]nH<>E@=B:/2803,&%,216V<9<;PeJO@ACjbWPFEMM`[Uaigdf]cpbZR]`fkmdbwixgtw |v`MLKaV_WgsenWY`pafYnvRcqaappx -"!&,/27>FMRZaotndYQKF?:52,$ zuqnmkb_begda^W[jf`]fnsi|+|`oic}yv]^NKMLN?A:45/*#3-,(-22/%'?LVL=C>B;43?ZRLKQM?WC6H;1(,:,-A*&(%#!%!!&(0neW_cU[><;:9F7=42^C()*+>4?@C?A;\OQ@AIHR\]boSF>HRfecveibljcNS_NRa_\_cjnq{tzj^SCMZ[[acl_vaDR_`\^}natjmS]jsw{ $'*.49?GLOUZbgcZTPJD>92-&# -{yrtrkdgfhlbb[][]hi^gxcy}nvjenxgZTLKBD61259-%"%(80)/2(#7;IcoE=>C=<66BNFMNRTQcPMKP-*%',%( "%$"$# 8/{QPhWB>624919446A)4*/4=SI;DQGT_a\aiosqJATeThmjoj`Zqrzyy&(+159?EHMQTY]\SPLHC=72-%! zuuwshdjimqbWLYgeb`dno|zxAytcfZhbZQLTLHF;8654)&$&#-+,=BP4>FJWUH>FA6M;B;1-9,3+(+24=L;CgSVDLJ`aga_n:?xZ^_aqdLNZoznuSFPKNcbQ`kz rnymglQEWbeeilku^HQ_h_kopqegfghmtxx{ #%+059:50)$  -yuvvjijjijlaVJV[XT`|t{rwejsjusm\c_TRORC@AB9J-4$+*!*5DHB4BBHRXSM?:96A;H78:054L/45046,>YH>7D6M>CK=;Wa`hl{1&5wck\fflt{cc`TgOPPPWa`S[Rdpu=vbc^WQmolouwjU_\Rdtmo`fbhdqy{} !&,048:46CLU\XD<5;G=6839kdurehsd+  !$(+$" $?J,7/24<677M3950553@/06*=E7/cH%L=BEVNJOIghfhw~ehZ[W`nxmommEFDLJJJJTX^qUVP`zkmciiYTWaemxoo]`aYC_lqpp|qagnrejvx~ %+.1479?ADGIKH@AA=951,)# -~wvnonkhkpnghcXOLSdxypvhVMNWgkggf\]P[IH82.,,%' $',%#3AJC@K9>TWbfJ<4:64248:aXh`eao`8.#%"&+$!$%"6A.3./37:619045828556->./:@6@C;7=CQTKRNRRdyg]h{pk`V^[_cg}ubRDUL=9BHQ[RSTL_dgxpedAHQ[Pcusa[idObgrppfVakoo}yry|$),/269:=>BEE?<;:951.*&  }vuijmgglto`e}VW{maQNR[mpx]UXYE;JJB33+&*$*-1"/?@AFH5088120)-4:1/.492+1,18:247NKJZCDaiYV]b`jmca^]a^z[cutw IPdnBBEXRT_Yh^f]\5^WCEUcRfaejsIxl]llqlypdhmqpv{{").-1478::<@?;78642-)(# -wsghgijnviRZflVa -yeseVcZn{vc\bTB?SP?7)L+'-0#")2DGGNMBLAGQPIB=:5276G<5+-1126-//+),'.4+-0/<7;/5:[I@SM`SVYVSdjgsvn_\xfeqsolllFRQOPGHU_V[ag r\UCRNXNPZVVTQ`g``qgflqkmsweilhpzww !(--014678669:4230,(%$  ~}wqmoljkreRNX^_`oyuqdTUT[g_`qujnaRPHBF=90,.4-+")C50AOQKMYOGESRIM332/6;=LA?AR[UBX>2#')-'*) +"'&"4#%"?MFH14,-24=:3/1-13/-(2-8106J<@>K[DFOZMIVWgqj_igk_[okgshhkALQ;IMVMOOOYUa^^pw`NHN[ORnTM^\dWZ\dWVkxorujknowvz{swy %*,//148640251,.-*&#! -ytljrsrl|UPOWX_k{|vulYaTgbaqjrneZlITe^B?2>J1+('.5>98DSSY_PKPG@=97,0@>BE:C@:647832;/.1,-+)$+.15;+)8F6;BGINKSUMJV[g]Ybadb\mqo|ns`)*79HMUPW]JRf^cf]jYOBNTYPlO\pleY\g[Diu|rqqmnosxxsuy|z~"'*+,.16340./,(*+(%  |xqmlnrknlUBMGZcl -~tpastU^ecepsk_VNIHJM?++00//)63COHQVSP]gd[QI7JN7//48?BP7/&'D:A,+,'$#" #'" !! &$"FXgiv}|sx_Wdkdhjbesma]SH@NA8:/,*$&*2:?DGKMQZ^RecTD0.-9>@8:;9<86=G-$--/.+0(#%&$("#!")  VM68H6106G@:9/2/72*38601o - A96::GIPLXY[\j^gg`jkW__`rkoH@&4KzePUa]WZXYYNZa[[hRQM[egr -nrj[b{qwkszxzpwlz|qqrpw| $'()--.,*)(&#"  -~zrlurl`^LBKM?Xffioj`lhidafu{dw{o`WYEFPJ=@2,+)..496FOQT\b]WRKQA585:AB==99146?:;./*&*,*+$ 0*"!#" "  !$#nXG@L>2-,?561A-++10)-;5+8GT=;59:=EFEKbb_Y\\gi`_\chXidqwoPU<6IVSMN\[XWaX\[oY[QWTMGLeebotphxLedqru|zyyjis|||~{xrooz}  %&'')))((&$"  -{srorpe^[ROIDBY`a[RU~zprkbjymerpme^WPSPkOA;831247<8MNRXUY`JBAEFA?9ABH=D:376BG576*&&(')$!!")&%  #%!BL?:6---*A69252(2-'(,0;/-6><425=;BBEM]V\`amllTTMQ[[hljkbOC86GVCLZW]kXRVORNMQS>IQJPab`jiVNh`t~xvuikrxx{ylkmgly} #$&%&&%%$" ~|wrqlohedZYRCAMVX^U\|~}klqq{tqfcc[ny]TDB76-2)<<5GLY^VPRLENF?9@BD::638//'#%%*%%$'!$'%,7!! ;$) ;8:114,-&'/5..HC=.'!$B+(.71=8728CE?ED]Vu{lY=?NMQd]QXgdjaaYTe$ZO`[WYacWdMNG_VWRPQEAT[cuwph{|zmus`b`lqyyv[Ugfn{|  !!  ~|{{tkqvn_ZZV_ej`VTXWcet%#}wnkiiq -~q_cpbZGNaBI=7;AGIFOMTQUVNLI?/2BYBDHOLFRPJG;4:4,)(''&$%#*+ "$##'" *&'%.15504.270,#+13/394.'<+#'*&8545@5Q>=GOZhh| bM>FWX`]Obf`]`[]_eZNOZUw^gadS>BWEYXQLESeaht,|q\qcrj`Z`esy{upTakuv{  -~z|xsrqqj[WX^aaefealju_ezqw|gfekrzrlefZITelJ>=?GBNX[MFSOUYPC;/;=E@:CIMLCEI>A;=H@DDNMJKNKKBBGFC/:)$$%!!%!! !#$ !#%KA3'/88846.3/0/128@ELMNZ`cZb\GRYDJKE\^qjo#@QDGC|ppqqibVVbqvkyTWki}}   zxxuvwyzxphgaVbf\\fluzsmov{yscffeamvlqkni~li`fBQE/;85;@nLIdVTSYUICJHKJ?:NNJQ`>DCB?L;i?@:6,%)%")#-**' "%! ##&';*)(@7:<<2<22At@-A>,).A(,"/1,>884A\Jh\dl~rsx`f{|{zd\XTqghREGQG.?>68::BD?DQRQRMOURRSRVUIXX hbzl]JNB>>3=1( "((*-$%$$2%")),2-/G;<1-69EN70%=2+**.,*8&/)(63+-++6;59:A<93HBKdq \+iFKUutl`YXXZTSKJIF64,41=DZHMX]RL:9@>>[aOG\ahm &/71,{aUehig`KVfjnq{zxikvz}prx  ~{|}{vonig^`[VYjmfin~y|zrmg]e_Zagirkoe[|\V929:F=>KBGGFQQKWOffURku_Z[[ SyoNF9A=<61/))+$&+/-& +*''.'e,3J1:6O>>W[P9+(0--(")-E(()-2//)*22:2933.:<>QIAOdaT?aA@_op_Q`VGRRK@EBB3206bKFBI<>P80.-/'(&)0FI()$*(-6*.)1-+-5]4XZDMCCFHMTUH7DTC?H?:C==5662-.)()+)X<21/8)))(($%,*)/;9=<:2,(*&5+(&#$'<),31)(,/?8:01.;=GADGS[HIWKJNL_dgaSMEHUEO[DC<>0697<;:BHKJMOJ96IK.8[RHceOYaqiUbekeEZnXJbbW]^quzw}ynrw}pnwwx~ |xz}yrqaZWWdaknijtv{qnulmntvib`oZipbcpmdgotS[HC:@922;7=DaIRFRCIHOHPV\ZcY_c]`gkWGL^C984503>54+! #(-+)Q61)/'&*'*#+#'1)5J32...*&(,)0""!'&3&' C.>+))5/31GBCPQL~_BX?BK_svjaUTfJMPZbA=WaA/3442+-K00.=2:]VEHD=68E`ejdhXRRHLNUJBGH946178<:=@FFHLKA5$.3J?NMACa|xfVHQWkL`R?DZkcPju{ vmqx|f^^gqv}{}qoqpqtnrmms|qfggkkmlujxkf'xg^`TZba}|othnTWGB<=636UHCAFFPRPLKC??OJOQWk[Z`]]_iUc??50://5.24,-'%!$#(%"#'//)/*//#5"#%.%&#)(.21($&#&!%-+-%)$ $"!''&60(.2285F@E<1,DZcpgmzpY[UMEGECD;:168C48B:H?KFECHD4$"(7>QVO9Em|rhwmYhaYP;EK/9]c\O\t}qsx~{wlY]crvntwuyyqqifZXkmij{sxodmprrsyrmovxrle[`cd^gemzuvu_[S]917@@:>eW\IKKDGNG>EDHJMOU\c[]a]ZXUGH@:2/3505-0--+) 5#!$$#''%4*(+:#*2(((((%+).(-0&&*%(3,<9'"# %#!"*/<%3.'%&**29>8523FPudsecSQRLFAAC=?2-186309432000546))& &*+')0+.42$$+&(6))&(%':;$-/)0/-1/.+&$#"!$(0*1,')) %&-472MIKON@@CEGJFLMORUW\``aWVRKF>:>:76780-&1);MPPd|cIHT[ihmnjrfRhdZY\bP]x |v{qjvs~tvvxrulndW`bedihjmsnnz{rr}~~fagchcngqxmmmnitmbQFIIUE>:EHDHXKKHJHGYC2BJVUTRYcb`\b{kC<98<<2436<.+4/.)'%$''! #"$$%)>+88,D)1(%*'(;4+ )7.1,*%("8&%$&#!!($"+..,&,6/2212A8A]VOSWeirnhjfSJ\CFA=;:2668:?GHEP@?=;@C<+)&4$8WQXat_KT_hvmognig ce`cVZfyyvz|r{sixyv|xyysnpqsb]kffmlurs'xos}rmnc__^a]p} uzmloflqgVYMIeN@?NEF>SNKFEHLRH@AHPUT\Ya_c\S_UA976846330<5<-*,+)%!"!$!$&).+)'(-.947U0.,&%35&(**&O-+'"?s.x)%'! %/,) %-;//.1668=GZGR^ct{ugb\P??9?BEA658?9::@KBBA@CI>7300.3=MSQZYd]hutkt{lnjly-5xaedbmbmztrsrx}gwmksuqs}wvw{lrp{uv~orqwfknrkj pjiaXabmq{rfanqneTRQNNMTC?CHOLNJIHEJdKnPPRNVjeiW]fTN?=E?=L.24066Dy<(.-)))"'&(*-$-&4+16^D8)3:4-# C#)'#1%(&(?UG+&$!"'3&&&$3)*.-+367@9;DTOTcmd\][PMAPOG:D7497776>C==?64:841,-3AuPOURe\m }itvjeYa|5oWicfihxutmekgjkwtfwwyy}trpjzzwvshlflsq{wwtx|se_bd`nnss|i^^laTVO]RJFRBEFIOJLGKEGDSHFCHNMSX\XSTUOI;88=:F78736ATpu.,**)($*,#%)(%0%7412=I-)):L'#""#%$('("&19"#!)# #"$"&'',5+5<3/1=JATJSr~~ldcY`X<>M9EC=>78<988BL;:<@9:33003539;CUYaoxpkp qh]gg q]d^oso{k vqrzyjuvzfv} - ytolkmjhefhdpjlo}}ox|tli_okrlulhzoba\`TMSSLWpH?FISSXTJCA?7DQYZZb^YXVO@;7:328:9:A@?SO>>:-,7()'$%'#$)&2A49/3=?'--($#& &$(),%%!$'!#! "!)#+""(U( "#'1-/0],2BUEOS^_}6haJM3DYG;AU9;6575>K;5<6B:9<9921.2--D^Rav |ilongkjgW_^Wa\`cu~z -~t -{xtxrw|{ )fjelqxoryrspxr{~wluurokkcfklnpxnb]\[Z^TUVPLLI@=GNL[pI><=@;=8:ADD4;7?80*/-,CKG[|ylwqsRssqhxaLPaeT_o}-ryw -zwt|~(}p{jn~xw}xuuywqotxnmngekmnmsqj]W]b^Y`cURWFADDHGM_dSE9;BNKU]WYdgh][YV[VKN8258?KGGGCJQvbI5-.E)%")(#!%$&+057?;24(1$*$%#0*(%.*3'%$%## )")%$,0"2+'.#'C)4=>:@58@<7S@CGFZ)"{eI3.8kWIGYFB;:?B@>;OPL<88=57?<5608FEMJnhos~+TXjlktzw{~qst{q{  ~ ~x}  |p{}v{rx{yuklvssrcc`iufSKMUQLCDGLEIGiA@JMeNPNZYRV^_bZ\NA>:58@IP=Z;5orz[<700#$%$&&*&'+,*.-25,8-9)&.*)),/&*1&$)%%%)"&& &#'(! #"&"!-4Z?4=OXunp`UM79<=BZ;OB?>67911B@FQbi#}Pew >Fbpzknt[ntzoa}wmmokio}~ -|~{   n| sw|nmzotcaZdSPSPQIYJDGPLOAJVUPJJRZ_ie[d]\maw`K:N><=>QD16AT|+\M<'.&&&$'*(&%.`4,,-0,.;0$#8A*.1+-.=$$&)*#,b- '""3($ !%!861=78@6FBBC3AJPdUHEA9B<<6D>;959;A]KNQTjB>FGDDIL@097<767VX=U8=H9>7TIE:5>1781LBIOTeakwvhkeVXD]mttwrw{~j[Zvgiqqm| } -  ~ ! | -}o~gooqpwy nnkWWYOKKGEAAB?EC?A=EKOemXZb^\YYdWTQPWoA:?H7@>KcCP7Wj?@B8*-)%&$#%')*,(+.7')),&()+&')45,'*.58$&-#'%/C<7(3%;b72!"%63/0747DOLCIKPE@2,19A2=99;9A;7=?NFE<6:1<30@FUOVmx~|ykjcN=NnEK^h -{pmot~ufsndf|{w~ { - - }u| ~uxt{ysrqnmsyppkkiiRSLNFHFECFJGNHADEDIRW_[a^`t\[^WOUIOFA>AC=]LSTIA?A=29YH%%)#$ #+1*))(/,,(**--&.(8.((2\D03Q=("-+%*/C+%!5"0FR '!0R7616B;?@9JGG:>AAHTRIJFCJLWa[_\cY\WY`ZYJEI@:B68?@BB:4?TPu1)&)+(&%$%#+*+-4+&)6'&&)%%#%38%'70-1.)<. "+=-) ##"#%:& ,=//X?;=EJMOYEHE^UXeHC46:A3%08@?PhD6283=29=87595=87R?;CQf|om[l}u{~vl[R=VRZTV[ohoVVH^zv~kl~r{{v{} -}~{z{ogefe_c -wggtn}vhte_bcXUUUSNU_YNIC:@B828@H]JLMRPQT^Y\Zh^gb[RVkUKMFFM?/)23A;;?=53;=D7;:23293;>7CHQ:=M i_T[}utsS6FFUVUSdd]n^E=FRtpjqzv|~s{ zpihdfh]chhsnafa\ind]bNWQVUWRbTQKGPFCFB=8+&# "%',3*101280-$;)%%""E#$#! " �--((45KI_@DEKTGHUXXQTcMO8((.<43;N6347>@?6316565B@;:368?NsrUpanusznF7k_lVPdyjfI2DKnffxs}x~{w} uljkqheh\gckaddrx xmoq[Wbt_POOUSYKDGJIFHFHNMTB=HUQIKQYec^ffcha^^YiQQDD;:@>A8?A=H52?031*&*-/,),)).):**((;)''+)*!"'5'/"$('&.-,-.5?1:"'%$"+7"<&!!%!$#-,='4995158@ELAB\VLphK))A.0.J=345544>IG9657487=761:9H^EZ{^huvzmkREZ'jdbaknSF8?7+.,136),%**-*(-).0(-6)(&$*&2'%3%"%% $%"%1-.)(%:*'"!"$ ,[" $ %&(/,KK7/15AFEHH\ vu -\7'&*)1:<@1-335;>?=./710BH7>.7<@CcSZ`jhvppbUV -oiecvnuWTA4ASVdRTij{t~riemehkffXTs[UX^YTKO^\ZYSSQMWHJkee\RNXXTNKOIMFGFGMhZ^qj`bagfaVSURL?=88::J;8=;5-,.343/.32/-:(*+.*+)sH('$%&&,#'" $!#%''B=X=+1'%,*$ #!(Y% #&':C2668?zSMOY~oprvi<,*/(!30243-647<ILRLYiuddphWaY22+.&&.1/0468;E95C)2;B:51.6:=GVUSjYcwtpoptVN_Xkb\~[XdIhjpe^YLJFKiejmfY_pssinkm =qil_YUIFHNfgVJDCB=VKOOIOPRUNTZT[YQPKKCB:JRPPX]]_qe\Y\XKAB>A[4:7:22CDLGL;843-(+3480()*-)++'&'&'O)$"'&&%%#! "**/QQ/1(05B+2"# $&## '0'.@@EMFCJ\QHLXguh^QdX9&$"***V4:'&.17185A51368?244:>CVZX?JX`pnybYUaS\gg[nKQK]afe\Yf@LKLsX[aY\belrpoq ~{]b[[SRJQKQTQZGEIDMZUXZTTc]b\Xd_XUOOVV`WNJQ\bdhwrnbWSI@>=:8A818638AU>B02##"!#(,*.0C@LOJPS^DFVsTNUDEGHNPHJFN]dfjngPZY`W_b_d_]VmrhVWOJ?TK?MRW_RVYcdaao -hlZPPSPFOSMMMQEDVNORPSYYU]`ccj[]Y^eRVdnd]PRi`]amdiVSFI;=945O6/8308]I@PND:508-))..,.&#)(','#$!!$ )%)&%%"$&#./11-)*63135[0$!!%!1##+),+(+1J@CZGTXQKNOWfhSCGK??86?5Q(-4206/19032*-0:>5:3CA>KHNGIDPmlbfigcTWVYWXi|iecd~^Frk/@@TWYXk`R_^b`dlttn`ZELOSBPmlSLBFKV^[WRg\a[`[ce_YWjzlY^emytVjg\\aWRIJEEE?4--,+4>24533>5FB7@]55/1.-+/'$%'&')%'$$"&$''+'-*#'&/F8C.2699=>0&$$$),%' &1)# $%)$))0?1XBKLUU^F?`kWTQNOEQAFMC"#.0,*0)/)/,3.03929KLdCBTSGC>Ldm]egjo`P@BBPbppkrq[U\YrYAE8XhJEUi]TXi]ddvp}sioSCMPWH}SfXTQTPTjjwdihiTm\mdebvyj^vqjidiigVPCEAIJMQD22.1..7:739>793=9;1610***.&*3()'&$ ##$!#'+()&$&$!#*N@92@-O@..''3-# &$:9=!+ $:8%&-3B^2F?I[YU\VIGKNXRdijdSPRT_Q\TQXWUVWWW`^b]XZe``hfco}xvrs|qtusmcdKMTIIH_fTE3124727:54,9;9:0190,.-*;.*"#+)-)#%%(%'*)+&%" #""!>(),*,4&-,=-=K"%!'+ ))*&),28;=;ILLJTSP[VFM\QTOSD@=::I11(!&/+,-42620210311529ACKI]449FO^lZZRK/K[guY\b_UMH@ =FS[UYQ?JIOOQSQ^gYXRVSOSS^^`]\b^\Y^^ZZ[`cadmgjouuzyyqns}rkn]PLJKLHPJD914A7B55423479=73243.25,03)+$&&%=,&')#)+*/%%##'3&" '02&.-)%,/"N@" "$# 8&(%)=>>AGMGUVNPSHiKHTOVdT=:;;;G77H&#!$".063222212123,9F;=[C558714C;>=8934Cc{::J*,$+(")("&&#(/%)'$('+,(<)*82'*'&,%04'"%(+ ##"!$"!"#%$)9=D;GFSTWKMTRPPITLLJD=;G=;BwU*#.$(,2.5434>K55>539;=NC43*953;7>GFPiVTh@NGUUVQPCEGTXXVPSNM`>9>Kbp|'\HdYWVOSdunXcddgccb\a__Uaa_`d`\uukeesreddjhgkf]QMaPTkC88E=?I>595/7:5HEI;9=5405/-0)',*+'2+(&%$)j%)+(($)')?*.*%')'&(',3 %8&$#!  *#($%0X@3K@IAMHM]VXNKVA@@@D=33JgV9:7533@42BCFHA@F/.-22,+&"%)%,)$"#$$#(/(#$''&&'+-*,')2$!#'#!+$ $% ,%(*'+(->EBR6=0;IXFNPPDHBCLC=;<8?P=#'($%,K/)%-.121.+-1843vP=HE9EB:9>===bAE<431+//=,/&$*+%)(#!  '+>0$)''&'*-+##(&#"!(()"!!""! ! $" "%)*08:E=4525EINHNJVCB>ECE:@=GJ3,(#%.,%.&')-*)32)%-83,2I?CJ8;d;:126GGIJKVgXWYSPQN_][qtud[VTEDDHUOl " {ckU^o`]Ybfgmhgq m^^Z]hipm}ecmaeaf_fcYPVRHNLRNQFFFIDGGxwhb_[E\z@@<><:;J5//-54/.-4,2(%$'"!!"!",**4&(%.-7*,*$&$&&&#$0($%!&%# $5&@9"'#'-/1=71499@JISRJHZBIAC?C:>9=3.-/, &!#'#$'*)/6.''AAAECMW~UEE<>697<;ID411151/;/;,$! ! &,125-<,*),?-('#0&*$%$%.?("&7$& #($&'*,.4?5L@=:OOKMMKDCNGC>JI98A5177`.+%#$#$%(:)/.#)+4F>9?;:8;,DRINGUV_Y_NX[MWZXba\_LU^T`icagsXbirj\ndwylb[KRYh`hmt\[nlkksngTZQLUSVgKJSLNNKIF@XGBFEF>DXD=ctOG@?9==>IAID=1:8/24E**+"("&%(/3+22G-),)*+&+%)')$$!)1>#% ! #!$#-1)8F@DNFFEFXEPMaZICFHDC<>L85F2.26>&'#))#%/,41)$(G7?@=95DA7?HOB9ID9@KAR[gTOMH?IQ^^^[_]LSNTaR]Tbmyg^KVrpMVJBVFJNW_]`^adWWVkgcic`b`QQJGGEEKJPLMIFC:>FJOP^VOFFFE5@ID@G<=9AAGEt=A76_[D)*+'$ +5%*"(,b1-)/-,)'-.. &#(1(&#(!"&!'!" %* ,.)43E3<,'*$%#+1.'+0?66<=7<@;>DD<=D/56HEDFIGT[ED=LPNOORORIHNRJR``QmaOXc~~sXEJ?NLVGQQZZX[qc[Z_dWVQNRJHCIJFBBAFETNDFN4ER_~mXOXJL?DBO@EEF@8AL>?GnT;6=2*..*&& # !<&!*J.5+(('('$0A('42c1+,-,'-"%&3#+!-12!#&%$9>:NYSD:LTIOIHJPFQNMD>B>9/D/4%/,/*!"%.,'),435<@;7:ADBA;^Z9G>BGEUKGSPZKMU=IJKPPSUNJTSZZ][SJNdurvbZRXGU[OTEAabm^_hd[WRTQKJEFB=@JBCBA?S=CJE>4Pc'nWNH>BCF?BEK8CG;DQ:9cQBHC0/*+.&&!# 0892*($).'&&-')*-7+-2)6Wo3,%.+%'! !!# >, (**"!!*++36DOOF?FPNPPXQILYGMCCJ;84.(3)19*-$ &.')/566:@:5:8>=@=EQ]929CE@MHKNUFIA9/9AIIMQKKPfUGhSGEKE=Nie\gdYRPWUOLHHRRU\g]]\PJID??QT6<@=:;?A73X1*0E-(,&("(I-)')& #((&&+&((,&5/,((0640+($%$ %!$$ '#"#$(1,09AA@MFMKHHMM[ZPw PA:>:C>/0*&/.,++" -**0B778;;82/;?9@IJk=)*5EC@KDGVJ@9327A?DEMNMMPLN[OQjD7@OFFJQQO[UJPKQNDD=LQVSSfM?B?8C7?97489A;C;:=?:;2GM`HW_J?=E@4V@00253;IOGIXHNIMOLBGUQKE>FF?82/1,16;;1.&$!(),?;E767<;6U/:EMCVIa?0%0OSKFHIFMZ?2-1@HNA9@PVCJI?FJUG?=563EDFPW>A>BAAGEGN`PPZ\E=>==>8?71794>A:N@4:><@OC.0*#212 "#"*(""')&''$'+.=HICHC?LOLLP@FWeLDBSPH>;933.AOm:*% #.1MR@KU?5:>7@-,TOMG?>/&.9CFMFUIVhB46:A>=8Lm3W<9=8@@EC;C<=?A?N@E>9:07D<=CF>:6<==723978>:I8UAI?>?=BMM`KMAAH{@9975=-1230,--,,C,K4?5$## "'!""'$(+#!#4.+)(.7B3/4B7265+-,V[.&$#!"  $=$$*"%"$#,,/FB..+,)9Q@@]iV/4BA><7H^\eI@A4 (1=CZHJ`]WH;8<798I:9686@7;:@EU30/*.3,H633/9:H=.8$)"!""0""<\%%#/0+'+44:D>:iW@=6.,31()/') '"%!&$/" %#""&%/.4P;8BJB;:GBFDDFCLC?I@GbsD@N93:C;0A57, $:G9=97O36:H=:6:CFCB=EC%'6NINEAF@JBF?Z[aFGYLS?958E610+08863..-1@7331&&# #"#&;72&//1(,04KM8?oi7?P>;F1*-.&)" )C9E'"!"!*%"!%$2.6638>^M=N6;AD@9;823-.#.6788128213W=:8SSBYSI72$%7DEF:CUMfH=9=EKA42=>430,0J:/4.05.,'S1570**$!!'((%')(----1(48370-;<`B8/K1,0;A--&( ##$#,'#'(,"!&%)'&(9??>?Ei58>D<<=P39/76207GU==0:)./'2*1%,#&$"!"( ')#$ $8/(5@K68BP;799;>B:BQWINIQ>:KDFM745:28,$#%*-14@:5A=597=D;89OUzC1**'3:I[S>SqKL913//<;19B5;/)5@ }B=-,/6,105626117538;59;<=263256OC<8>7Ic~WB>GACDAFFNFF?:2;.$'#'/79;8AD8::C=.11/7CL0?.*+-;AI9=U`HR@/3-308545397188917929//11/-5=3;:48:3;7361.064739:45:2:AES>?@@9<<=D@;987C;9FOH87.-,-+,)87339/40P<08097:Db,88:?8=987>261322@LX -\FDFD@=;4BKYJ8Gb5-0%$&/2E924HM<884?=:O4C63,+'*@CF78>BSH<:3278:40845;=@ilS<592.-.0/,.122,2695<4341=450112406=^R;<,.121/5XYcIGQQRC:><>bSJ:5*.352*$(%13.1.3=GD=<87=0761>3,*,AC9B:;:JpN;359272:;-0534:EDKV/25-2F21-33/.B5:5-16==7634033/5=8=EC;:2;:?CCD|=7/1+7=&***6*#.%)"%]#! #K42>>$<??B7<82935./+9yCJQXJBEMNA?olWO6+3-3:0.+'.11,-0=@M?BDAF5;6BK>@3GI5*.060B30,/,4031053668001=LXE=54/1285>8MM>=><8;59>:@9947F.-+57?R374Q;:@a;=578g7F^@7ZOCA=<99D?=54OU<50*(&849.5283.1.180+<.0OH#3, )$/@+ ">U5:/)((3++57/.300/3/+1DIHJTkFI_ILH]C:2*,,2?92)('+.0//65D@O>BX@598+7388>5A:;9*,?=82N?>8>7@kWD@=A?><46;4;87870750L@2-/3=920*4=LHd0('0!$(8&%#"&&)0*+0,34.124*)/FIBBC@EBGBJNBGF?91>/B3I:51()(+4/C26H@FB;>G>J=PNK:9LR81'.=E;G@9?:::9=8?MA3959\K=><68/8>9645;637<2-22:@IRK:?6062-2<640),)'1=?(.02./?J89@=2+,-80-'A,AW;;#'% !!"]*'$)(,#&--2H1?24-=2@*4>>?9<<69@>BL>@?_=>:8>=699:6:B?3>62722:40-156>nK8GD;9>=027026/@6D37<;3H6).G-4928.22/2:14=,793<;M4396-D;:/&(')))()-10-09@F110I-*/6/'5<>>~\+("!!"&=.&$$0&03/-10./23**(-6=M=BNAP805N632('#"+/3F=9<:@9C:C=>=AFGBAOGJ@F=?M955:@66=89967>@8:2416BDJ76nc>5>?65QqQ>3C29369K2955212.2(%&'/A6BAFROZJkQMIXID.15641$*%!.+02564N59CE@9;J=BM.&0,02.)511453=D9N:>:<@J=>XFDDEKA>@D<;;KDD==Q:@8C@:68,'(,-IB)/*.<6/>B4870)-1,:0+->2/G""$"D%$"%&&*:*45B.200*,37<:?F@GUYhXK[UsOF@@K2<85;SE480,.2467EYXpnG=6;<341)83:2/(-()1.0188;4::?J>?DEE>8:@F;<>897P4/?KGBED583?037::;SyK=;<3452202:5-2/.12-32,477(+51F34.208:7250,-C8//,,*'/:1-,C,3./,<^d00*##% ($ # &&%""(1.0>:.//()748@NKKS]PEFOO[SGGFI_@*-./pKT}<9F'*8:CJo H941(-6<3989]1(.7Y25810J;87;?471?:A6?ERF>:>NB8><>7I&FFSB:=:949=777D6FAC7@@89<50E:545;_vP;05374-09-1-5:2272D9;,.../,)35=0-/=2.6./-+>51*&$%+'.0/-,3-,3)0<:A)()>$, %  "7.%* 00@,3649/)/104:ZQfZTvTPIPGU\maM5(*.QKD71@?Q72.821JB==A7555/1.<79241>A124>9657<467QD91;?>4417'&-;@G4>AODF25@6T5>/.&4,0)6/82;3Z6>.2-=160/111>A/%(*,-2-..)*6++&1%+(...-F(/,)((30)#+"/*('.*)%0=17.4/-80C/14CTPKfNF9W8625;DKC>HVrMY}DD6mR:011,369529;?=::+'*/.-0/45.6451137442/,)KM8TEC@6.**'/22/,,+,&%/Fn?A` -f6BO9;;7743367^ZIF6HFB2,>0;,(+51*(74-:1)418=77=9638-**"#),-+-(-+1)-61T-'440\E/,/D0-*47/+""!$;64+%&)58(01,,,/2I1-30@W7J?NIVRK3D?;501;HA6;WqfT583`~B9.5645702/>C9L8/-#$@$8(K40965846254331079@CO-25/*+/-1204''.('/3G=E}~oSBDA[B@JGL>O93.441,H[30./1()%(-).0836/00100@N@E80783-2.-)-++*,+(-B1(((*1vIZ06:HA01/.)./0,D5.-#$%Z0&*,,','&%0.L0A333475.6=EHE>I@DPILGNIB(55ADJ?AKUn`UNr+304%')*13<.3/+86CThH.'/6/+ (+..:520J5283,85-2E64638=.4(&&,)(+1&/0728,5.CbB:DIKCCFB501*-..0/.-*&% #%3-+-7Z3?/3*/5D\F<8.,0B2%'//7+&(%#"&+,*&/*3[t9>07kM,J>;,.2)&'635$%(+3I0'6V6--0++**+25/2547AAEIFKR[EGTWD9LGF^XGAJdW}QyG@=6-!+1551/;/?6>uJO4-*')5*'*'),24/7H7001,'91;;Di0**)('&+*)'/.50.+9/+0;43B=C>;1102,.,-0.4,*" !%'*+*0-;0453.01434951;,E:&#$*3,*($-"!')1B/(._yA817.-1MA;>m0//*..>:!!&(N63<7,)5,/*%)E%',P652594XA7D[OGMAFI[U?MVRm<@G=HE>_q[D5I '40231775;9CD9/03-/*74995/.-,10+G94@"#)*-*/E553c-7*)%'-.+1.G3)')**,&#)&+)*-)$$')-4K/*KV?:37/'2+*A.2R-+-0'+.+1+2;=<1)+0,.1,./5<0++&++&'($" "##$()-;DI2?>;;=4?($$',.DV+$"%TCD4)'&-+'(1;S*(%-B?5/7HO:;9@BDIKLI\ULHLFKF@:87Hj0AgkOaOB=58..02/074;2''9'),5//3+5=P#"=)2BH/1?2#(422//,)#?.$%))*-*)(+*h/(#'$$(//9>2G56[E22)-C?PF=75.0G'%*S537@@1H-1>>H*&11+,.1,;/&&%$"#"&&"%(*F^:PDV81GCQ\T`>8L($'.3,5*"8$*=553(*)()'$+9( .,.*0.:@85.8A=FIN[MGE`LPg_?/C7 bSdw;1*+*0-'9+*?O/:7I=@KYdOFbKOIIA3*c-8)JLDR\C8>KD+234//3910(&@%#%+-'*!RV,$$2+33:7;6.,227411/*+&(&$%!&[4%+&$+*$%"/)+//,>*/)+,#,)/68;adpv?=B..0/1;,-.2*41+1*)(]1J91,62)=+*-)()/041&\?O/%#%G% )%/-*%-/-)%'-S:3""$ $?,+.;::14:565E0.603QI./(42(-//23*-42'%"&*//54103()'$!),.0AQD.5F>R>F@BOOGEE;PFR6B1,*@%'&*,17.++8)!)_KDM>>3@F;2102UT5:3=469816635>B-%&&,.70/5/C.,% 0272G>F7=B879<2+)&+-85q2/<2-%(-,5:C679.00+/+,.>VOi@5WJ2/>.5))>=9+T-2M'$ "&%(%J$,*22+*/$#%&$%"%)',T>7424;<28>F8<<<93&0,%,/8/73/*0&+3@;E96>;YY23;63-539A;?95<46/84IG31(..4-.*)-/1H!*510066Q=8:L=9A304--7..,)-,+0//:2302590,'$(/,212@-513@;:0m?3AE?693@1/7=6+&("*;-F K13-021B-+.)1=::PNDWp>JJ29.5/4.D;W_<4.'&C$" .%! (#)4:AF7.''&!(#!"$/+*0)*&.4B671:32W`>787;A?:>ECElubLN>&3CPdP>6+%),-:5C6=)0342221-2/(***-43:539>9+&1253;QsYJ_\ZC@A>65.2022,,,33223.5H4Y16.45:0.134B]7/C646D74R1%*$(aZP3O/:'+4*4H5%((28M<><59?*:2.0(,2Z;;;H_HH80#%$ .%&#"&!&KU3,&&&"$$(*5-(//3526/1543;=:15857G;AHCTziXx`]<.0-06A+J+'&%.B@R=7261<56;;13-312,.606?I@7586h6;;@LYYxlbyCH<8325306R,243048@<275>D=14@.57431A620618746125$%&/;I[M/4**)/"%4%%B*,'-S78,)4,)5*)+,HP3LnWqTJ3"#" #),/-2$'1! $$!'N%&7.))11/(-108CE*05;2?35=?:@_O^}}VME+-%$%#+#$)-1.3479D23-7?5<.047?=@463772353/4.65094>GBL927:TD7/A420-2C85<4246,7BiT148;BNt]fVVI:/7 &)*(0(*,769MJL=:65152162:873<\O68247-*-)/623/BB`HC>2C3-16.),'$"% !+#""!2#-+*-:1/117<88*,/$') (!"" " 3".0D!$!"&,%'"/(-!"%%#2)-.2=<.=55603=6::<73J=Jm/uTBC?J.-1++.+0.*+%.026rIC;7G634;F82;=:8:::D>86;BA33;962+IyCMNEB4N7/*,-537?A8BH6?9>A=93G9=9253;<<@>R=E>6BHA{A;:<<=956EG=:EU91778IH<>KK}Q62;5993E3/59EOZ>C=?;8C7:07;8817WC=EY57<8>LPT]F;UCB4G;DPX+ 2-+/3..(713.:4:C3:;9<<4J-(57^A@5C?<[26==F62383H8@QOE=<=@I;<<+XBB2K3=AL=DB?HDPP?H<;@8:8,L642C)+,*,"$#"(/%$# !155((()"#%##! '#16%$$7!) "&5!4$#."  !G% "!%%15E>O@>DA;=CEHD>,*5-4-4*&3)5/,5243/I^i;@[B?69>8F83:%/1-09=64:07;=@51KS+01596MNMABT;=I<820AR=67@AC><9sJOMeRR>25=95-1J;/2+()*,%$$'(.,(S", )##0''%&1 !!% !!!!!61N7%&"$##/%!"'' &-4QSA=-5=__1(*$(,5>COASH?:8B@TKLCF7JcI;1.050.8/7B-**.9/)15>AMJ?KA:387:IOZC*+/3C659,1.GOf99,A9((43>F:=?C639T@>788?QUbJ@=I9:B1:84;F^L89A3440*/,,=3GJ4j/%%# #*&%%(,-&$##"7-*!! "#(! &"# !" #%#1_1*/'#)%#""(&?\C.WhB]4@3..52=A*&>$(:8`98M/6@EvoKs}t@@85/20-X0*7.++9@5A9=/217)+23$26D@52189-5,0327>99IG;kA29;LK>@44:9O4Hb9B75>92+)+3*,-2,/5GL5&#" $*G:+A1A&$$%%;-(0,%"#&-$# "#; " """RS+#+&=(>l-,-6_?;1.4K34148'$&#<7>-6:--MU}Z\q|y=86<3//ME//96;:=75*,0//10GP<77OL.43*%1232-/-0(,7.+*-*.3-2*/0434B2/863HHC;;:PE07FRIF<734M.% %"jo,./"5B4),.00/08..%)!*7507/+-LDOSY|(^8(%--10,8/.F:C7,080-05/<@=974_\0('%(,%-/);.:0(+6-/3242.144362:549==A;11+89X;F=?.9/?"('('J;0b^=9O -_70&%,Bw6530$J&'-6)%&#"!,1SUC6-('EX5BA#%!!&3,Z #$'-.)%35)*/?S:B860.$ #,0DR4@PL8H>pdTI8&")-?I;1?+,/1(*-<,,.637--704}0P?+## #L7484+*3&#.1*3326224364?09E4;B>>S>B@IF=216@511=.(.5-;9-&(D%.9+%'-=%/L?:[w?/),'-5-4H.@+'$,+9.'";%'689b==Z[A^9+f3.(#& & %2 ;# <"%"!#(V''7@F2?a6GD8,"$$$1,1HO44K74;0)&$0-+504+1)*2)**(/6-/41I/-,*+I_4,)"$%+8<*,.*00);323/3;21435643>D8]DJ?l@A>B=>/3K66:32(%69,5-.!%/H.+'+-($%,'3IFL0391%+%2+(#%&14)7+;!&0/(;F^PKU^Lc&"1@'(,0-)$&&$&*&*e=-<27T-1-((3&(00&-1F! +V*1>>>P~{hk]_#?|>MM&'!'1'!#")G%eC! "#(+2%)-7\ dJGh>O+4%!& &#%&(1/&2>741.*29&'#$/,.+-(%()*'$-(d45,8/0/.%# ()+('/>'&F-0(),.6+-),3-20J886/C9&!%5),'% ,;3%&$*.(./4&H3:8%"$G/0O;@#/  #8;4*#%!YD+#$RNJ2W,CGA%*#(''&('$#!#&!!('*+,+%4('&(18%"(-+%%!$$ -,$ #!&- #%%$&$&%+3>L.,2/,(,,4E?gRaO4.06.@TgMX7J34++)4'(+)""$&&)* " ""%&"0#&,):/7J<>)?-*"$-$!c&*A483>#&(($@/1(9;-?9*"&"3 b!"%" #G2+!"$8O.56$3%%"&2%%0()#)"*'&%$+,'--(-*2W&$%5'##$&" " <%"!&$$"$#( #'(/04?JC--7.-2<;{ -ug?24+0C*03197>#$('*(/+-.""" #%"! '.$8 ##(1.G:;A.*$ # ,./#)*N@,)&./))70 ")"-%+6V9+9%! M/%GN78%"!! 1.#,%%'/6%)%$%%((($&)+%#+%A(9m!&-( #,%"$ +!$ 2,"!/&#$)>GG\1:0236387)xnR3.-.(8.(&%.6,2<,2('% +$! %"$)#! %*(#*.+ARA?RS-%+'$"$%(%(*)2+++1#'!-3;8*'3";0@/5!'( %2%,2&).4**'#$.)&$%#&&+(*(*$((!')(##"! > % #!!%" !"$$%&A0@)6(3/'*.A>oci<*$%(3/<$,)141UF>,%"+% ! #"$#'+/(#7&,*.X:=7)$<* !($ !%2+%&",)!1 *   '\z -O$!&%'$.(&.2))*%&0$" $%&$(=(*"! 9%"!  "  "#%#'!% #$(%$<&##!-FPA_M~,'$'')-6)"'.85A?k($%-&' )!"%#<$ #..#!"#;(9.,;O)%#((""#41&%&5),$!"#!""A BBD2)0-U4`bA4$ ! #% $*-/*()0,((8.("&""'*+'$$&##!%# !"%&#!!" ! .%'L/#$/'+/9S8[Tb8& $2>D&*!! $5+)K..-&9#$  "4*$$&)-$ &%5(*,(!! )&$("&30'%'"":M*#+!#.1~0B9V6!  <*$ #$255K:A@7&'&)#"!'!%!"))!#&($ !!#" % & +$&" (+%+4A2=&$%Gdpo.0#(FX0-1"0:1$"!! )7!!"(###".'/!(/*(##!';-# &( %Z>3")*2/o/6LK')$7$'$ #,'*)0-&+9S`LZ1 #$#'#!+# $6&('$#"!"!$ $$0"! !, %7')" %)H#'+ "2'2I((Y$%!-$*"('&%''#4!'%"#''&W!#(+";O3)0*%&D9&-S*"&9 &$# $ $"#8'++%9PV?A !"!$$!'#%!(87<%%## " "  )!"#&!.&))=#!!9'"4^/5(%%&""# #"! ""!+7####$ !!+'" 3$ $("%  %+(#34L[;?0(77 $,$##$# % )!""((*+$)$D556J$$"!###"$%$'%""!!'!!$ !)" !"%.I #%(# ("(&.*$ %&-"(&" ! #%&&  "(!.'"%"&#&"+"$ \ No newline at end of file diff --git a/data/fits/NGC3344.Color.32.fits b/data/fits/NGC3344.Color.32.fits deleted file mode 100644 index b0b26921c..000000000 --- a/data/fits/NGC3344.Color.32.fits +++ /dev/null @@ -1,375 +0,0 @@ -SIMPLE = T / file does conform to FITS standard BITPIX = 32 / number of bits per data pixel NAXIS = 3 / number of data axes NAXIS1 = 256 / length of data axis 1 NAXIS2 = 256 / length of data axis 2 NAXIS3 = 4 / length of data axis 3 EXTEND = T / FITS dataset may contain extensions COMMENT FITS (Flexible Image Transport System) format is defined in 'AstronomyCOMMENT and Astrophysics', volume 376, page 359; bibcode: 2001A&A...376..359H PROGRAM = 'PixInsight 1.8.9-2' / Software that created this HDU COMMENT PixInsight Class Library: PCL 2.6.1 COMMENT FITS module version 1.2.0 BZERO = 0. / PCL: Default signed data offset BSCALE = 1. / PCL: Default data scaling ratio ROWORDER= 'TOP-DOWN' / Order of pixel rows stored in the image array END (((!!! !!!!!!###%%%***.........!!!!!! !!! !!!###!!!(((&&& !!!!!!### &&& ###)))%%%$$$"""(((######!!!$$$(((---'''666,,,---&&&)))444222,,,***...000///,,,---LLL___333...333555555]]]}}}[[[HHHYYYZZZLLL>>>PPP---:::^^^999'''...,,,111---111---444...555///666000)))EEEKKK111444000333111555888000000,,,111111333333.........333666:::444222333888:::>>>;;;888>>>999999999777333777???CCC<<<===;;;999aaa666<<<>>>999777999444???666<<<333:::>>>888:::222DDD555000000...666777AAASSSCCC999???FFFCCCBBB===777;;;===777555333777222444444888333666>>>...666===777444777111***000)))'''(((000,,,!!!''')))$$$###!!!%%%    ///"""!!!&&&### ###!!!!!!''' """%%%+++ 555$$$$$$,,,!!!))) %%%)))!!!"""(((&&& )))&&&%%%***000***222111...###+++AAA+++)))&&&(((,,,&&&...666,,,)))888222444777TTT%ZZZMMMnnnHHHGGG555<<>>000000%%%///222333///000111666222...///000---***...111...000111///***444555444333333999;;;666555555888666888888<<>><<<666555AAA444333666555444333777444///:::333000444444...111???>>>111:::===CCC:::555DDD555HHHMMMGGG888>>>;;;999;;;CCC<<<666CCC777222@@@111+++***111555&&&***((((((,,,%%%###&&&'''***%%%###!!! """"""'''%%%"""!!!""")))&&&!!!###!!!""""""$$$%%% $$$!!!&&&'''""",,, """''''''&&&((((((555(((+++///***...QQQ***333555%%%$$$)))///+++...,,,666AAARRR@@@<<<:::666555+++BBBDDD<<<111...+++---/////////000+++---...000---...,,,***,,,...+++---222...[[[EEE///---...555...333222,,,555000///444777222***444444111:::@@@999777888999999AAA???:::999<<<===???BBB;;;444::::::888888:::@@@<<<444::://////111:::444333000666444666333<<<444111...;;;666000222---???;;;666DDDBBB>>>444===>>>777???@@@444888GGG888444666333---***------222111))),,,---&&&///'''%%%(((###)))+++''' (((%%% ###&&&444111 %%%$$$%%%"""&&&'''"""!!!777...)))'''$$$""" !!!!!!$$$'''!!!$$$000+++))),,,)))&&&,,,000...222***000)))***+++<<<777(((,,,444%%%'''+++---111000777LLLOOO555111666???;;;---===111......///111111666+++///---...(((******''')))******---///555666111222000///111++++++000&&&---000555444333222222444@@@???777222666777777888999777777555:::999888???<<<:::;;;;;;DDD@@@@@@<<<>>>444888444666888666666444555999444666777888:::<<<777333555===EEE???444444666777222222444;;;RRRLLLEEEFFFKKKLLL<<<888VVV888999---444...///---///,,,+++AAA''')))(((---$$$...///((()))&&&""""""!!!""")))'''%%%888888 !!!###%%%000!!! !!!111$$$$$$###$$$+++%%%111###!!!"""  )))666&&&+++---###(((&&&(((...)))000???222:::999LLL222000BBB///111'''+++(((222111+++000---777EEE;;;666777===:::IIIQQQ,,,...***+++---)))+++,,,******,,,...,,,///+++)))+++...555999000///000000444111000000...///,,,444444...888,,,222666444222222FFFEEE;;;888;;;666>>>@@@999<<<:::999777999===@@@777???DDD<<>>CCCOOOIIIFFF666AAACCC888<<<000666999???000,,,...---222&&&)))+++///'''$$$111***+++000!!!!!!###'''$$$!!!### 111(((+++)))%%%...)))"""###///))) !!!'''((("""%%%(((!!!&&&$$$###&&&"""((($$$'''999/// ---((()))******+++666:::GGGeeeoooBBB;;;CCC000)))$$$&&&000888...111///111+++:::777222222666333111999<<<333000222000,,,,,,000------***---000111444111+++666222000111...>>>WWW444------///......,,,333111,,,......222444888999PPP999;;;===666999:::???<<<@@@888444444666999???AAA;;;999<<<>>>\\\AAAYYY??????AAAAAAKKKAAA>>>999===???999???222BBBQQQBBBRRRIII???cccAAA:::???@@@<<>>999999<<<<<>>FFFAAA555999===???XXXQQQ^^^kkkfffHHH<<>>XXXIIIFFFMMM``````aaaZZZooocccVVVSSSLLLZZZDDDDDDGGG<<<000///...444222+++444///((())))))$$$###$$$&&&+++)))%%%))) !!! """ +++"""999%%%...;;;CCC""" ,,,'''!!!### !!!&&&111!!!###---###;;;))),,,:::,,,***LLL'''+++&&&,,,***$$$)));;;'''***...222BBBaaa WWW4VVV333///+++(((******,,,---...---222///000555...***))))))333888AAA;;;:::RRR000333000...***)))//////%%%'''---+++---...***...333444888SSS,,,000.........+++(((///000,,,...333666555111111444222666666;;;777:::;;;:::888:::LLLBBBDDD>>>EEE???:::888<<<===BBB@@@EEEAAAJJJ???HHH@@@;;;;;;>>>AAA999:::BBBHHHBBB<<<[[[zzzNNNLLLNNNhhhCCC666;;;BBB;;;DDDMMM@@@HHHPPP[[[```uuuvvv[[[bbbEEEUUUSSS;;;CCC???HHHMMM222333777555...///222%%%'''(((%%%###)))333666'''!!!!!!((("""!!!!!! $$$###""" %%%...'''>>>))) $$$)))%%%###'''""" '''***!!!!!!%%%((((((BBBAAA$$$)))(((444111***(((&&&%%%$$$+++999(((000CCC+++<<<000...PPP ssszzz===333---111...---+++)))///...333...+++:::111---333888000000222555CCC???qqq111111...+++***,,,///;;;///++++++,,,CCC///,,,+++***---777888///+++(((+++,,,333***,,,---///000000333666444555333555000444333555666???;;;>>>888]]]===???======???888>>>DDDJJJ@@@666===CCCPPPHHHUUU<<<<<>><<<@@@QQQ:::AAA===XXXcccJJJKKKAAACCCBBB???888444>>>RRRNNNVVVUUUWWW*iiieee]]]EEEHHHOOO<<<::::::555222888666CCC000111---111(((+++,,,*********'''$$$%%%%%%%%%(((!!!***!!!(((!!!GGG"""!!!###"""(((QQQ444KKK%%%%%%!!!'''""" !!!### %%%,,,)))---333'''---$$$###))))))...444&&&,,,)))---(((+++&&&&&&888555///111,,,===333222555<<<333OOOaaaSSS444444(((+++---+++...GGG)))---222+++111---,,,///+++---///---333444FFFWWW^^^999000000888///...+++...555,,,)))---111;;;---//////000---,,,+++'''++++++111<<<***+++---000///+++333000222000...222555222555333888===>>>???<<>>888888???BBB@@@???AAA===AAAsssmmm===GGG>>>===AAA@@@999HHHCCC???<<<===<<>><<<@@@>>>:::CCCCCCDDDCCCKKK999888EEE[[[FFFAAA>>>MMMlll:::<<>><<>>:::;;;BBB>>>HHHZZZLLLFFF<<>>@@@EEEBBBEEEAAACCC<<>>:::===777111888:::555333444222222111222+++***)))&&&))))))***%%%!!!!!!&&&***$$$ """!!!"""%%% !!!******!!!&&&$$$--- !!!### ###,,,%%%###'''555###'''$$$$$$///---444///555:::***RRRHHHQQQOOOLLLAAA222///***)))///EEEccc'''""")))%%%,,,(((######+++(((...???JJJ)))%%%))))))++++++---)))***///&&&+++***&&&&&&***,,,***'''+++000+++------+++,,,:::,,,///...(((%%%111888999---///---000000;;;---,,,---***;;;///***//////***((((((,,,,,,---...000444444111///111222333666666888888777555======FFF???<<<>>>???@@@<<<999<<<>>>???AAA999??????III???>>>>>><<>>...***((('''***...+++&&&$$$&&&---...&&&((((((&&&+++"""(((---)))'''888'''+++///999))),,,(((111,,,))))))******+++777000***,,,000000111000///;;;)))***000,,,+++---222777444------...888+++666---...000+++---444///,,,000)))///999333,,,,,,111333555///333111444222777333444333555555666888PPP777MMMBBBFFFCCC999<<<<<<999::::::>>>=========;;;BBB@@@888===EEEBBBCCCKKKCCCCCC<<>>>>>>>>@@@;;;:::<<>>@@@<<<999>>><<<:::777333666999222+++...222888777---,,,)))***,,,)))---...)))&&&)))######'''###&&&"""######  ###%%%333 ///'''III &&&555,,,######%%%,,,)))...)))###---222...000---///000111222<<>>===;;;;;;===666<<<===;;;888AAACCC@@@===AAA>>>;;;DDDEEEGGGooo???::::::HHHDDDJJJ:::@@@???:::;;;======<<<@@@<<>>222---,,,++++++%%%%%%&&&---'''$$$$$$$$$$$$///,,,***+++***---+++&&&+++,,,---)))***(((222'''+++///???*********,,,;;;+++///111///***000---///)))---***(((+++222444000000...+++111333555---999333///000---000111000222222555555555444111222222:::222<<<666999333===444555555222555777>>>666555<<>>BBB:::;;;======BBBDDD===AAABBBAAAAAAJJJGGGDDDDDD>>>FFF>>>XXXDDDJJJBBB:::<<<777AAABBBBBB===EEE<<>><<<444222000444===666222/////////555888888---******&&&'''((('''...&&&&&&&&&"""%%%!!! ### """$$$%%%,,,"""'''!!!%%%)))"""*** """***000,,,@@@777'''### 000...***CCC''''''------000666---???666BBBEEE<<>>;;;BBB===:::<<>>CCCFFFEEE@@@@@@<<>>???BBB===CCC999222222:::777...222222111)))111---AAA333///---&&&,,,,,,///&&&&&&111???***+++$$$$$$&&&%%%&&&!!!  !!!***333$$$!!!"""  !!! """###---999""""""&&&"""***'''KKK$$$&&&"""###***%%%###&&&''')))%%%$$$---:::222111HHH;;;111>>>EEEZZZrrrkkkaaaJJJBBB555---+++---+++'''---(((+++000&&&%%%(((---,,,'''$$$######***)))'''((((((...'''---***&&&&&&+++***%%%)))+++---111000555+++***++++++,,,///---111333+++***222------+++,,,///000555---333333111...---555444......@@@;;;444111...333777888222888<<<999555:::<<<777555777888;;;999555555333===555444<<>><<<222///,,,000---...111333EEE222...+++)))'''(((+++)))%%%---333---///---"""$$$$$$$$$### """'''(((AAA!!!$$$!!!!!!mmm%%%...(((===!!!$$$ &&&%%%###!!!!!!%%%%%%$$$$$$((())),,,'''+++,,,999AAA???999888999???F0tttwwwLLLCCC222)))///###...(((+++///%%%(((&&&'''))))))000...+++%%%)))***+++,,,(((PPP(((&&&&&&+++***(((---)))((()))---666:::888;;;000,,,(((+++,,,---,,,---...---......,,,,,,---,,,222222888999///444333,,,222555555777///111222777111666555///222555111000888///777::::::;;;===666888>>>>>>CCC<<<:::666:::::::::888999999???DDDDDD>>>GGGAAA>>>BBB<<<:::>>>@@@OOO@@@CCCJJJDDD@@@AAAGGG<<>><<<<<<;;;^^^fffbbbjjjUUUOOORRRDDDBBB@@@AAA999>>>777888:::333777666;;;333444???---...---''')))*********111...---,,,+++$$$###)))+++(((((( ###,,,***"""!!!!!!$$$ !!!######!!!***&&&$$$,,,%%%"""###!!! %%%###!!!&&&%%%(((!!! )))***'''&&&$$$---333222999===SSSpppM* aaaAAA:::222((()))///444))))))'''%%%***((()))***))),,,...+++)))''')))((()))+++)))***&&&$$$))))))+++******...---///+++...222000///(((******,,,...+++...111111///000,,,---///------777222111222000333222000333888BBB@@@999000222555444777FFF???999222000888777::::::???EEE666999<<<;;;777444999666>>>>>>===<<<<<<>>>;;;888EEE<<<>>>EEE===>>>@@@HHH===@@@@@@???FFFAAA???GGGDDD===EEEFFF===>>>DDDDDD???AAAAAACCCMMMOOOFFFEEE???<<<>>>999999@@@NNNccciiiUUUMMMGGGQQQMMMEEEKKKHHHAAAEEEOOO;;;666>>>>>>CCC\\\???<<>>AAAKKK@@@EEEFFFBBB>>>>>>===KKKDDDRRRLLLUUUNNN@@@DDDDDDCCCFFFDDDCCC;;;<<<<<<999;;;888AAAQQQTTT___TTTLLLSSSIIIcccIII@@@QQQ???>>>>>>:::>>>777666;;;666;;;DDD222***...'''000111...***---<<>><<<777===888>>>FFF???@@@BBB666;;;HHH333:::???>>>555<<<:::333888999>>>???>>>CCC???EEEIIIBBBGGGEEEXXX999999<<<:::999===:::777888;;;;;;<<>>CCCDDDPPPDDD@@@@@@???===>>>KKKGGGPPP:::===@@@@@@GGGBBBAAA===999===???@@@AAABBBCCC999999>>>LLLOOOZZZYYYMMMGGGGGGIIIGGGJJJOOO;;;@@@BBB;;;:::<<<777;;;666666222111444000111:::444***000///000+++---+++222***&&&(((&&&$$$$$$!!!###***,,,!!! ,,,(((%%% &&&$$$&&& (((222@@@"""!!!  $$$!!!((("""!!! !!!$$$ !!!###/// $$$&&&$$$""""""###(((+++'''222KKKuuu tttLLLWWWaaaEEEDDD@@@222...333***...---222///+++,,,---***(((---,,,---...$$$+++---+++---***---,,,...***&&&***...000+++---///---222222111666333111333111333000222111---///---222333444444555222555333777444555333444777999;;;HHH:::999555555777===888777<<<===666888;;;666;;;@@@>>>NNN===:::CCCKKKBBB999999???===@@@888777777888:::===;;;999999FFF@@@???FFFAAA<<>>888>>>CCCEEEFFF@@@===CCCBBB888<<>>AAA<<<>>>:::777666333333111000111+++111///...888777>>>///444000222((()))444,,,,,,333999!!!"""%%% LLL...%%%&&& '''))) 444DDD!!!%%%$$$444(((!!!!!!---&&&'''!!!###!!!###"""$$$"""$$$%%%)))$$$ """"""&&&'''(((111;;;DDDIII@@@VVVoootttOOO>>>DDD999222000---***'''---444...;;;+++))),,,)))((()))+++222,,,///,,,...444000---+++...===------000000444444777///111///888...000000000......000222---///333333666000555555444333888<<<;;;999222555333:::888222666:::@@@444333888EEE999333333444555555;;;===999888777???QQQKKK;;;888777;;;999555===;;;;;;888???<<<;;;???@@@777===999:::===@@@>>>BBBBBBEEEAAAKKK===CCCBBBEEE@@@>>>@@@CCCEEEAAA?????????BBBAAAEEEAAAAAAHHHEEECCC>>>:::@@@@@@BBB:::III===FFFIII```KKKEEE===JJJ@@@LLLFFFEEE>>>:::<<<;;;999555333666222(((---PPP===888DDDBBB555,,,...,,,444000)))(((&&&)))%%% ###111999"""$$$!!!###  ###!!!)))'''''' """111 ### !!! $$$,,,"""!!! """'''""" ###333###%%%###'''### %%%((($$$&&&&&&+++///000,,,III[[[pppfff```hhhQQQCCC:::>>>999999777///***111///222,,,***,,,,,,***---)))...)))***...000///---111,,,000333,,,,,,111///111***---,,,,,,000***111---===222111///---000---...222000333555111111222666333000222---///000777444666666:::<<<___:::;;;999???999777555333,,,666666666666CCC888888999===:::>>>:::999444888333888@@@???:::AAA>>>:::888<<<@@@===:::<<>>;;;GGGAAA???AAAIIIGGGDDD>>>???BBBAAADDDEEEFFFHHHOOOCCC===@@@@@@@@@GGGAAA@@@:::FFFTTTWWWIII]]]KKK???EEE???FFFGGG===AAADDD666555888111222111333---000444:::???ZZZZZZMMM999---)))&&&###)))%%%,,,)))*** &&&***&&&"""***... ###"""??? '''&&&%%%XXXRRR333 BBB$$$'''$$$ %%%"""$$$&&&((())) ###$$$$$$!!!&&&%%%'''(((''')))%%%###'''&&&))),,,666XXXeeeiiifffyyydddCCCCCCGGG???<<>>---+++'''((()))...+++,,,,,,000+++000:::111,,,///000===,,,---///---666>>>:::,,,///---+++000555555555444666555111111666///...666777777111444888444555222444555666HHH333444:::888===;;;???JJJNNN666:::333888333777444777999999<<<>>>BBBHHH;;;777999999===777444999<<<999LLL@@@???===@@@DDD;;;:::AAA:::@@@GGGQQQ@@@???===<<<======???FFFBBB@@@BBBHHHEEEFFFBBB@@@BBB>>>AAA???<<>>:::)))===///...'''&&&222!!!!!!""")))"""BBB;;;333!!!!!!===,,,!!!888!!!###"""""" $$$'''"""%%% $$$'''###+++***%%%$$$&&&'''((((((+++)))***@@@PPPbbbX -pppAAAKKKIIIjjjPPP444)))...---,,,444///111,,,111))),,,)))000@@@AAA...000...222555BBB999000...555777222***///555444444666222111>>>666666444DDD:::777;;;444555CCC<<<777555777:::888:::;;;444333333:::;;;999FFF@@@999<<<888:::@@@OOOHHH;;;999777222<<<555666444666:::???:::AAA===@@@999999CCC<<<===333666HHH===EEE???FFF===:::======???>>><<<<<<999???BBBBBBAAAEEEAAACCCEEEBBBBBBDDDBBBDDDLLLGGGHHH<<>>@@@>>>>>>BBB@@@???BBBHHHGGGFFFAAA>>>DDDFFFPPPAAABBBDDDBBBGGGUUUQQQOOOJJJIIIHHHGGG:::;;;@@@777111333///111///444///555wwwC|||LLL;;;333)))+++,,,((('''######)))&&&&&&+++)))$$$ %%%(((***"""###&&&,,,$$$%%%111111'''///444ppp###&&&###""""""(((///''' ###!!!"""%%%&&&"""222(((###""" """((()))$$$%%%'''(((---222222FFFUUU!ZFWWWWWWJJJ888GGGCCC===......,,,000------***000---******222333999;;;111------444222888AAA111111000999777999333AAA444000333333777666@@@<<<<<<999<<>><<<@@@@@@:::CCC777333555666555111555444888666999???HHHAAA@@@FFF999777999FFF333444111888777999<<<999>>><<<<<<888???DDD:::???999DDD<<<BBBCCCJJJ===>>>===>>><<<>>>999:::;;;AAA@@@@@@>>>EEEFFFHHHLLLJJJFFFKKKCCCFFFIIIGGGJJJAAA@@@DDD???FFFDDD???CCCEEERRRFFF@@@CCC???DDDWWWJJJHHHMMMIIIHHHGGGOOO^^^hhhgggMMMFFFCCC===999<<<555666666,,,//////222222:::}}}MFFF111)))---(((+++))))))%%%###"""...'''$$$...###"""%%% """!!!,,,%%%"""''')))!!!!!! """&&&&&&///&&&111...***  """###%%%$$$"""$$$ ***""""""((($$$"""$$$###,,,%%%'''$$$%%%'''%%%((((((999===MMM|||<9}}}cccaaa:::CCC>>>===666111555...333111+++...555EEE111111222...222333111444333111......+++333222222===:::888555777555999444666444:::888:::777666QQQ@@@555888888777<<<>>>===;;;:::<<>>@@@@@@AAAKKKGGGJJJ???YYYDDDAAAAAABBB???AAABBBHHHDDDDDDCCCPPPUUUCCCKKKCCCDDD???JJJQQQKKKTTTcccDDDHHHSSS^^^~~~jjjLLLEEEEEE@@@;;;777;;;===:::666///111888///GGGYYYIII(((---)))&&&$$$---''''''"""&&&'''$$$555  !!!###%%%###""""""######222)))''''''%%%000>>>%%%&&& ######### !!!'''(((%%%### ((("""!!!###...888((("""$$$(((,,,999///RRR\\\NNNooo,#"^^^bbbUUUFFF<<<444999999:::222333...000333999000+++---333///222888888:::888222444222///000666555...444777111999888999:::666666;;;888888KKKEEE444888???===::::::<<<<<<<<<888???>>>___???<<<@@@???@@@===999666BBB555555666999AAA777888::::::===CCC666:::RRRHHH:::???:::???777>>>OOOWWWCCCEEE>>>===:::@@@===???@@@AAADDDIIIDDD???>>>BBB<<<<<>>111...333999999JJJ===>>>333999///...333//////---)))222555...333000111666...333999999777666555PPP888;;;::::::888888888;;;999888===555999<<<======<<>>;;;777999<<<===:::BBBNNNDDD???666;;;:::777777::::::666888777555::::::IIIFFFDDDNNN>>>::::::999333888888888>>>AAAEEEKKKLLL;;;???999777<<>>:::=========;;;???CCC>>>;;;???QQQ???@@@@@@NNNSSSMMMYYYNNNeeeFFF???EEE@@@===AAAGGGFFFCCCCCCAAABBBKKKEEEQQQ???DDDAAA@@@;;;AAASSSJJJZZZ___GGGuuu```EEEFFFLLLCCC@@@BBB999777555555333333+++000...666666)))---444///+++###'''&&&)))&&&%%%///+++''''''#########---------'''---+++111EEE666!!!""""""###### !!!  $$$!!!###$$$...$$$%%%'''!!!"""%%%)))!!!""" !!!"""%%%222!!!...///777<<>>888666@@@666///222222///,,,---444666222...222222111000---888666555333111111555AAA888???;;;>>>333:::===777888===888???===222333666888<<<;;;999:::;;;<<>>::::::<<<;;;<<<999333<<<888888???;;;AAA;;;IIIvvvJJJ999666AAA222888888444999<<<===???RRRggg@@@999;;;======LLL===@@@AAAAAAEEEHHH888???;;;======999:::<<<;;;===FFF===999\\\VVVRRRYYYKKKPPPVVVCCCEEEEEEAAABBB===BBBEEEEEEEEEEEE@@@GGGNNNGGGIIIFFFEEE<<<<<<===FFFEEEGGGddd___oooJJJJJJ;;;CCCHHH<<<999===888===333///......))))))---,,,,,,...000,,,+++...$$$###&&&(((&&&,,,'''$$$'''$$$###%%%****** (((:::444000***!!!$$$(((""""""!!! ''' !!!!!! ...,,,###((((((222333)))'''$$$$$$!!! ###"""%%%---000+++---000>>>000DDD<<>>999<<<;;;555;;;@@@@@@???<<<======@@@===AAAFFFEEE===???;;;999777999@@@>>><<<;;;<<<<<<;;;999555999===:::===BBB<<<888CCC<<<>>><<<>>>@@@444888:::BBBCCC777;;;>>>DDDaaaHHHFFF;;;>>>@@@===999;;;:::???EEE[[[<<>>>>>[[[DDDBBB^^^JJJCCCEEEEEEFFFDDDBBB@@@AAA>>>EEEEEEEEEHHHEEEKKKFFFKKK]]]MMMQQQ@@@<<<666<<<======eeelllNNNdddZZZKKKDDD<<<@@@>>>888777666444,,,777222+++,,,222***+++///111///(((---&&&+++&&&(((&&&&&&)))((($$$(((&&&(((***000%%%@@@---444,,,)))(((!!!)))&&& ((((((""")))$$$///%%%$$$'''$$$(((""" %%%444+++"""%%%(((+++!!!###!!!)))%%%$$$///(((!!!&&&***)))...000,,,777@@@PPPgggQQQDDD666555QQQ888===CCC333444777222222:::555888444555222555999;;;666888:::======888HHH???777;;;999999666666;;;999;;;>>>>>>DDD@@@888???AAA777AAA>>>@@@CCC@@@???@@@>>>GGGBBB???AAA;;;===>>>@@@CCC;;;888FFF:::===888:::<<<<<<>>>======<<<:::BBBEEE???EEEBBB<<>>;;;>>>;;;???KKK@@@BBB888999===```KKK???===;;;>>><<<;;;???>>>AAA;;;<<>>@@@<<<<<>>>>>@@@@@@888999:::===999888@@@AAADDD===@@@DDD>>>FFFBBBHHHJJJBBB???===GGGJJJDDD???AAABBB===AAA<<>>;;;BBB>>>GGG>>>NNN888AAA777======<<>><<<>>>AAABBBDDDDDDJJJ<<<777::::::666KKK:::BBB@@@>>><<>>===>>>AAAAAAJJJEEEAAACCCAAA@@@VVVFFFCCCAAAEEECCCHHHAAADDDDDDEEEIIIMMMEEEFFF@@@===FFF^^^[[[FFFZZZBBBIIIMMMFFFGGGYYYAAADDD===:::777444BBB999555666///---...,,,FFF(((&&&(((((()))+++%%%)))&&&,,,+++'''...///$$$***)))'''%%%'''---QQQ EEE'''&&& """((( """### %%%!!!$$$'''&&& !!!%%%+++SSS%%%!!!%%%555111111,,,%%%'''000%%%***%%%%%%'''%%%$$$&&&+++"""$$$+++''',,,,,,555666555...;;;999999444444888///111DDD777444;;;AAA666///222555999777@@@;;;333666DDDAAA@@@<<<;;;???>>>@@@888===TTTHHHAAA===BBBEEEBBBEEE===;;;;;;;;;???GGGGGGDDDDDDIIIDDDDDDDDDJJJJJJCCCMMMEEECCCFFF@@@@@@<<<;;;<<<:::888:::888>>>???999===>>><<>>LLLWWWCCC@@@;;;===IIIBBBEEEDDD<<<888EEE???CCCLLL===;;;>>>???AAA888555;;;GGGAAA999<<<:::BBB>>>@@@@@@<<>>@@@AAA>>>@@@CCCDDDEEEAAA???FFFFFFGGGPPPJJJFFF@@@GGGCCCEEE???DDDKKKEEE>>>BBBIII<<>>:::CCCBBB???>>>KKKIIIaaafffUUUEEEHHHEEECCCDDDAAA;;;JJJBBBCCCFFFJJJJJJEEEJJJLLLDDD@@@BBBDDD;;;HHHfff===<<>>>>>EEE???<<<;;;;;;===:::AAA>>>???<<<@@@AAAGGGBBB===<<<@@@LLLHHHBBBAAA<<<===888<<>>AAA@@@===???===<<>>@@@KKKAAAEEEBBB???DDDHHH@@@EEE???MMMAAAVVVEEECCCDDDJJJEEEBBBMMM@@@AAA;;;333??????GGGHHHRRROOOJJJRRR>>>AAA:::===<<<333000444555//////000222...***...+++222***111(((,,,+++'''(((000333)))(((NNNfff))))))&&&""")))333999```222+++&&& !!!$$$444+++===999%%%!!!&&&$$$'''###!!!$$$&&&%%%111---KKK)))(((:::###!!!))))))+++$$$###$$$'''...???))))))///%%%...---...,,,///222///666000======EEE777111111///888222222555:::GGG===999999555===;;;<<<>>>@@@HHH<<<<<>>HHHGGGAAA???AAAAAA@@@???@@@FFF>>>AAA;;;???DDDGGGBBBAAA>>><<<===HHHAAABBB666>>>CCCAAABBBPPPPPPkkkCCCBBB@@@AAACCCGGGDDD>>>999;;;AAA>>>AAA;;;===@@@;;;>>>CCCEEE===<<>>BBB===EEE@@@CCCCCCCCCCCC@@@>>>>>>DDDEEEJJJFFFGGGHHHGGGIIIKKKAAA>>><<<;;;???BBB???DDDIIIKKKIIIJJJGGGAAA???:::888999888555555444666---333///000,,,'''---000******)))######(((***...+++)))$$$***+++)))000...***)))(((///---$$$((( ######'''444))),,,---((('''&&&###&&&&&&$$$!!!'''"""+++ZZZ<<<)))'''"""&&&((()))***000333&&&&&&###((((((,,,111***(((,,,***444666444MMM:::]]]KKKLLL???333:::555222444444555555888<<<;;;>>>;;;888:::???888===:::;;;@@@BBBBBB@@@>>>BBBQQQKKKEEEhhhbbb{{{ZZZHHHEEEHHHBBBBBB???IIIIIIJJJJJJHHHKKKAAADDDCCCCCCGGGIIILLLKKKHHHJJJNNNHHHEEEIIIEEEEEEBBBDDDBBBDDD@@@BBB@@@AAAIIIGGGCCCDDDBBBAAA???>>>GGGNNNVVVKKKDDDBBBDDDAAACCC>>>??????@@@FFFHHHDDDBBBEEEGGGEEEAAA>>><<>>IIIAAAFFFGGGEEETTTcccAAAAAAHHH@@@@@@JJJSSSCCC???DDDCCC>>>EEEHHHDDDGGGBBB>>>EEEEEE>>>CCCJJJFFFEEEGGGMMMIIICCCBBBGGG>>><<>>???999666111888111222999111---...---,,,---******''')))$$$)))***%%%!!!+++((((((===+++eee===$$$###%%%222666)))***$$$>>>!!!$$$!!!((( &&&&&&&&&  $$$!!!!!!######%%%!!!&&&***$$$000!!!)))(((...'''%%%333)))((($$$&&&%%%"""###333***///,,,333333...777000444;;;:::@@@888888===>>>222999AAABBB888999333888>>>MMM===888JJJ999>>>999AAA@@@BBBCCCEEE???DDDIIIIIINNNQQQ NNN@@@??????JJJCCCEEEFFFHHHNNNFFFIIIWWWDDDLLLIIIEEE@@@BBBIIIFFFFFFCCCJJJPPPTTTLLLHHHDDDDDDGGGCCC???CCCAAAPPPGGGDDDGGGKKKGGGKKKGGGFFF@@@???GGGJJJPPPHHHJJJKKKKKKDDDGGGAAAAAADDDCCCHHHFFFJJJLLLOOOLLLFFF@@@;;;??????>>>CCCEEEBBB@@@@@@===GGGAAAAAAEEEaaaGGGSSSCCC@@@@@@@@@JJJFFFDDDDDDMMMKKKEEEFFFDDDGGGHHHHHHMMMOOOQQQGGGLLLEEEFFFJJJHHHIIIFFFHHHGGGEEE666===AAAAAA@@@CCCGGGGGGIIIFFFCCC:::???<<<:::444444888BBB111111444333///,,,''')))000(((%%%%%%$$$%%%'''$$$"""((('''...333...555***&&&%%%$$$%%%***,,,'''"""AAA ###%%%888 """$$$ ###%%%>>>...+++###$$$"""###&&&222333&&&)))---'''%%%))))))***&&&111---...>>>777000333555@@@@@@<<<444IIICCCJJJ@@@666<<>>CCCJJJ<<>><<>>BBBBBBCCCDDDFFFTTTRRRHHHEEEHHHNNN???@@@>>>@@@HHHJJJIIICCCFFFGGGBBBJJJNNNMMMLLLIIIWWWHHHHHHJJJDDDPPPIIIJJJIIINNN666111DDDHHHHHHDDDCCCIIIGGGCCCAAA<<<@@@:::>>>888111888777666222:::///...///???''')))***(((***''')))'''&&&)))((('''(((444MMM'''***---%%%+++&&&$$$###%%%((()))))) !!!###!!!(((///%%%''' ###000 ((( """$$$---(((  ((('''***...DDD###!!!'''000'''$$$&&&***+++***'''000555444JJJ000000111555---===<<>>CCCAAAPPPGGGFFFIIIWWWMMMSSSBBBAAAEEEGGGEEEGGGLLLLLLGGGFFFRRRJJJHHHFFFHHHHHHJJJKKKBBB>>>KKK^^^hhhKKKHHHNNNPPPXXXUUUSSSIIIMMMHHHMMMLLLMMMGGGKKKIIIFFFNNNLLLOOODDDIIIGGGDDDIIIMMMFFFJJJIIIMMMPPPPPPJJJPPPHHHNNNHHHPPPFFFNNNXXXHHHJJJVVVKKKIIIMMM???===GGGCCCCCCDDD???JJJFFF???CCCAAAKKKFFFJJJIIIHHH@@@>>>AAAEEEDDDBBBGGGAAARRRNNNNNNEEEFFFKKKIIIRRRTTTOOOFFFDDDLLLGGGFFFHHHJJJIIIHHHIIIIII???:::999???KKKFFFAAA???EEECCCHHHQQQ<<>>555777555999777333>>>---***))),,,%%%***///))),,,(((&&&)))///&&&###(((///***)))&&&///(((///)))%%%((('''''' """ ###%%%&&&444!!!###"""$$$///%%%!!!!!!"""""" )))###'''&&&===***(((((("""(((***,,,+++)))111+++''')))222222555000///555///555KKKHHHLLL888DDD===999888888:::666:::777888999999KKKAAAAAA@@@KKKLLLVVVZZZGGGGGGHHHHHHDDDKKKPPPXXX[[[YYYOOOGGGGGGXXXLLLEEEwwwOOONNNPPPPPPGGGFFFHHHGGGIIIMMMQQQPPPKKKQQQVVVZZZmmmrrrhhhbbbpppuuuhhhVVVYYYUUUPPPTTTTTTOOOJJJJJJIIIGGGLLLOOOJJJPPPNNNFFFJJJFFFJJJQQQLLLNNNNNNSSSPPPQQQTTTPPPOOOOOOIIIJJJLLLKKKPPPQQQKKKLLLOOOTTTMMMLLLIIIHHHEEELLLIIIMMMLLLEEE@@@@@@AAA???GGGEEEHHHJJJBBBMMMJJJFFFDDD]]]KKKHHHIIIPPPIIIJJJMMMNNN^^^SSSLLLGGGDDDFFFLLLFFFFFFIIIKKKEEEGGGEEEAAA@@@555888AAADDD@@@EEEEEECCCKKKFFFDDDAAAFFF:::;;;777222:::999BBB000......---)))+++((('''***,,,(((---***###%%%(((---&&&000)))***'''(((###"""$$$###"""!!!(((!!!  ***### $$$)))!!!###'''"""!!!###%%% ###(((222&&&!!!)))(((((()))$$$***(((+++111&&&)))000333222...111333???===???777666BBBIII777:::;;;888888555===AAA888777GGG???444;;;999888>>>CCC???CCCSSSUUUjjjxxxjjjkkk^^^SSSWWWPPPNNNKKKSSS```TTTLLLCCCGGGJJJNNNVVVKKKXXXVVVEEEJJJIIIOOOPPP[[[SSS___NNNPPPZZZZZZhhh3 ccc ccc^^^XXX___OOORRRWWWQQQOOOPPPMMMJJJJJJNNNSSSLLLNNNIIIJJJIIIIIIOOOJJJTTTQQQRRRQQQPPPSSSNNNOOOQQQLLLPPPLLLQQQOOOGGG<<>>>>>888777===444888444555444---...666(((+++---...---***)))&&&$$$(((''')))++++++******+++%%%$$$"""$$$!!!"""&&&%%% !!!!!!'''###!!!***!!!$$$!!!######$$$)))''')))###$$$$$$$$$"""(((%%%$$$&&&+++$$$$$$'''---'''BBBCCC---+++555333888999999333;;;888888>>>===CCCIII:::444444555>>>888>>>???===<<<>>>:::EEE???FFF???FFFHHHLLLFFFBBB```lll,{{{dddQQQ^^^UUUVVVWWWXXXPPPIIIPPPYYYMMMNNNLLLTTTMMMJJJQQQJJJLLLIIIEEESSSQQQUUUZZZYYYQQQWWWVVVUUUoooooowwwJ,'wwwcccVVVVVVUUUQQQVVVQQQMMMLLLPPPMMMMMMUUUPPPOOOMMMJJJKKKJJJJJJNNNIII[[[SSSKKKSSSYYYXXXOOOKKKRRRNNNMMMNNNPPPIIIGGGEEECCCHHHRRRUUUPPPLLLNNNHHHPPPVVVOOOLLLIIICCCEEEAAACCCGGGAAAFFFGGGFFFCCCCCCIIIDDDCCCGGGNNNEEEFFFOOOPPPKKKDDDIIIHHHJJJJJJGGGEEERRRIIIKKKPPPqqqDDDHHHNNNHHHHHH>>>;;;FFFDDD???IIIFFFBBBEEEEEEDDD===888222555>>>555666GGG444///---111'''---******'''444(((***%%%###)))AAA%%%'''(((000000%%%)))+++&&&&&&$$$(((&&&+++$$$&&&$$$(((<<< ###!!!!!!!!!"""'''""",,, !!!((("""###!!!!!!$$$'''$$$'''((($$$###!!!###))))))---,,,111***111333333---333333AAA???000000555666555<<>>CCC999;;;??????666<<>>CCCHHH[[[CCCCCCEEECCCRRR:::<<>>SSSeeeGGGEEELLL<<>>###!!!### '''!!!""")))###&&&(((&&&&&&"""(((###<<<--- ###%%%000$$$'''&&&%%%------111///555---???)))+++000///...///111---222333///333333999<<<===;;;666:::333999:::===AAA:::777>>>===<<<===@@@@@@<<<>>>>>>:::<<>>===CCC@@@777666666000---111333---(((,,,+++)))+++***333((((((***&&&...&&&&&&)))''''''***((($$$&&&%%%)))'''$$$$$$...''''''%%%GGGsss!!!***&&&+++000333DDDKKKCCC>>>,,,'''---%%%!!!######$$$---444888111,,,+++000...------...+++---+++///999000333111666333;;;888888<<<;;;555888<<>>@@@BBB@@@AAA;;;<<<:::FFFBBBUUU{{{oooDDDBBBGGGKKKRRROOOUUU\\\\\\XXXZZZ^^^OOO]]]^^^RRRRRRQQQNNNMMMUUUOOOOOOMMMOOOTTTJJJRRRKKKOOOVVVTTTUUUQQQ]]]WWWgggWWWXXXhhhkkk___ZZZ]]]jjjkkk[[[\\\\\\ccc```ZZZ```hhhgggwwwaaaeeelllccc___ZZZZZZXXX[[[[[[UUUYYYUUU^^^YYY]]]eee^^^___]]]XXXXXXRRRVVVVVVXXX\\\ZZZZZZYYYbbbggghhhfffqqq#xxxVVVRRRSSSQQQKKKKKKKKKJJJMMMKKKFFFOOOPPPFFFLLLKKK\\\fffIIIFFFcccPPPNNNRRRLLLDDDBBBIIIFFFBBBGGGOOOPPPMMMQQQMMMMMMNNNLLLRRRZZZsss<<<@@@HHHNNNGGGFFFFFFSSSKKKEEEBBBBBB???BBB<<>>222666333666...***222///)))***((()))%%%...(((******,,,***%%%'''222)))'''&&&%%%))))))((($$$(((+++$$$!!!"""$$$...(((###&&&///666444444666jjjxxxOOO111+++)))%%%###!!!777GGG,,,(((---@@@///000111---222777(((999;;;888777555444===@@@???777444777<<<:::;;;AAA<<>>===<<>>EEE:::777===888;;;999888EEEBBBAAASSSJJJQQQkkkLLLQQQ[[[aaajjj[[[OOO^^^MMMLLLSSSOOOSSSTTTSSSZZZOOO[[[TTTMMMRRRWWWVVV\\\UUUNNNRRRZZZUUUWWWQQQXXX]]]XXXXXXbbb[[[YYYUUU^^^\\\```\\\^^^aaaaaa]]]XXX\\\aaa___dddhhh\\\sssiiillldddaaaZZZ\\\ZZZYYYWWW___lll___]]]^^^eee]]]ccc```ccc]]]]]]dddZZZ```XXXZZZWWW]]]~~~^^^aaa^^^\\\bbbUUUaaa]]]iiiVVVRRRVVVQQQSSSNNNJJJMMMIIIJJJRRRPPPNNNMMMDDDLLLJJJHHHSSSammmNNN___DDD>>>EEE===EEEHHHIIIRRRLLLKKKPPPSSSMMMOOONNNHHHGGGDDDGGG>>>JJJIIIDDDHHHFFFAAA@@@BBB===FFFBBB???:::777XXX???===222---******,,,+++***)))'''111)))--->>>---,,,((()))%%%%%%###+++***%%%''')))''')))777"""%%%(((''''''%%%+++***'''CCC444222555111(((&&&888333***&&&///%%%&&&888...000))),,,666333666...666444333<<<===DDD222DDD<<<777888777CCCCCC444666888===QQQDDDEEE>>>:::777>>>???:::999999555;;;>>>>>>444===@@@III???BBBNNNQQQEEEGGGNNNQQQXXX^^^VVVUUUUUUOOORRRVVVOOOQQQVVVRRRRRRTTTdddiiiOOOOOOXXXkkkPPPRRRSSSWWWUUU^^^QQQQQQWWWUUUXXX[[[YYY[[[ZZZ``````YYYddd]]]```[[[ZZZ___[[[YYY___bbbhhhhhhfffeeekkkeee___```^^^\\\[[[[[[bbbbbb]]]bbb\\\^^^bbb www___bbbXXXXXXXXXZZZ[[[XXX]]]cccddd___aaa[[[ZZZZZZ```pppXXXUUUVVVRRRSSSRRRUUUOOOMMMLLLLLLMMMIIIKKKKKKLLLCCCEEEDDDJJJWWWppp]]]GGGFFFIIITTTFFFFFFAAAHHHKKKKKKNNNNNNTTTRRRUUUSSSWWW[[[MMM???CCC>>>DDDMMMOOOHHHAAAEEEKKKDDDBBBCCCLLL@@@<<<<<<:::;;;555000000---((((((***888&&&***---+++)))---'''&&&$$$%%%'''///(((***''')))+++...$$$$$$###""")))'''***<<<***((($$$))):::444***'''222)))%%%******''')))111;;;,,,)))((((((+++)))---+++&&&***222444666:::;;;===AAA@@@444777???>>>BBB;;;666666444QQQkkkJJJ===999???999;;;:::333888JJJWWW===FFF>>>444<<<===AAAGGGJJJEEEGGGAAAJJJbbb]]]RRRSSSMMMPPPSSS[[[QQQNNNUUUHHHOOOSSSUUUQQQYYYRRRNNNOOOSSSSSSQQQWWW[[[OOOOOOYYYZZZOOOWWWXXXeeeXXXcccRRRWWWXXXXXX[[[[[[XXX]]]bbbYYYYYY___ddd]]]___aaacccnnniiigggkkkqqqkkk```aaadddgggfff^^^ZZZ```ddd]]]___aaajjjnnnddd\\\]]]YYY```[[[\\\^^^\\\^^^]]]bbbXXXZZZ\\\ZZZXXXVVVZZZSSSTTTPPPVVVTTTYYYUUURRRQQQMMMPPPLLLLLLIIIIIIFFFIIIFFFNNNTTTKKKXXXMMMIIIDDDLLLIIICCCBBBJJJJJJMMMJJJMMMMMMQQQOOOLLLLLLvvvjjjYYYOOO```IIIQQQHHHPPPNNNIIIAAACCCGGGLLL@@@<<<===>>>:::666999222111...,,,)))******---...+++,,,<<<(((###((($$$&&&%%%)))+++)))%%%$$$++++++''')))'''###&&&&&&$$$''')))(((###)))---$$$(((&&&...111+++(((...,,,***'''))))))...---000000---111------...+++(((000666???IIIHHH======BBB@@@;;;;;;<<<666999555999888===<<<:::@@@BBB<<<>>>444555888EEERRR???GGGMMMOOOLLLCCCDDDEEEJJJDDDEEENNNQQQIIIQQQWWWVVVYYYLLLUUUTTTLLL^^^UUUOOOTTTSSSVVVRRROOONNNKKKNNNMMMSSSTTT___rrrQQQVVVjjj[[[OOO\\\\\\ZZZZZZ```ZZZTTTVVVXXXiii]]]\\\fffbbb___]]]]]]___^^^fff^^^___ZZZaaa~~~nnnssshhheeefffaaaddd^^^^^^^^^\\\[[[^^^]]]___fffhhh^^^VVVYYY______aaa[[[]]]___\\\YYYbbb```XXXWWWXXXTTTXXXXXXXXXUUUNNNOOORRRWWWSSSQQQQQQPPPPPPQQQRRROOOSSSLLLHHHHHHJJJGGGFFFIIIKKKNNNCCCBBBBBBEEEDDDIIIJJJIIIIIINNNOOOKKKMMMLLLLLLeeeeeeTTTHHHWWWGGG@@@HHHPPPQQQDDDGGGDDDEEEDDD<<<<<<;;;999:::BBBCCCQQQ222///777222+++***---)))---,,,,,,---+++---888'''///'''$$$((((((111///777000''''''&&&---'''%%%))))))&&&(((***(((###!!!***+++,,,...+++###)))222(((''')))333...(((444222)))++++++---***///888888777@@@EEE999<<<666777888999<<<888666666555<<<777@@@;;;???===999777777===999===<<>>BBBBBBCCC>>>@@@777000///555...///555000***,,,***...,,,...))),,,///(((///%%%(((&&&$$$KKK///######+++%%%&&&+++,,,,,,%%%$$$'''&&&###$$$###***(((;;;///+++)))((()))(((***+++***)))AAA.........000222666555888===000333666888CCC444777>>>===:::777:::III888;;;666111;;;@@@999888777;;;@@@444999FFFPPP>>>???PPPPPPOOOAAAJJJCCCAAA@@@FFFJJJMMMnnndddVVVOOOSSSGGGRRRTTTKKKPPPHHHQQQLLLFFF\\\MMMKKKHHH```MMMNNNTTTSSSLLLJJJOOOPPPWWW\\\YYY\\\[[[[[[[[[^^^[[[WWW\\\\\\]]]```[[[\\\]]]YYY```dddaaa]]]bbbeee___cccjjjhhhiiieeepppkkkiiiooogggiiidddbbbaaabbbhhh___aaa^^^ddd```[[[aaa___```ZZZ\\\VVV\\\gggaaa[[[___aaabbb]]]bbb\\\\\\ZZZYYY[[[UUUVVVOOOXXXRRRMMMLLLNNNNNNKKKOOOUUUUUUPPPMMMJJJMMMGGG???DDDFFFLLLSSSEEEKKKQQQDDDCCCMMMWWWWWWPPPKKKKKKNNNRRRbbbcccZZZNNNNNNZZZEEEMMMHHHMMMLLLUUUEEEFFFAAAEEEEEEBBBAAA;;;;;;999666000...333...+++...222...%%%&&&((())))))&&&333000(((***%%%***111***'''+++&&&%%%'''++++++,,,+++&&&&&&$$$...111)))>>>(((&&&&&&###999,,,,,,***)))'''***)))///BBB,,,,,,111444999???CCC:::555DDD666<<<777DDDIIIRRREEEAAA===HHH>>>===AAA;;;999;;;777===999>>>999666888:::999666<<>>AAAAAAEEEQQQcccQQQQQQQQQ]]]TTTRRRUUUOOONNNMMMWWWKKKNNNUUUPPPHHHQQQOOORRROOOQQQeeeVVVOOOMMMNNNTTT[[[]]]WWWTTTYYY[[[\\\^^^XXX[[[[[[XXX\\\VVV[[[dddnnnggg```___hhh^^^___bbbeeebbbeeeeeemmmlllpppnnnjjjllljjjdddfffiiieeeddd___```]]]___```^^^dddeeeaaa```XXX\\\___]]]___aaa```___bbb___```]]]]]]WWW[[[VVVTTTWWW]]]SSSWWWSSSUUUSSSPPPNNNIIIJJJIIINNNHHHGGGKKKXXX@@@DDDEEEUUUHHHEEEHHHGGGIIIDDDDDDFFFSSSJJJNNNQQQQQQVVV___```SSSJJJXXXRRRLLLFFFIIIKKKHHHJJJFFFFFFEEEBBBDDDGGG999333777777555333333222+++///,,,***+++...(((+++)))///++++++(((888,,,)))&&&(((------,,,,,,+++&&&222111)))((('''%%%)))***'''$$$%%%((('''%%%%%%$$$333,,,'''+++222&&&444***---333++++++111===222666>>>222888IIISSSZZZ[[[dddBBBBBB999===<<<<<>>888:::555888999:::999:::888<<<>>>@@@???SSSFFFGGGIIIAAAMMMNNNFFFLLLDDDGGGHHHIIIQQQUUUVVVRRRNNNPPPfffUUUQQQUUUWWWPPPTTTKKKMMMMMMOOOIIIKKKNNNRRRSSSTTTQQQUUU[[[QQQSSSTTTVVVTTTZZZXXX[[[]]]___bbb[[[ZZZ]]]XXX\\\ZZZ^^^ddd```dddaaabbbgggaaaccccccdddlllyyyoookkkuuugggqqqhhhjjjjjjpppmmmmmmmmmjjjdddcccdddiiigggbbbbbbaaabbb___ccceee```ccc^^^```bbb]]]ZZZ___^^^___YYYXXXZZZVVVUUU\\\[[[VVVVVVUUUZZZWWWWWWSSSKKKRRROOONNNMMMKKKNNNGGGLLLGGGHHHJJJFFFGGGFFFDDD>>>GGGIIILLLQQQQQQSSSWWWWWWRRRRRRQQQJJJFFFIIIMMMQQQLLLDDDNNNIIIDDDMMMYYYDDDAAA===@@@;;;777???222333000HHH444444---******///+++(((******)))(((&&&)))***)))%%%%%%((('''***...///222>>>%%%***&&&%%%!!!000(((111333$$$%%%((((((&&&&&&)))---(((,,,///*********---111///777888666999@@@<<<===888;;;@@@bbbPPP:::FFF@@@===777CCCFFFSSS>>>>>>555888888OOOHHH333<<<666555666999:::>>>EEEHHHDDDHHH@@@EEEBBB>>>JJJJJJ===BBBGGGKKKMMMLLLEEEQQQQQQOOO___TTTZZZ___cccLLLKKKMMM[[[PPPKKKNNNIIINNNPPPNNNSSSSSSTTT[[[TTTXXXSSS\\\ZZZ[[[VVVfff^^^VVVcccbbbZZZaaadddZZZXXXjjjhhhccc```eeecccgggmmmeeelllppp|||yyyiiikkknnnpppmmmooosssmmmkkkkkkqqqkkkiiiccceeedddfffbbb]]]^^^```bbbeeegggbbbaaa^^^___\\\^^^ZZZZZZWWWXXXWWWZZZ[[[WWWSSSMMMWWWZZZYYYYYYYYYPPPTTTMMMPPPOOOMMMLLLKKKGGGLLLGGGMMMFFFCCCBBBDDDCCCHHHLLLLLLNNNNNNRRRPPPUUUPPPNNNLLLTTTSSSUUUqqqqqqUUUMMMGGGGGGAAAMMMHHHGGG???888555555333333666222333777111333+++***&&&,,,)))&&&'''$$$'''...(((+++((('''&&&******,,,//////***000&&&"""$$$%%%$$$%%%***+++$$$!!!###&&&''',,,###((((((<<<***'''***((((((---,,,???999777<<>>@@@777:::QQQ???;;;999444@@@888BBBOOOEEE>>>777777999;;;999555777777555555888555666===DDDTTTHHHAAAGGGIIIDDDEEEFFFVVVRRRHHHJJJYYYQQQHHHKKKUUUMMMOOOPPPOOOZZZTTTWWWTTTTTTSSSUUUOOOMMMOOOXXX```WWWTTTVVVXXXUUUVVVYYYVVVXXXVVV]]]```UUUWWWccclll___jjjVVV^^^lllXXX]]]```iiiccc``````bbbaaadddbbbmmmppp7:}}}ttttttmmmnnnmmmnnnkkkhhhfffooozzzvvvmmmiiikkkhhhkkkhhheee```ccciiidddeee^^^bbbccc^^^eee^^^]]]___ccc^^^bbbYYYXXXVVVRRRTTTVVVWWWYYYSSSWWW]]]RRRUUUXXXPPPKKKMMMKKKKKKPPPIIILLLNNNIIIAAAAAADDDHHHKKKJJJLLLNNNUUUWWWSSSOOOOOOTTTSSS\\\QQQZZZ~~~RRRaaaFFFDDDDDDCCCDDDCCCFFF@@@>>>444444555666@@@555444333444...)))444...(((---------///444333+++***'''***%%%))))))...///111444((('''+++CCC&&&&&&######"""((($$$%%%&&&444$$$+++***+++///)))'''(((%%%+++999<<<777333444111222333<<>>===???999888QQQ777333GGG666???666777555???;;;FFF>>><<<:::333777444999:::FFFFFFCCC@@@???<<>>{{{III:::333111<<<999EEEKKKBBB;;;???===<<<444888<<<888<<<777:::DDD999???;;;<<<<<>>>>>>>>;;;888222000...111000...333777///***///+++......111(((,,,,,,000,,,(((++++++000///---...:::,,,***...000%%%,,,(((&&&###%%%!!!%%%'''(((---,,,...''''''******111000///666333444333777===DDD@@@???>>>IIICCCXXXRRRAAA===???888AAA666QQQGGG<<<>>>999;;;555444===:::===BBBIII999FFFCCC;;;???@@@FFFQQQLLLIIIDDDFFFJJJXXX]]]FFFJJJMMMRRRLLLPPPQQQNNNMMMKKKLLLJJJOOOXXXPPPTTTUUUPPPMMMOOONNNVVVQQQOOOTTTQQQ___[[[UUUXXX```bbbgggfffVVV^^^dddaaaqqqttttttooo~~~#jjj^^^ZZZaaa___]]]ccclll{{{ ttt{{{wwwvvv|||vvv}}}pppsss~~~zzzxxxwwwpppyyywwwxxxpppnnnnnniiimmmyyygggjjjccciiihhhiiihhhnnnmmmoooeeeccckkk^^^XXXVVVcccYYYVVV^^^VVV```ZZZTTT]]]YYYUUUXXXOOOPPPJJJKKKOOOSSSRRRQQQTTTKKKHHHLLLPPPKKKPPPOOOKKKOOORRRRRRGGGHHHPPPRRRQQQUUUlllsss^^^YYYRRRIIIDDDPPPQQQJJJMMMDDD???CCC888BBB===333...---222444/////////+++//////000,,,---)))///***'''...(((******,,,)))***(((///,,,&&&///111***%%%***&&&$$$***!!!,,,...///,,,&&&((('''...,,,+++222,,,444888666999777HHHKKKNNNSSSNNNCCC\\\CCC@@@DDD999>>>BBB888>>>CCCEEEZZZEEE<<<;;;:::888999BBBDDD@@@>>>:::FFFJJJ@@@CCCDDDEEETTTLLLfffCCCEEEHHHSSS```QQQMMMGGGWWWVVVKKKLLLGGGLLLSSSRRRLLLLLLMMMMMMNNNMMMMMMKKKTTTRRRXXXUUUTTTQQQWWWVVVYYY\\\[[[^^^bbb]]]dddaaajjjdddeeeggghhhnnnyyy -eee\\\[[[\\\jjjjjjpppkkkyyy,|||vvvyyyuuurrr~~~ - {{{uuuxxxwwwsssppppppnnniiimmm rrrgggbbbffflllrrrppp aaahhhaaa\\\\\\^^^\\\VVVZZZ]]]___YYYYYY\\\XXXUUUPPPRRRRRRQQQNNNMMMXXXPPPQQQHHHhhh]]]TTTKKKMMMJJJPPPMMMQQQNNNKKKGGGJJJVVVVVVQQQ___yyycccWWWVVVMMMJJJPPPzzzOOODDDLLLLLLGGGAAA<<<;;;666333111777444000---...111,,,...555+++++++++...:::[[[777555+++***''''''///,,,(((+++///<<>><<>>;;;EEEBBB<<>>555111000***888...---))),,,222---///444888000---'''---***------...)))000'''...***+++''''''***///>>>***---&&&((('''&&&111(((+++***+++;;;333888;;;<<<===CCCEEEVVVUUUGGGLLLCCC:::<<<;;;999<<<@@@:::???VVV```SSS===>>>@@@LLLNNNEEE???BBB@@@EEEKKKGGGFFFHHHNNNLLLJJJKKKPPP```qqqHHHGGGKKKUUU[[[IIIIIIGGGGGGPPPOOOIIIHHHMMMEEEIIIBBBKKKOOOLLLRRRQQQLLLQQQSSSVVVWWWYYYWWWVVVSSSYYYZZZZZZnnn[[[pppccclll]]]dddYYY^^^```iiieeennnjjjnnnjjjiiiooogggppppppuuu||| ?' -|||www ~~~zzz(}}}uuutttllltttrrrxxx qqqnnnkkklllrrrlllnnnpppnnnlllmmmlllfffbbbaaa]]]ZZZ```UUUSSSfff___\\\UUUZZZWWWXXX___SSSPPPLLLZZZ___```^^^kkkhhhTTTSSSNNNOOOQQQ^^^RRROOONNNIIIIIIEEE[[[]]]cccuuuiiiaaagggYYYWWWOOOIIIBBBIIIEEEOOOBBBHHH===???BBB:::777444666222///---555777888---,,,222''')))+++...---555ZZZGGG777222---$$$***OOO333,,,///444'''///***)))+++555...444JJJ000///+++))))))+++...)))...666555<<>>>>>???<<>>DDDIIITTTIII@@@;;;555333444333222888444///---///,,,***)))(((///---+++...000888BBB666000***++++++AAAAAA777,,,,,,+++***%%%'''+++---***///)))---...///+++---***'''+++000888888DDDDDDKKKGGGWWW___aaalll5LsssTTTIII>>>:::@@@===;;;EEE===;;;HHHFFFQQQNNNjjjxxxuuu}}}sssQQQOOOOOOTTTXXXUUUWWWVVVUUUPPPjjjvvvLLLLLLLLL]]]ZZZPPPPPPHHHFFFLLLPPPIIIIIIPPPGGG>>>HHHHHHMMMGGGKKKJJJOOORRRXXXZZZVVV[[[cccZZZ\\\``````aaa]]]XXXZZZddd[[[eeeggguuuoooooohhhjjjeeehhhmmmqqqqqqpppvvvrrr ~~~~~~yyy{{{  9cP$}}}  zzzuuuqqqxxxpppxxxwwwsssxxxnnnpppnnnnnnwwwlllkkkiiijjjssshhheeehhhxxxhhhhhhfffddd```XXXJJJMMMaaaaaa```aaaXXXYYYVVV^^^]]]XXXaaa___llleee^^^]]]NNNIIIJJJGGGJJJMMMLLLMMMKKKVVVQQQWWW```___UUUXXXRRRUUUSSSTTTSSSPPPLLLCCC@@@JJJQQQBBB@@@III<<<::::::;;;666<<hhhEEEOOOAAABBBLLLHHH999???>>>???:::CCCBBBbbbqqqkkk}}} ppp\\\[[[YYY[[[```bbbWWWWWWbbb___MMMRRRMMMNNNJJJEEEJJJLLLMMMLLLLLLJJJRRRLLLHHHDDDMMMMMMNNNPPPMMMLLLRRRXXXZZZXXX^^^```aaabbbUUUWWWcccbbbddd```]]]jjj^^^fffllllllrrr{{{ttttttoooeeeooovvvooonnnsss qqq~~~ C2 'N;) wwwqqqpppqqq~~~|||yyy|||tttsssppppppssskkkmmmhhhkkkllltttsssiiinnnlllmmmkkkggghhhUUUMMMNNNTTTZZZWWW^^^]]]YYYWWWWWW___VVVaaacccwww[[[WWWWWWSSSOOODDDGGGNNNMMMPPPJJJNNNQQQPPP___gggWWWPPPJJJOOONNNSSSTTTKKKJJJHHHEEEHHHFFFNNNCCCAAABBB:::>>>>>>???777444000------))),,,888))))))///...GGG777===///,,,222///>>>...***000>>>,,,(((,,,000,,,***---(((,,,---666555555333333,,,+++666***000222888JJJMMMMMM]]]ZZZuuuQQQSSS[[[^^^vvvgggVVVBBBCCCAAABBB@@@CCCHHH===AAA<<>>IIIJJJ<<<@@@===;;;888444///...,,,000111000///...000***,,,888111333666...FFF999******ZZZ222)))///---777))),,,222:::---111...333***///,,,)))...666...666777JJJAAA999^^^TTTIIIUUUZZZ```SSSZZZ\\\eee???III>>><<<===>>>LLL<<<<<<@@@???;;;FFFggg9! 3 vvv{{{ gggTTTQQQSSS[[[SSSRRRLLLDDDGGGIIINNNOOORRRNNNQQQjjjrrrSSSLLLKKKQQQXXXSSSSSSSSSWWWRRRZZZ[[[WWW\\\```]]]\\\bbbfffeeecccmmmjjjkkkwwwrrr~~~ vvvsssuuu|||& - ! vvv # -  |||tttttt{{{wwwyyy}}}pppyyyvvvtttrrryyyrrrrrrooo|||sss{{{nnnkkksssmmmkkkoooiiikkk___ZZZ___]]]fff___]]]\\\bbbSSSWWW[[[SSS^^^nnn tttfffXXXGGGMMMJJJSSSRRRQQQSSSNNNWWWVVVRRRfffXXXUUUTTTSSSFFF@@@HHHMMMOOOTTTPPPYYYRRRKKKOOO???AAA@@@EEEPPPJJJAAAAAA:::888222,,,///,,,///---333000...///,,,000CCC111555FFF***,,,***)))...***111***'''...111...+++000---222'''++++++,,,***---******///+++CCCIII999CCCDDDNNNVVVbbbWWWJJJLLLLLL___RRRBBB???RRRGGGAAA::::::>>>CCC@@@>>>AAAFFFCCCKKKuuuAA05.$D|||]]]RRRTTTRRRFFFHHHKKKGGGOOOQQQOOOLLLPPPddd___www]]]```QQQMMMKKKQQQUUUPPPMMMTTTZZZNNNSSSbbbccc^^^``````wwwyyykkkffflllggg|||ssszzzyyyI53#www #   {{{|||      -wwwmmmzzzzzzxxx{{{~~~wwwvvvuuuqqqzzzzzzuuulllrrrrrrllljjjuuu{{{kkkccc______^^^]]]```WWWWWWZZZWWWVVVXXXVVVdddttt^^^VVVOOOSSSMMMLLLMMMPPPWWWUUUPPPXXXQQQVVVVVVlllggg^^^pppwwwJJJPPPOOOTTTKKKKKKLLLKKKGGGEEEJJJBBBSSSppp\\\<<<888888777666...---000222222111+++///...111222PPP555///888---***))),,,000///222,,,000222'''333000***---******///...++++++---000...///111666FFF:::999NNN???BBBOOOMMMIII555???@@@MMMHHHLLL===@@@>>>???<<<>>>;;;===@@@DDDAAACCCGGGgggNOA0/++:Kmmm^^^aaa\\\QQQNNNKKKHHHKKKGGGFFFGGGMMMLLLRRRaaaaaaOOOGGGGGGKKKIIIRRRPPPHHHPPPWWW^^^YYY]]]ZZZeeebbbeee```rrryyyvvvssszzznnn{{{qqq2#(+H0  -  }}}~~~}}}zzzuuu~~~}}}}}}|||zzzvvv|||vvvwwwooonnnmmmhhhooo|||pppccc^^^]]]YYY______^^^[[[SSS[[[oooeeeWWW[[[eee^^^SSSLLLJJJDDDLLLJJJJJJTTTUUUXXXQQQZZZ^^^\\\ZZZZZZUUU^^^ -rrrRRRNNNNNNRRRKKKSSSEEEGGGIIIEEECCC<<<>>>DDD777333888666;;;DDD;;;444,,,444000,,,...222,,,666>>>;;;>>>===555)))666333666777999777999:::...555555//////000,,,000------...,,,333CCC///222555@@@<<<777777:::\\\HHH<<<999???>>>===???999<<<======;;;@@@===999===AAA???AAAEEEJJJLLLkkk*T?>5->>:::===>>><<<777666444888JJJ===555===+++---111111444:::IIIEEEDDD>>>222,,,+++444DDD777444///666222000333000---++++++...///000...000......000222999@@@===@@@GGGGGG@@@>>>UUU666::::::FFF@@@999CCCBBBDDD999>>>:::999FFFDDD@@@BBB???EEEHHHKKKPPPsss'99\^WLYF=xxx\\\UUUOOONNNLLLLLLFFFIIIIIILLLTTTOOOQQQYYYSSSTTTQQQTTTQQQVVVSSSZZZ\\\[[[ZZZ```VVV___dddaaaiiilllzzzwwwmmmhhhooonnnppprrr{{{    #>>AAA555777555...,,,000---000<<>><<<===???BBBHHHNNNQQQiii4BgoMDK/ wwwdddYYYSSSVVVOOOJJJDDDKKKKKKGGGFFFEEEcccOOOTTTSSS```VVVUUUddd\\\^^^YYYccc^^^ddd^^^\\\eeebbb___bbbmmm|||ooonnnnnntttssswww}}}}}}yyy~~~ }}}~~~  ~~~ ~~~vvvuuuyyyyyy    -" ~~~  ~~~}}}ttt{{{~~~zzz|||tttqqqvvv~~~ yyymmmkkkkkk]]]aaaeeeaaaaaa```aaa]]][[[UUUlllggg\\\QQQVVVPPPPPPNNNSSSKKKKKKNNNNNNPPPOOOXXXTTTXXXYYY[[[```]]][[[hhhuuuXXXPPPKKKGGGDDD[[[JJJPPPCCC??????;;;;;;EEE666888444666<<<888333888000///999///>>>555>>>@@@ZZZ[[[999***///111888888333222+++555++++++***)))---...,,,+++///333555+++,,,222666///===MMMIIIAAACCCCCC<<<:::@@@CCCFFF;;;;;;JJJBBB:::999AAA999===>>>>>>;;;999@@@???EEEIIITTTeee-DCgz|mJNC+xxx______[[[SSSOOOLLLKKKKKKJJJIIIbbbbbbXXXVVV]]]ZZZ\\\ZZZ___ZZZXXXaaaiiiggg```eeennngggkkknnnwwwlllqqqnnn|||~~~  }}}  {{{rrrxxx uuu{{{}}}  -  xxx  -~~~ttt   ttt|||yyywwwrrrqqqkkkiiinnnlll^^^cccaaaggg]]]^^^WWWXXXZZZWWWVVVSSSSSSSSSLLLSSSPPPNNNNNNOOOTTTUUUmmm\\\aaaRRRSSSVVVTTTXXX]]]rrrcccOOOOOOQQQIIIbbbUUUFFF@@@CCCFFFEEE;;;777::::::999555000777===>>>>>>555333333===;;;JJJ:::aaa@@@DDD333,,,000888666<<<222///888'''+++((()))(((((())),,,)))---+++222///---;;;:::NNN]]]666BBB:::AAA777???IIIAAA===666555555999444>>>777<<<===999;;;;;;???:::@@@<< ~~~ ~~~ wwwtttvvvuuu~~~   -}}}  ooo}}}{{{  sssllliiitttiii```^^^eeeeeeaaafffWWWTTTWWWWWWYYYUUU]]][[[LLLIIIPPPLLLOOOKKKRRRVVV[[[RRRTTTUUUVVVZZZbbb\\\VVV```___[[[RRRMMMJJJGGGTTTJJJIIIAAA>>>FFF???>>>AAAYYY777777111888;;;<<>>888777555@@@QQQ888444999TTT===:::;;;======BBBJJJSSSQQQfffUOF\x{fC2ZZZYYYUUUSSSKKKKKKLLLNNNRRROOOMMMPPPPPP]]]RRRVVV___YYYXXXdddkkkgggccc^^^ddd""vvviiixxxmmmgggoooxxxqqqvvv; A"zzz{{{xxx |||uuuqqqyyy -~~~   xxx|||  {{{ -"}}}mmmmmm}}}hhh\\\gggggg___aaa^^^ZZZVVVWWWXXXWWWpppRRRQQQZZZHHHOOOQQQOOOOOOOOOUUUUUUSSSUUUYYYXXXccc[[[ZZZSSS___OOOBBBIIILLLKKKOOOFFFGGGEEEJJJIII<<>>===XXX:::555777777:::333222000222000:::SSS;;;777888FFF@@@333???AAA888;;;555333666666666,,,(((%%%%%%(((%%%%%%///---(((---000000///444222444<<<555666///<<<888888888777@@@999888888333MMM<<<333///888@@@888;;;444999999AAA===FFFMMMeee>5/8KrvOR'aaa___WWWKKKIIILLLNNNNNNNNN^^^QQQTTTRRRTTTVVV\\\___ooobbbbbbyyydddbbbZZZhhh  wwwuuusssmmmgggpppooohhhuuu   -xxxeeeooozzz|||wwwzzzzzzxxx   }}}  -wwwwww %' {{{rrriiipppjjjccckkkkkkfffffflll]]]YYY\\\[[[^^^TTTSSSWWWRRR[[[OOOOOOOOONNNLLLNNNOOOSSSSSSWWWZZZUUUlllgggaaaccccccHHHBBBHHHDDDEEEMMMCCCBBBJJJMMMGGGDDD<<>>AAA@@@999555999CCCGGG)))...$$$%%%)))$$$'''''' (((,,,+++222,,,222333555666555666888;;;HHH444666111000333333111000:::333+++333444666333666555<<<<<>>EEEWWWJJJKKKHHHuuuyyy "- ~~~]]]VVVPPPJJJPPPVVVTTTZZZ[[[bbb___```eeegggiiitttlllgggkkkmmmqqquuuiiizzzoooqqqsssllleeeeeemmmiiixxx -{{{|||yyy    -"tttqqq xxxzzz}}}wwwqqq|||rrriiiqqqppphhhhhhlllccccccbbbcccddd[[[YYY]]]VVVYYYXXXXXXUUUXXXOOOMMMLLLGGGMMMTTTZZZPPPLLLVVVXXX]]]eeeXXXaaajjjbbbnnnsssiii[[[PPPMMMIII???BBBNNNFFF???DDDFFFFFFDDDCCCKKK:::222444+++000<<<:::888777555999EEE]]]{{{\\\TTTaaaMMMHHH???888000---000555$$$$$$((($$$)))%%%''''''---+++))),,,***---000000///444333:::666666000111444333<<<000333666BBB888333222666444aaa===777777888???JJJJJJDDDDDDEEEggguuu\\\aaammmgggssslllcccddd\\\YYYSSSLLLJJJNNNMMMRRR[[[fff\\\]]]eeeoooffffffkkkkkkjjjkkklllfff\\\llltttkkkiiiiiisssaaakkkmmm{{{~~~|||}}}}}}||||||~~~xxxyyy"zzzttt  -  -% - uuu }}} -zzz{{{zzzttt~~~|||sssuuutttpppkkkkkkiii\\\eeefffggg```eee```ZZZZZZbbbcccYYYVVVVVVZZZPPPCCCGGGSSSXXXTTTXXXPPPNNNTTTVVV^^^hhhllliii\\\llleee\\\JJJAAAGGGDDD:::???LLLJJJWWWEEEFFF>>>;;;CCC;;;:::===111444444222999777:::777AAATTTnnn}}}QQQrrrnnnJJJ@@@===666<<<@@@@@@###$$$***---'''&&&***'''...///(((,,,333333111...666222888666999444???333//////......666222777000000///333;;;///:::777:::777QQQ___???DDD???XXX^^^NNNOOORRRYYY\\\YYYXXXYYY[[[aaa^^^gggNNNLLLLLLWWWQQQVVVYYYeeekkk___aaa```fff```llljjjgggdddiiigggpppgggrrrffflllmmmhhhgggkkkhhhzzzvvv}}}yyy}}}{{{{{{{{{ - - -       % pppnnnzzzuuurrrtttoooooosssrrrbbbfff^^^[[[nnnddddddfffccc^^^eeemmmmmmlll]]]fffTTTSSSXXXNNNXXXUUUVVVVVVVVVMMMYYYYYYUUUXXXnnn______cccqqquuuUUUWWWRRRIIIEEEPPPCCC>>>>>>AAA???HHH;;;@@@888??????666:::===666444222777@@@===IIITTTaaahhh[[[]]]zzzPPPAAA777;;;777;;;333!!!"""""""""...'''***+++///...///000555>>>555000333222444666222666///777///111000,,,444111///111333444555<<<888444999555WWWggg??????@@@GGGHHHGGGMMMJJJKKKUUUWWWSSS```iiinnnooommmbbbyyyWWWTTT[[[^^^UUUhhh___gggkkk___eeeZZZeeekkkhhhhhhiiigggcccgggiiilllkkklllnnneeegggjjjxxxrrrvvvzzz||||||}}}zzz{{{ - -  -   - - qqq $  -kkkpppqqqtttqqqlllzzznnndddiiiiiidddeeelllhhhdddiiihhhccc]]]___]]]___YYY^^^WWWTTTZZZYYY^^^ooo^^^SSSuuuMMMQQQSSS[[[^^^iiibbbhhhvvvwwwfffjjjTTTHHHGGGGGGGGGBBBDDDBBB@@@CCC===?????????<<<;;;999777;;;<<>>>>>444AAAAAAIIIHHH cccIII``````RRRGGGVVVNNNEEEBBB;;;***$$$&&&&&&$$$---+++)))(((***JJJeeeOOO===555===555333<<<333555888///222666///444111///...444///......333666333999===ZZZ^^^???>>>AAAEEECCCEEEGGGGGGJJJKKKWWWTTTZZZfffmmmxxx iii]]]vvviiiddd___ccc```bbbtttyyyoooeeejjjkkkmmmdddoookkkeeefffdddkkkmmmiiiaaa^^^^^^jjjccclll|||yyy|||rrrqqqzzzyyyxxx{{{xxx}}}~~~zzz yyy -      - - )qqqlllnnnuuupppnnnssslllccckkkfffbbbkkkfffdddeee______ZZZ^^^```\\\ZZZ[[[SSS\\\aaasss bbbYYYSSS[[[XXX___tttbbb___ccc"YYYUUUQQQIIIHHHHHHGGGDDDBBB;;;>>>HHH@@@===@@@@@@>>>888:::222@@@555:::TTT666555;;;EEESSSooobbbmmmhhhcccNNNPPPJJJ===777%%%!!!!!!###%%%)))...(((...///UUUiiiDDD>>><<<999666111...,,,...111//////555111...***222000555000000...777:::444999RRRLLL<<<<<>>DDDTTTZZZWWWTTTgggxxxxxx>uuucccgggfffssszzzppp{{{|||iiihhhjjjlllhhhmmmjjjooofff}}}fffaaadddaaa]]]tttjjjuuu vvvtttzzzxxx}}}yyy}}}}}}rrryyy~~~xxxwww -# "!#" $",   vvvttt|||{{{pppnnnlllwwwkkkgggnnnllldddhhhiiimmmdddbbbfffggggggeeeZZZ___bbb]]]pppkkk .#yyy___XXX^^^^^^fffaaaddd[[[aaaooogggJJJRRRQQQLLLBBBJJJCCCLLLRRR???>>>@@@???>>>FFFOOO:::===888666999666>>>888<<>>AAANNN\\\[[[___XXX```ooo pppuuubbbccciiilll~~~ 0- -xxxjjjoooiiinnnmmmdddeeejjjhhhmmmssswwwiiiqqquuu|||wwwtttooozzzuuuyyy}}}xxxwwwrrruuu{{{ -{{{}}} -~~~{{{www   !$$"&%()& "#%$ ||| - xxxmmmvvvyyyqqqmmmsssuuuiiiiiipppzzziiiiiieeepppdddmmmjjjgggpppWWW```lllhhhccciii~~~gggxxx[[[___bbbYYYaaallluuuccc^^^]]]KKKJJJ^^^PPPNNNPPPGGGGGGGGGBBBCCCAAA999BBBJJJ:::???;;;::::::999;;;777AAA:::111111999IIIQQQbbb;;;>>>@@@IIIAAAJJJTTTOOOHHHSSSZZZ@@@222'''!!!###"""&&&+++---+++555333000666;;;999444:::000///...333222888JJJ:::---...)))---000///111222999666666:::FFF@@@:::777???IIIAAA;;;:::CCCEEEJJJVVV\\\dddlll}}} xxxgggiiiuuupppqqq6U H@rrriiiqqqhhhmmmiiieeeppp ooossspppuuuuuuuuu{{{xxxvvvzzzzzzoooyyy}}}{{{~~~|||~~~xxx~~~qqq|||   - %%(++*)'%$*'%!%$   |||vvvkkkrrruuusssmmmkkkfffhhhnnnwww{{{mmmfffkkkmmmjjjrrrmmm___]]]TTTZZZaaaeeekkkjjjrrrrrrvvvhhh```XXXUUUOOO[[[UUURRR^^^```fff]]];;;OOObbbYYYPPPLLLFFFGGGCCCAAA;;;===;;;<<>>???FFF===LLLNNN... (((''')))---^^^'===333BBB>>>^^^555///,,,888777111---///...111+++***++++++,,,000,,,333333444444>>>777>>>===<<>>FFFLLLXXX^^^___pppxxx2)]]]lllkkkkkk ttt$,}}}WWWgggnnnfffeeedddsss({{{mmmnnn}}}yyymmmuuuzzzrrrxxx{{{{{{xxxrrrtttqqqxxx}}}yyy %&)**+,+**))&%#$  ooopppmmmqqqxxxxxxlllrrrffflllrrr|||qqqnnniiilllqqqrrruuurrrppp[[[fffcccaaaeeeeeegggjjjlllzzzmmmeee\\\OOOGGGOOOZZZmmmkkkeeedddNNNIIIRRRWWWTTTWWWPPPIIIGGGCCCDDD@@@BBB===<<<999>>>999>>>:::AAA@@@EEE@@@444;;;333CCCDDDDDD999999NNNVVV===:::???;;;888>>>666999AAA888111""")))'''%%%***///444___fff777>>>JJJ///---///555333000---444///...111111...111+++000+++---'''///...111777222000333<<<>>>:::===DDDBBBKKKAAAGGGMMMTTTWWWgggtttsssnnn5Reeepppmmm{{{uuulllxxxsssiiimmmhhhhhhffffffmmmzzz~~~*C<llljjjvvvxxx2wwwuuuttt}}}~~~ -xxxyyy~~~{{{ - ~~~{{{zzz - - "'*++,-...-,**'#$$ -  qqqvvvrrrwwwppplllrrruuuqqqjjjuuuuuulllpppooozzzpppqqquuu^^^kkk\\\cccVVV]]]ccc```cccjjjjjjggg```[[[HHHMMMTTTRRR```VVV[[[WWWRRRZZZPPPJJJMMMQQQNNNEEEIIIFFF@@@???AAA<<<<<<>>>???===???AAA>>>EEEFFF@@@AAADDD@@@DDD:::@@@OOODDD888JJJ777555555===111444111444***111:::###+++&&&(((111888DDDIII???;;;GGG555000JJJ333777JJJ888333)))000222666)))111......+++000...+++///222888111///000999<<<999999;;;>>>DDDHHHDDDWWWLLLXXXWWW___sssFSzzzfffyyylllfffaaahhhxxxiiigggiiisssuuummmhhhbbbgggmmm6N.qqqiiirrrzzz uuusss,' - mmmvvvvvvyyy~~~{{{zzz -  "%%*+-1001210//,(%"$" }}}xxxtttqqqpppwwwyyyxxxwwwjjjsssmmmqqqiii|||-"{{{qqqtttkkkkkkYYY```XXXXXX^^^^^^\\\lllfffQQQBBBFFFLLLQQQMMMPPPTTT^^^YYYXXXlllRRRKKKOOONNNNNNDDD===EEE>>>:::===999???CCC???===>>>BBB<<>>>>>>>>AAABBB>>>DDD<<<@@@DDDKKK999===BBB\\\HHHBBBCCCMMMIII;;;777<<<444444777===000///,,,---((()))''''''333;;;,,,111666777111444,,,111CCC111777000...,,,GGG===555000111...111---333---+++000888111555...222444///333:::===:::555BBB>>>LLLGGGEEEEEEJJJXXXOOOaaayyyiii___PPP```uuudddiiiiiikkknnndddbbbccc```kkksssccccccmmm^^^UUUSSSfffggguuuwwwooonnnhhhhhhyyyxxxsssssszzzttt -~~~2vvv{{{pppvvvwwwxxx~~~yyy~~~!#%(*--/3557675432/,('# !vvv~~~ yyyzzz~~~}}}uuutttzzztttvvvssslllkkknnnsssmmm|||tttooojjjjjjddd```aaaZZZ___dddqqqTTTRRRUUUNNNGGGFFFFFFBBBFFFMMMRRRVVVZZZZZZQQQPPPZZZZZZIIICCCCCCGGG???IIIIIIJJJMMMGGG???BBBIIICCCBBB;;;AAACCCFFF666;;;;;;DDDZZZ===:::???777999333555666<<<777000111,,,+++(((333***+++CCC***888333555...&&&,,,,,,))),,,///222777000+++888222,,,GGG000+++YYY---;;;...333333,,,///:::...111///111555222---555<<<;;;;;;<<>>:::888999888@@@DDD@@@666;;;OOO222---555333000333...000...***)))+++))),,,]]]888333555+++...(((000+++000,,,555***---333222EEEggg666666111111;;;///222666666333555///...---///222:::444///555>>>888:::<<<@@@HHHAAAJJJNNNKKKNNNJJJVVVTTTYYY\\\UUUaaaqqquuuyyyvvvlllmmmeee___eeeYYY___]]]sssfffbbb^^^gggxxxzzzhhhdddiiissskkkccciiiuuutttmmmgggjjjqqqtttqqqllluuurrrsssuuujjjxxx||||||yyyzzzwww|||~~~ - %'*--/5768:9:;:986652.,)("  -|||}}}|||{{{lllwww|||tttlllwwwssspppmmmnnnfffhhhjjjuuufffjjjiiilllbbbbbbccc^^^]]]WWW[[[kkkZZZSSSPPPLLLSSSMMMQQQWWWYYYUUUXXXVVVWWWbbbXXXPPPPPPPPPLLLNNNIIIJJJOOOJJJEEE@@@BBBBBB@@@AAAKKKBBBHHH???@@@<<<:::CCC222OOO===@@@>>>;;;555777,,,444666222//////000***===***,,,,,,'''***TTT111%%%$$$(((---...666//////,,,777;;;......888>>>000222888333AAA555DDD333111888,,,---...***...::://////555555888000>>><<<@@@CCCBBBHHHKKKLLLSSSPPPZZZTTTUUU[[[QQQLLLhhhkkkwwwggg[[[\\\\\\WWW[[[```bbbfff```nnnlllvvvpppnnnjjjqqqtttuuudddgggiiinnnhhhgggnnnnnnqqqeeehhhfffyyyiiixxx{{{uuu{{{xxxtttxxxzzzvvvyyy""*+./259:>>==<<>;6884.-,*& -  - www|||vvvjjjuuuooossshhhyyyrrr|||yyyiiifffhhhlllccccccooorrrxxxdddcccbbb]]]VVVUUUWWW```ZZZTTTQQQKKKNNNLLLMMMPPPQQQVVVZZZbbbWWWWWWOOO<<>>???>>>>>>]]]VVV:::AAA444444...///777222666///---+++,,,000)))%%%666222EEE---$$$%%%...///000111---555---999EEE555888KKK999444@@@444EEE777+++///;;;:::------111222,,,,,,---,,,777555;;;555CCCBBBDDD>>>JJJCCCGGGIIIJJJPPPXXXSSSQQQUUUUUULLL___^^^\\\vvvpppfffccc___```___XXXVVVaaa]]]]]]jjjiiieeejjjssseeellliiirrrcccmmmfffrrrnnnrrrrrrlllooogggccckkkkkksss{{{{{{sss|||zzzvvvppptttrrr "%'-0259<>>B@??@AA>;9342-,'&! -  ~~~}}}{{{zzz|||ssstttkkksssooosssooonnnqqqhhhgggmmmkkkaaammmjjjkkklllnnndddaaa\\\VVVXXXWWWUUUZZZPPPOOOPPPMMMRRRTTT```QQQOOOUUUXXX___eeePPPHHHKKKWWWFFFIIILLLIIIHHHJJJIIIDDDEEEIIIAAATTTFFFDDDFFF???BBB@@@777;;;JJJ>>>PPP>>>777111777<<<777333<<=953/,(&!   vvv|||xxxwwwxxxzzzuuuxxx~~~qqqrrrnnnkkkeeeaaammmggggggmmmiiiggg```UUUUUUWWWVVVVVVQQQeeeJJJVVVLLLQQQMMMRRRUUUTTTWWWPPP[[[ -___QQQLLLHHHNNNEEEIIIMMMLLLSSSCCCEEEFFFGGG>>>GGGWWWDDD^^^CCCDDD@@@888BBB999MMM:::WWW<<<===666000555333000888222,,,+++,,,...,,,///(((+++###"""$$$###888:::222((((((555---111,,,222>>>888999<<<444FFFMMMEEE444:::555222000000222---111+++...222000===555555888777CCC@@@@@@CCCHHHIIIGGGJJJMMMMMMOOOQQQXXXSSSRRRSSSLLLQQQ^^^ddd]]]___eee^^^gggXXXQQQYYYfffVVVXXX[[[fff]]]ccc]]]```sssbbbccceeemmmkkkgggqqqnnnhhhooo```cccmmmoooyyy{{{uuu}}}tttsss}}}~~~sssvvvxxx}}}~~~ ~~~ -  %(/457<>DFHJKKLLKIFECB?<74/,' |||{{{{{{~~~~~~yyy}}}ttt~~~{{{ pppqqqqqq{{{yyysssooopppooommmnnnnnnkkkaaaccc___oooMMMBBBFFFHHHOOONNNLLLOOO___OOOLLLKKKMMMKKKLLLQQQRRRPPPLLL>>>FFFOOOXXXWWWOOOJJJGGG@@@KKKGGGGGGLLLAAAIIILLLHHH???<<<888:::???BBBCCC@@@444DDDAAA999555666,,,+++''''''...++++++,,,,,,+++)))(((+++)))!!!''')))JJJ;;;%%%---///333@@@222222222444666555999ZZZJJJ333:::555...***,,,///---000222222666555777???@@@CCC@@@AAADDDFFFBBBFFFEEELLLWWW___ZZZUUUXXX[[[:Beeemmmmmmdddhhh___YYY\\\iii___]]]___fff[[[}}}dddWWW___aaaddd```___^^^___eeeiiiiiijjjhhhjjjkkkfffhhhpppsssssssss}}}uuutttwww -vvvtttwwwzzz{{{||| -%,138>>CEIKMOOOOPNLIGED@=741+&$&   ||||||~~~~~~~~~vvvsssuuu~~~{{{rrrwwwwww~~~vvvnnnjjjkkkssshhh```___ZZZPPPKKKRRRJJJEEEHHHKKKMMMUUUPPPUUULLLGGGOOOPPPQQQOOOOOOMMMHHH666GGGSSSZZZRRROOONNNLLLIIIJJJPPPWWWGGG???EEE;;;AAACCC???===NNN@@@FFFUUU777555777444444@@@222111000,,,111***)))''')))***&&&%%%,,,***$$$'''***---444CCC333,,,;;;<<>>EEEJJJ:::;;;555III...222333BBB...///---+++++++++000666333333;;;;;;IIIMMMDDD===GGG===AAABBBCCCIIINNNRRRWWWTTTSSSZZZ^^^gggxxxxxxrrrtttgggwww\\\[[[ZZZaaa\\\kkk]]]yyy___ZZZfff[[[lllaaaaaa]]]YYY```aaammmmmmooonnneeeiiinnnwwwrrrsssqqqsssooooooxxxyyyxxx}}}rrrwwwrrrxxx}}} -zzz!$*0127BCGKKOPSSTVTROMJHF@>:41.'&   -zzz{{{wwwrrrzzzzzz sssuuuxxxzzznnnjjjgggnnniiixxxllliii\\\UUUTTTSSSVVVRRRLLLRRRPPPLLLSSSKKKNNNFFFKKKMMMXXXNNNKKKNNNFFF===EEEPPPMMMPPPTTT]]]RRRMMMJJJHHHJJJaaaHHHCCCVVVXXXHHH===DDDCCCKKKAAAPPPBBB;;;999AAA444111111///000000111///)))&&&...)))$$$'''+++,,,&&&"""###'''666///222QQQ888777888LLLdddLLLAAABBB===???555444111???111777555---+++---,,,111666AAAPPPEEE===777<<<:::<<EGKNQSUXXZZWUSROMJB?:63-.,!! }}} -|||zzz~~~{{{yyyvvvyyy}}} ttt -mmmccckkkhhhsssmmmqqqdddbbb^^^VVVUUUWWWQQQUUULLLNNNLLLLLLMMMFFFEEEJJJRRRQQQQQQLLLTTTQQQLLLDDDWWWSSSUUUOOOTTTSSSLLLHHHHHHGGGHHHGGGLLLFFFOOOVVVAAA@@@FFFGGG@@@[[[FFF>>>:::888111777///111000,,,+++///...---,,,+++$$$***>>>+++--- !!!(((%%%,,,...---FFFMMMBBB222ZZZWWWjjjoooNNN555;;;555666111///,,,555===333------+++222555^^^III;;;888;;;:::;;;EEEDDDFFFKKKHHHKKKLLLTTTXXX]]]\\\``````bbbpppkkkooottthhhkkkaaabbbqqq```TTTVVVgggjjjfffoooaaagggooo^^^\\\aaa___ccccccdddaaafffoooqqqiiiyyyvvviiitttlllllltttyyyzzz.|||{{{xxxzzz}}}  !(-058=CGKNRVXZ]^]][ZXTROJEB=840.-"  ~~~yyy}}}zzzvvvyyyuuu - -rrrzzzxxxrrrtttlllfffjjjjjjlllllliiicccggg^^^ZZZVVVVVVRRRVVVSSSJJJJJJKKKKKKJJJUUUOOOQQQNNNOOOSSSTTTUUUSSSTTTUUUZZZWWW^^^TTTIIIIIIIIICCCAAA;;;===BBBFFFEEEAAAAAA???LLLYYY@@@LLLOOOFFFDDD999...111333222,,,...,,,---111777+++***---)))((('''777...!!!###''')))000&&&---FFFfff777444DDDPPPFFFHHH<<<999555555111000,,,111,,,888---000///,,,<<>>SSSKKKCCCHHHHHHVVVVVVttttttBA  -jjjhhhjjjYYY[[[YYYYYYSSSOOOPPPZZZWWWVVVWWWUUUVVVVVVWWW___\\\\\\VVVddd___WWW\\\cccwwwjjjsssuuusssccciiiqqqllloooqqquuuvvvzzz{{{jjjpppbbblll|||}}}   %+04;AFLPTZ^aegijjihfc^YTQLGA;72-)%! }}}|||tttwwwxxxxxxxxx|||zzzqqqyyyxxxqqqssshhhkkkjjj}}}7/mmmiii```]]][[[\\\VVVTTTPPPRRRSSSTTTPPPHHHKKKMMMHHHKKKIIIKKKUUUSSSVVVPPPPPPLLL[[[WWW___SSSPPPJJJHHHLLLNNNGGGHHH??????BBB>>>>>>===RRRCCCOOOJJJHHHNNNEEEHHH>>>@@@666111333...888888,,,222***+++)))######'''---%%%222''')))(((---444,,,111NNNBBB333BBBDDDEEE<<<888===>>>222999444333111,,,+++)))777//////,,,---555>>><<CINSX\`ehkmmnnliea\WRMHB=53-)! - -zzzzzz}}}yyyooouuuzzz|||xxxnnn~~~yyy}}}lllfffkkkeeelllvvvooogggaaadddZZZYYYYYYUUUTTTTTT[[[VVVNNNIIIKKKYYYLLLKKKLLLKKKIIIOOOUUUTTTQQQGGG]]]RRRUUU[[[PPPTTTKKKJJJGGGFFFAAAEEEHHHHHH@@@AAA???CCCCCC>>>QQQKKKXXXcccNNNAAA999:::///,,,+++444:::888333***444+++)))&&&+++,,,&&&%%%+++***(((***333///===;;;PPPIIIAAA999III999===AAA999...222000---///---+++(((///+++111///222555999>>>KKKDDD;;;;;;FFFEEEHHHNNN[[[TTTYYYhhh .zzz}}}tttkkkccc\\\XXXTTTUUUPPPQQQNNNZZZWWW___]]]jjjyyyVVV[[[ZZZ\\\\\\YYYUUU___WWWbbbkkkjjjuuummmhhhhhhlllrrrqqqkkknnnzzzooonnnrrr|||}}}}}}sss{{{uuuzzz}}} - - %*-2:?DINTZ_cgknppponieb]XSNHB<72-*#  uuu~~~zzzvvvyyyppprrr{{{mmmpppwwwvvvtttggghhhooommmwwwllljjjgggddddddddd^^^bbbWWW[[[SSSOOONNNIIILLLRRRNNNLLLLLLHHHHHHNNNOOONNNTTTJJJJJJ___TTTTTTOOOWWWQQQJJJGGGEEEEEE@@@FFFCCC@@@BBB@@@;;;CCCUUU555BBBJJJfff@ OOO888888222...111333222<<>>???<<74.(#! www|||ttt~~~yyyuuu{{{{{{}}}}}}vvvpppuuuhhhhhhsssxxxtttjjjiiiaaafffgggttthhh```___WWWLLLQQQQQQSSSTTTOOONNNJJJBBB>>>JJJPPPOOOOOONNNPPPPPPVVVUUUWWWRRRMMMQQQLLLJJJHHHBBBAAA@@@NNNNNNYYYEEEAAAAAAGGGBBB666OOOXXX EEE@@@---666000888///---222111***'''(((((((((&&&(((444:::+++222---111222111FFF___UUUHHH999444,,,>>>AAA666333...///---+++***///...---CCC+++***333333444666999;;;AAA>>>===JJJAAAPPPNNNYYYkkk YYYddd{{{yyy]]]YYY]]]TTTaaajjj[[[ZZZXXXXXXUUUgggWWW]]]XXX^^^WWWggg[[[ccc\\\ZZZZZZWWWYYY```bbbXXX```lllrrr~~~eeelllppprrrmmmpppqqqrrrqqq|||rrrvvvwwwzzzzzzzzz|||  "'+.6;AGKQV[bfjnsy{uqomhc^ZSLHD@:4,(#  -~~~xxxvvvwwwxxxvvvsssxxx~~~|||xxxxxxtttrrriiihhhyyyvvvgggbbbiiihhhvvvlll[[[^^^\\\QQQJJJLLL]]]MMMLLLOOOIII<<>>;;;777333222///999000000,,,---,,,,,,(((666666CCC777:::777@@@===EEECCCCCCDDDQQQzzz#eeeqqqyyy{{{YYYPPPmmm\\\ZZZaaa```YYYYYYXXXZZZ\\\VVVXXX^^^XXXhhhSSSUUUiii___VVVbbbdddbbbccc___\\\sssuuuyyycccRRRkkkgggrrrooojjjlllsss{{{{{{pppsssvvvyyyxxxwww  %(+07<@GLQW\aekosx{vqolgb^YSMHD?:3,)# }}}zzzwwwtttwwwyyyrrrzzzwwwzzz -|||uuuvvvxxxsssqqq}}}rrrkkkllljjjhhhhhhooobbbXXXYYY\\\MMMJJJGGGQQQEEELLLMMMNNNHHHMMMOOONNNQQQTTTNNNHHHKKKVVVTTTRRRYYYJJJLLLHHHKKKJJJFFFFFFDDDAAAFFFCCCDDDYYYoooCCCDDDHHHKKKGGGHHHAAA;;;333444666000222---///,,,(((***---+++%%%"""$$$&&&###+++%%%+++555777777@@@===999OOO===333666EEE444222<<<222)));;;JJJ444...(((***'''++++++---222CCC>>>;;;:::<<<]]]QQQEEEHHH@@@DDD]]]9lllooohhhlll\\\]]]YYY___[[[TTT___aaa]]]SSSYYYXXXTTTcccXXX^^^```bbbSSS\\\ZZZXXX[[[```jjjgggwwweeeeeekkknnnxxxmmmrrrlllfffgggiiisssnnnmmmhhhoooxxxvvv{{{lllmmmttt{{{{{{zzz - - $(+6=>>666BBB888RRR___YYYUUUAAAPPPIIIVVVgggiiivvvhhh]]]PPPPPP___]]][[[___mmmXXX]]]ZZZ___pppsss___WWW[[[]]][[[ZZZ```[[[[[[^^^cccdddeeehhhgggggg\\\fffsssmmmjjjjjjfff```kkklllnnnlllooopppyyyzzz|||{{{kkknnnuuu{{{}}}}}} - -!!'-19=BGMRX[beimpqrrnkic^ZVPKD@:70'%! yyy{{{uuuxxx}}}zzzwww||| ~~~ '>yyynnnmmmooowwwrrrjjjaaaaaa[[[^^^ZZZWWWKKKNNNQQQOOOXXXKKKFFFHHHWWW\\\mmmkkkTTTKKKSSS^^^DDDOOOKKKTTTeeennnMMMIIIIIINNNNNNSSSFFFAAAFFFMMMIIIJJJEEEGGGDDD@@@III>>>DDDFFFMMMAAA:::555111000...///)))+++,,,---+++######$$$"""!!!"""%%%%%%:::333kkkTTTccceee>>>YYYDDD:::999777333555111(((111CCC555>>>BBB+++(((&&&(((,,,555HHHRRRMMM@@@FFFBBB<<93/($! }}}uuuzzz}}}tttooo{{{ vvv~~~ - GH7rrrsssdddjjjiiieee___WWW[[[VVVUUUXXXOOOLLLNNNTTTRRRQQQOOOKKKSSSTTT[[[QQQIIINNNUUUzzzSSSQQQUUUSSSYYYYYYLLLMMMWWWQQQHHHNNNFFFFFFCCCEEEFFFCCCFFFLLLOOO]]]JJJbbbXXXPPPeee;;;888///111999///,,,((()))+++(((((($$$### %%%'''%%%111...777ggg%{{{PPPDDD;;;111333>>>;;;000...///333,,,222777+++333,,,((()))...000777JJJAAAGGGdddxxxLLLOOOQQQBBBGGGJJJVVVSSSYYY^^^XXXggg-R bbb\\\bbb]]]pppiiiaaaQQQSSS]]]lllrrrppptttZZZSSSUUURRRUUU```aaaVVV___iiifffggg^^^bbbpppwwwnnnkkkvvvjjjiiiooolllqqqpppoooiiinnnmmmrrrlllooo~~~   "(*27=>DKPUY^adgillkgeb^YTPMHA:62.(! - wwwxxxwwwzzzvvvuuuzzz|||zzzzzz <(}}}uuummmllljjj______^^^VVV]]]QQQUUULLLSSSOOONNNKKKJJJJJJOOOKKKPPPLLLUUUSSSRRRLLLXXXRRRTTTXXXYYY[[[___NNNLLLIIIFFFJJJGGGJJJAAACCCJJJQQQJJJ]]]fffJJJKKKJJJHHH___mmm888111...000+++,,,///...'''***$$$,,,&&&"""%%%((('''"""'''<<<<<<888KKKpppHHH444666888222555444888000......999---000//////,,,---)))<<:5/,%" |||~~~{{{vvvsss{{{~~~ -zzzyyywwwmmmmmmwww~~~~~~hhhlll```aaa[[[WWWOOOLLLMMMIIIEEEFFFNNNFFFFFFIIIIIIHHHGGGIIIOOOUUURRRRRRLLLOOOVVVSSSWWWSSSWWWSSSIIIDDDLLLSSSEEE???CCCBBBKKKsss___uuuPPPiiiIIIIIIPPP___kkkbbbHHH222,,,******'''&&&---&&&)))&&&%%%######%%% %%%!!!FFF;;;>>>KKK>>>555222777,,,,,,...777///555222000888222333999333000000(((555666///DDD JJJNNNKKKJJJNNNIIIFFFNNNLLLTTTSSSddddddmmmyyymmmfffZZZZZZSSS^^^dddfff\\\```___qqq[[[WWWWWWYYYSSSVVVXXXQQQSSSZZZ]]]bbbUUU___YYYdddllltttxxxwwwyyy~~~{{{tttooovvvpppsssmmmsssjjjppp|||xxxbbb -  !(/5;?DHMQTX[]bbacb^_\WROJD@;72-*# {{{ zzznnnwwwwwwzzz{{{|||~~~|||nnnkkkooowww{{{tttwwwsssqqqpppiiiccckkkXXX\\\PPPLLLKKKJJJKKKDDDLLLGGGJJJJJJFFFEEEDDDIIIQQQVVVTTTUUUXXXTTTRRRbbbUUUXXXgggRRRJJJIIILLLEEEEEEBBBCCCKKKTTT}}}nnnZZZMMMAAAMMM{{{OOOhhhZZZVVVBBB222+++%%%&&&(((###)))///***%%%&&&(((%%%$$$###((('''%%%!!!===AAA<<<;;;333,,,222,,,---+++---333...333777===777///333111<<<666:::---,,,...444<<CFJORVXY\^^_\ZZWSOKGB<84-+#!   "(sssxxxyyyvvv~~~zzzxxxvvvmmmkkkpppwww~~~ mmmbbb___ddd\\\ZZZ[[[YYYXXXOOO\\\NNNEEEJJJCCCEEEHHHEEEEEEOOONNNOOOMMMRRRMMM\\\\\\ZZZYYYUUUUUU\\\KKKMMMLLLIIICCCDDDHHHFFFNNNJJJEEEMMMMMMGGGDDDPPPvvv;;;<<<;;;JJJ888333222+++'''+++...***)))***%%%""")))$$$(((777(((&&&,,,&&&OOO777333000777444///222,,,+++...---(((222777AAA===222:::555555444111///,,,***---666888333999JJJFFFHHHTTT???@@@TTTYYYMMMQQQ^^^```ZZZ\\\^^^^^^WWWUUUVVVUUUSSShhhLLLZZZdddfffttt!(#pppiiiqqqVVVSSSQQQYYYPPPRRR[[[TTTaaa```___nnnuuu1yyyssseeeiiizzzxxxrrrrrrnnnkkksssfffttt}}}www}}}}}}|||  $%/06>>GGGGGGNNNFFF???<<<:::888@@@444777BBB222555...888,,,,,,---***(((!!!'''###&&&,,,###&&&&&& PPP[[[333999777000+++///000///...***---555777...666111///000,,,)))333000---777666;;;222777;;;EEEAAA999LLLEEEVVVEEEIIIOOOPPPNNNWWWbbbYYYfff^^^\\\WWWTTTjjjSSSPPPXXXhhhcccfffooo,dddgggiiiccc\\\UUURRRWWWZZZWWWVVV\\\]]]xxxeeeiiijjj```ooohhhiiihhhaaaoooqqqnnnkkkhhhooosssooovvvooovvv{{{~~~}}}|||zzz~~~  ")0/3:>DFIKOQTTSSTURPMJGC?=85-)'# -yyy{{{{{{~~~~~~~~~zzzwwwzzzssstttkkknnnsssiiiuuuwwwnnnqqqllldddaaa```VVV]]]VVVOOOFFFIIIHHHMMMIIIIIIBBBEEEYYYMMMDDDPPPVVVZZZWWWXXXbbbXXXWWWPPPSSSYYYUUUXXXNNNDDDFFFGGGAAABBB;;;KKKEEEAAABBBDDDIIIYYYFFFBBB===???222<<<>>>>>>888111++++++'''+++111+++(((333"""###"""### %%%%%%:::;;;@@@:::111---111000111,,,666///111///222...111555444(((%%%000///888222999AAAhhhDDDDDD???===LLL<<>>GGG@@@EEENNN[[[lllJJJ???444bbbHHH000666888000555111((((((,,,''''''******%%%!!!%%% &&&!!!%%%"""111555AAADDD999444333000BBB///111444,,,''',,,...///---(((&&&***...555666===666PPPeeeDDD===???<<<:::>>>@@@>>>BBBDDDCCCFFFTTTUUUOOOMMMIIIKKKOOOXXXdddSSSYYYRRRWWWkkkYYYgggaaaGGGIIISSSSSS[[[___]]]^^^ZZZbbbPPPQQQ]]][[[\\\```[[[kkk[[[bbbZZZ___```fffbbb{{{rrrsssooonnnlllggghhhqqqoookkkttt}}}vvvvvvyyy - - "%)//7;?@CEHHIJLLKJHDEB?<84/)(&  - }}}vvv|||ooowww}}}}}}}}}zzz|||uuuooopppmmmttt{{{pppjjjhhhhhh______[[[WWW```UUUMMMPPPKKKMMMPPPUUUIIILLLLLLRRRVVVUUUXXXQQQYYYZZZ[[[^^^aaa]]][[[XXXXXXSSSlllsssIIICCCCCCBBBEEE@@@CCCPPP;;;@@@777>>>XXXFFFCCC222555555222...111***+++,,,,,,***************%%%&&& ###$$$000(((""" 777;;;KKK111000222,,,000222000222222000+++111777666$$$)))(((,,,...///999>>>jjj)!DDD<<<:::666999555777:::BBBCCCKKKHHHSSSIIIVVVPPPQQQ^^^rrrccciiiXXXRRRWWWZZZcccbbblllfffkkkvvvVVV]]]\\\bbbYYYWWWSSSWWWTTTUUUSSSPPPOOOOOO[[[ddd___XXX]]]YYY___bbbjjjzzzyyyooojjjkkkiiizzztttpppyyy{{{yyyvvv}}}  %*0237=>ACDFGHHFFEEBA?<:4/,,'# uuuuuurrrzzzzzzyyy~~~~~~~~~{{{www vvvkkkwwwnnnooovvviiiiiihhh```\\\YYY\\\WWWZZZuuuRRRKKKGGGGGGLLLNNNTTTTTTTTTRRRPPPUUUVVVTTTWWWXXXVVV[[[WWWYYYOOOAAABBBKKK]]]___UUUHHHEEEEEE???AAACCC<<<:751,)&! zzzzzzyyyxxxvvvxxxyyyyyyyyy xxxuuuqqqlllwwwyyyppphhhfffgggggg]]]___fff```pppUUUIIIJJJIIIJJJOOO^^^QQQNNNOOOTTTWWWXXX^^^[[[ZZZ___ZZZYYY```SSSJJJNNNPPPKKKPPPQQQKKKHHHAAAFFFEEEEEEBBBBBB:::===<<<===999222333666222000///,,,///222000,,,((()))%%%***'''...---***$$$&&&$$$######%%%pppPPP444333>>>???***(((***ZZZ===,,,...;;;&&&&&&'''888888)))------000111BBBkkk~~~GGG<<<333555333444999:::;;;===IIIKKKLLLFFFKKKKKKQQQYYYRRRPPPSSSTTTXXXQQQaaa```aaafffiii^^^bbbWWWUUUYYYUUUMMMQQQ\\\RRRPPPSSS^^^YYY___ZZZcccZZZ\\\XXXUUUggg___^^^eeevvvoooiiinnnrrrmmmfff|||uuu{{{{{{{{{~~~||| &$**-156:<=??@?>>A>=:7430-)(%" -yyy~~~zzzzzzuuurrrxxx -uuurrrwwwuuusssqqqnnnssslllgggfffiiiaaa___qqq```YYYZZZQQQPPPJJJHHHKKKUUU\\\QQQXXXQQQUUUccc[[[]]]bbbTTTUUUSSSWWWUUUSSSOOOPPPMMMPPPPPPDDDLLLCCC>>>===UUUPPP@@@888======444222333444222111,,,((()))*********---(((&&&###&&&'''...999///+++---$$$###%%%!!!;;;777111444,,,...))))))+++QQQ999000,,,000,,,'''888000(((...---222:::777666BBBIIIEEE;;;111555888666666:::<<<===EEEBBBJJJGGGJJJSSS\\\[[[MMMRRROOOJJJRRRTTTSSS^^^[[[]]]YYY___WWWKKKNNNVVVWWWLLLNNNZZZPPPVVVaaaRRROOOPPPRRRVVV___ZZZZZZVVVQQQ[[[eee___```iiivvvqqqooo -lllddd~~~pppwww|||}}}||| -  &*-.246:;====<<<:752/0-*(#"  wwwyyyzzz|||{{{www}}} vvv|||~~~ zzzuuusssuuuvvvqqqmmmmmmiiijjj^^^mmmtttlll```___^^^SSSOOOIIIDDDEEEQQQPPPSSSUUUXXXYYYZZZ[[[VVVXXXWWWRRR^^^WWWOOONNNSSSTTTMMMLLLNNNNNNHHHGGGSSSOOOFFFFFF>>>>>>444222222000111111666---,,,))),,,***---(((,,,+++222&&&$$$$$$###$$$$$$%%%000KKK...''''''...###999000444000...333+++///&&&(((%%%(((******555000111---******'''777222;;;444;;;666;;;444555111888555999===MMM???EEERRRJJJAAAOOOOOOYYYOOOHHHNNNKKKIIITTTTTTYYYXXXUUURRRZZZaaa^^^\\\dddsss\\\LLLPPPNNNPPPTTTPPPQQQUUU___ZZZVVVWWWUUU[[[sssZZZZZZ___cccfffkkkwww -xxx||||||{{{www ~~~yyyzzz    !&+-04478::9:977641/-,+&#   ~~~yyy}}}~~~zzz yyy~~~rrrtttqqqssswww{{{~~~uuupppoooggghhhkkkkkkkkk[[[YYY[[[\\\PPPLLLKKKLLLHHHMMMLLLZZZJJJdddVVVSSSQQQOOORRRYYYUUUUUUWWWQQQRRRMMMNNNLLLQQQLLLJJJFFFJJJDDDSSSAAA===777444444<<<<<>>:::---++++++...+++((($$$,,,***222111555444222++++++111---((()))000222111444---000999777AAA:::888???>>>QQQFFFWWW\\\LLLIIICCCIIIMMMEEEIIIVVVQQQUUUOOOWWWZZZ]]][[[XXX```YYYUUUqqqpppTTTSSSRRRTTTLLLMMMSSSWWWQQQ\\\NNN\\\XXXqqqggg]]]]]]\\\```]]]^^^mmmvvvzzz www~~~   $)*03367888765431.+**(!    - ~~~|||~~~{{{~~~}}} xxxrrrnnnrrrtttqqqnnn{{{}}}jjjfffoooyyyfffaaa___eeekkkaaafffTTTMMMOOOQQQMMMMMMVVVWWWQQQRRRRRRRRRTTTSSSSSSYYYWWWVVVfffQQQgggTTTTTTMMMQQQNNNJJJSSSOOOKKKJJJDDD:::;;;999777333222...222***---111+++......,,,$$$(((+++'''***###333%%%((()))((("""111(((((('''"""+++222444000222,,,---000******&&&))),,,---222)))---555444333BBB000---+++((())),,,222...,,,666666NNN333555BBBEEEHHHZZZOOOWWWpppVVVWWWDDDJJJSSSMMMTTTPPPLLLSSSUUUPPPOOOWWWTTTaaa```cccfff```VVVVVVSSSSSSLLLXXXLLLRRRYYY___VVVRRRRRRiiiYYY___^^^^^^]]]aaaccclllpppzzz/$}}}   "&*-0243565357410))&$"  }}} vvvvvvzzz~~~sssxxxzzzmmmlllnnnpppuuuvvvqqqlllnnnnnnwwwkkkfffYYY___aaa___YYYSSSUUUSSSSSSSSSUUUWWWXXXSSSMMMVVVSSSWWWWWWTTTQQQTTTKKKZZZZZZYYYWWWPPPNNNMMMNNNLLLFFFKKKIIIDDDEEECCC>>>???666222222666111+++000...///(((***&&&%%%&&&(((+++'''&&&***,,,***,,,&&&%%%...&&&'''###DDD"""555222444//////444***///)))---(((111///+++---444000222CCCRRR666((()))%%%))),,,222,,,//////---000444666:::FFFKKKEEEQQQWWWSSSXXXOOORRRRRRMMMPPPQQQRRRPPPIIITTT[[[RRRKKKTTTUUUaaa]]]hhh^^^PPPaaaQQQHHHRRRIIIHHHRRRVVVYYYQQQZZZ___PPP]]]aaaeee^^^[[[XXXaaaaaappplllwww%,() ~~~zzz~~~   !#(-,.122211331,+'&"  vvvyyy }}}zzz{{{|||pppssssssuuurrrppprrryyyzzzooossstttqqqhhheeeggg^^^WWW]]]bbb^^^SSSPPPQQQSSSZZZVVVooo|||NNNQQQZZZVVVUUUUUUWWWSSS___UUU[[[ZZZiiiXXXTTTSSSPPPLLLKKKDDDDDDJJJNNNHHH<<<;;;===...000>>>666777+++***---+++&&&%%%***'''&&&)))(((''')))###,,,++++++''')))(((***===000***&&&)))+++******)));;;***777///,,,,,,888444666======)))...PPPQQQ444+++"""'''...***---666999//////222777???CCCKKKPPPpppjjjMMMYYYhhhSSS^^^kkkkkkUUUXXXTTTQQQJJJ[[[bbbRRRPPPYYYKKKTTTLLL]]]LLL[[[MMMKKKGGGJJJNNNMMMTTTXXXSSSXXX]]]WWWUUU___```TTT```^^^YYYddddddnnnooo|||9EQ<&  }}}~~~xxx {{{ -!"&))+../0.-/0/**-&"  -|||~~~ - ~~~yyyxxx{{{uuusssppplllmmmxxxqqq}}}llloootttsssjjjaaaiii\\\RRRXXXLLLXXXMMMSSSMMMSSSiiiTTTTTTUUUTTTWWWTTTYYY]]]VVVVVV]]]UUUXXXPPPMMMWWWZZZ]]]QQQMMMbbbDDDGGGCCCEEECCC<<<555KKK777777;;;:::...+++(((---***)))***222***(((+++&&&(((###000+++---'''))))))((()))&&&)))...""" !!!111,,,***---///+++???666---===uuu:::---444999111)))...444,,,222$$$...111...---///666000555777000QQQBBBIIINNNqqqfffUUUtttuuuccc___bbbcccXXXddd^^^GGGMMMPPPJJJcccZZZQQQTTTLLLOOOPPPNNNFFFCCCHHHIIIOOONNNZZZaaaTTTUUU\\\aaaWWW^^^hhhddd]]]ZZZ]]]___cccpppiiimmmyyy ;s{X# }}}~~~xxx||| ~~~ !"$%')+-0/,+()%%"# #  {{{yyyuuu{{{xxxxxxrrrnnnmmmsss}}}vvvttt{{{~~~cccaaaaaaYYYQQQLLLNNNPPPQQQSSSVVVUUU\\\TTTRRRdddZZZ```VVVppp^^^RRRXXX]]]WWWTTT^^^PPP^^^{{{eee]]]^^^LLLCCCTTTDDDEEE;;;EEE===WWWCCC<<<333777///&&&)))(((+++...000((((((((('''222***444:::***)))...///...888333,,,&&&---###)))DDD000+++,,,///))))))------...111333,,,---777555)))(((---$$$***333,,,,,,666666***CCC---,,,,,,===;;;??????HHHOOONNNIIIVVVrrrYYY]]]SSS^^^aaajjjxxxOOOTTTIIIJJJNNNDDD___KKKRRRNNNTTTHHHFFFNNNKKKMMMIIIMMMsss\\\YYYZZZMMMSSSRRRVVVYYY[[[___aaaYYY\\\]]]fffiiilllrrr0mwU"yyy|||  !#$(**0-*)&'!" %$ -}}}||| -~~~~~~vvvuuuyyyxxxrrrkkksssxxx yyyppp{{{fff^^^ccc[[[MMMWWWJJJPPPWWW\\\WWWXXXVVVSSSUUU]]]PPP\\\XXXSSSTTTQQQWWW\\\]]]___PPPQQQWWWhhhsss```VVVYYYdddUUUDDDJJJLLLGGG===<<<888888CCC222666,,,+++...+++---***'''******)))000888111<<<000333111333999PPPMMM:::000000)))***333---,,,,,,***000---===000111666,,,+++%%%&&&,,,+++###...(((---777222)))---...111777000***000777JJJFFFDDDYYY^^^XXXQQQkkk{{{uuudddWWWYYY]]][[[TTTaaaUUUFFFPPPLLLSSSXXXJJJOOOPPPHHHEEEGGGDDDGGGQQQMMMDDDOOOYYYTTTVVVNNNOOOPPPYYY\\\WWW___fffmmmccceeetttkkklllsss -:?OC -{{{ yyyzzz !"!%%(,*)'''&%  -}}}}}}vvv{{{vvvoooyyynnnqqq|||{{{wwwppptttwww\\\ZZZRRROOOPPPSSSYYYSSSMMMLLLOOOXXXYYYRRRRRRSSSZZZ\\\WWWQQQVVV___ccc^^^XXX\\\^^^ fffXXXjjj^^^QQQFFFAAAEEE===999666;;;777444000...,,,---$$$***---000333111444///%%%,,,+++***111000@@@AAA+++888>>>777555(((444222666000(((***///555---(((///000000...444###%%%&&&''')))***111...---111+++...000...///>>>111333111<<<<<>><<<111666444...777444'''***---...///...+++***,,,...,,,,,,---(((III333777333///999LLLHHH888666>>>999222111---***---'''+++)))(((///,,,222%%%''''''***)))((()))+++000...222///,,,+++...//////:::666777BBB===777BBBRRRbbbnnn3h3\\\PPPUUU[[[VVVHHHFFFKKKKKKHHHPPPKKKJJJDDDFFFFFFMMMEEEEEEFFFDDDDDDHHH>>>GGGPPPPPP^^^SSSOOOPPPRRRRRRRRRUUUYYY]]]hhhfffkkkiiigggkkk, -yyy{{{yyyvvvxxx}}}}}}  - - ! #%&!"!   - ~~~ yyyhhhmmmmmmtttllltttrrruuu -.)~~~nnneeeddd___^^^OOOJJJOOOVVV^^^KKKTTTOOOSSSQQQJJJPPPRRRSSSNNNZZZ___eee___WWW\\\RRRTTT^^^ZZZ\\\___IIIFFFSSSDDDAAA???<<>>OOOcccWVVVPPPPPPTTTKKK\\\GGG@@@KKKCCCEEEIIIJJJ@@@HHHNNNUUUOOOLLLHHHGGGHHHSSSEEEDDDGGGGGGHHHPPPUUURRRLLLLLLTTTXXXOOOUUUYYY^^^aaaSSSgggxxxxxx|||qqqzzz||| tttmmm|||mmmjjjyyy~~~     }}}|||}}}vvvrrr|||ooommmqqqppptttnnntttrrruuu(+ ddd___^^^dddMMMUUUMMMNNNNNNVVVXXXPPPFFFOOOJJJQQQTTTLLLNNNIII\\\```dddoooXXXUUUcccXXXTTTWWWTTTLLLKKKKKKFFF>>>BBBAAA@@@:::999999;;;333222000...222...///222---'''ZZZ -555222------000,,,+++)))%%%444+++,,,...***+++***YYY444555,,,)))555///***+++)))...------111%%%&&&222222"""'''333333'''***'''(((++++++///***......333222888::::::===JJJIIIPPPSSSkkkrrr ]]]MMMXXXUUUTTTLLLGGGJJJCCCIIIRRRFFFBBBJJJBBBHHH]]][[[HHHIIIGGGDDDMMMKKKEEEDDDHHHHHHGGGOOOVVVOOOTTTIIIQQQ___MMMLLLddd\\\VVVggglllqqqjjjqqqrrrooo]]]rrrqqqyyyqqqzzzvvvjjjoootttzzzvvv~~~  -  ~~~~~~zzz vvvwwwyyywwwqqqxxxppplllrrrnnnnnnyyyxxx||| ~~~wwwZZZ[[[ZZZSSSFFFEEELLLJJJQQQNNNaaaSSSUUUSSSYYYSSSUUUKKKPPPOOOTTTdddaaaXXXZZZWWW^^^PPP[[[QQQ\\\XXXLLLFFFKKKMMMGGG===;;;;;;===;;;===888111222...111,,,+++...+++...---QQQ333///------...,,,000&&&---666---///000222000===wwweee///,,,'''444///---***222(((+++)))***&&&(((***000%%%###%%%FFF+++222---+++%%%'''222)))333///BBB???GGGFFFFFF<<>>:::888666333:::===222000///---)))(((***(((,,,(((&&&(((***...+++''',,,(((,,,111&&&666(((+++***000,,,------,,,)))---///---'''(((''''''(((&&&+++***(((+++((((((''' ######(((%%%'''...,,,MMM...---000111888777222@@@>>>EEE@@@<<>>777===<<<;;;888:::666444777111,,,666'''(((+++))))))(((---+++'''///)))''')))888&&&///111***)))---...(((&&&***&&&&&&+++---000)))&&&))),,,(((000+++000222%%%,,,###'''""""""&&&$$$%%%///666???///---444///'''///111222888:::EEE>>>???@@@:::<<>>IIIDDDHHHTTTRRRLLLOOOHHHFFFHHHIIIHHHIIINNNJJJHHHOOO???>>>LLLOOOFFF>>>EEEYYYAAALLLIIIOOOMMMIIIIIIEEEOOOTTTJJJVVV``` &~~~dddaaaddd```jjjvvvooo]]]ggg }}}wwwyyy~~~rrr~~~jjjrrrpppvvvlllrrrooozzzzzz    - yyy{{{|||zzz||||||uuuoooxxxwwwuuuyyyuuupppmmmwwwxxxsssnnnbbbiii^^^]]]ZZZWWWXXXVVVPPPKKKMMMYYYQQQOOOQQQRRROOOQQQSSSVVVVVVXXXUUUYYY[[[TTTWWWYYYVVVUUUWWWVVVVVVTTTZZZWWWJJJEEEAAA<<>>EEE???BBB???GGG???AAAJJJLLLOOOJJJ```GGGGGGFFFPPPIIITTT\\\cccbbb\\\eeebbbhhhhhhnnntttwwwjjjqqqmmmsssrrr -|||sssuuuqqqppppppyyy ~~~||| -  -  - -zzz -%|||wwwwwwyyypppnnnqqqwwwnnnyyyttt{{{ooowwwqqqhhhpppqqqooopppmmmaaa[[[XXXWWWhhh\\\QQQRRR]]]QQQQQQNNNYYYTTTVVVSSSSSSUUUYYYZZZ^^^cccXXXYYYXXXXXXTTT]]]WWWWWWTTTPPPNNNNNN[[[XXXGGG;;;;;;<<<666999888777:::===GGGCCCJJJ666...000***+++***(((...)))***%%%%%%)))***+++...+++&&&------,,,000+++---===))),,,000%%%+++222***@@@***$$$%%%CCC...***+++---@@@ccc333___)))''''''%%%((())))))'''444777>>>999///666???111333333777<<>>GGGFFFEEELLLDDDHHHJJJ\\\rrr\\\[[[^^^ZZZdddYYYrrr!mmmmmmjjjgggjjjmmmuuu~~~|||nnntttoookkk}}}sssssszzz2 yyyyyyxxxyyy -~~~   }}}|||}}}}}}}}}||||||tttrrrqqqqqqmmmllllllkkktttsssuuukkkhhheeejjjfff iiiaaaVVV\\\YYYYYYSSS^^^PPPRRRSSSTTTTTTRRRZZZVVVZZZTTTUUUYYYfff___YYYVVVUUUXXXOOOQQQQQQWWWQQQPPPTTTOOOGGGFFFDDDCCC???CCCCCCLLLBBB@@@<<<222<<>>GGG///000)))'''...>>>;;;,,,444MMM999888@@@QQQGGGPPPQQQ]]]^^^ccc[[[]]]aaa\\\fffJJJHHHCCCQQQLLLKKK@@@GGGRRR???AAA???JJJDDDBBBHHHHHHAAA>>>DDDAAAFFF@@@HHHGGGFFFHHHDDDEEEIIIHHHGGGGGGNNN\\\YYYdddhhhmmmwwwuuujjjmmmlllggglllsssrrruuuxxx.zzzhhhnnntttlllpppzzz||| - ~~~{{{~~~~~~~~~~~~~~~~~~}}}wwwzzztttwwwvvvzzzpppqqqqqqgggooojjjfffllljjjfffggg___]]]hhhbbb[[[\\\UUUQQQNNNQQQPPPOOO[[[[[[UUUZZZttthhhZZZVVVTTTSSSQQQMMMNNNVVVPPPWWW______^^^XXXVVVSSSOOOOOOIIIFFFLLL@@@CCCAAA===HHHEEEDDDCCC??????@@@DDD555SSSHHH===555:::222888---+++000+++)))((((((333)))***---222999///***555444111***&&&(((((("""%%%000222%%%!!!""")))(((%%% !!!666'''%%%%%%'''$$$""" )))///>>>NNN|||~~~EEEEEE???TTT///---111111222000555BBBCCC<<>>DDDFFFFFFIIIDDDFFFBBBJJJCCCDDDCCCAAACCCFFFNNNVVVZZZ```dddkkkgggjjjiiiiiipppqqqfffzzz|||vvvooojjjdddkkkssseeemmmwww  -}}}}}}||| -  -~~~~~~}}}}}}}}}~~~}}}|||zzzvvvwwwyyytttsssqqqrrr}}}lllqqqccceeegggddddddcccddddddggg___[[[UUUYYYLLLMMMPPPUUUWWWWWW[[[bbb```VVVSSSOOORRRVVV[[[XXXWWWYYYXXXYYYaaaZZZYYYVVVUUUPPPJJJKKKHHHLLL___KKKDDDDDDHHHFFFJJJ\\\RRRAAA>>>LLL>>>JJJQQQXXX<<<666444888++++++---;;;+++************''',,,(((...(((111555,,,222)))000%%%%%%###"""&&&...+++'''###***(((666"""%%%((('''###$$$"""...&&&'''&&&777HHHNNN8'CCC===;;;666000111...222???222===EEEBBB<<>><<<===444---+++)))---...333((((((,,,+++,,,***111)))))),,,222222CCC...***---222---"""000***###""""""!!!"""""" """###777,,,888'''444000777@@@UUU6DDD777+++)))'''(((+++111555AAA\\\:::<<>>DDDFFFEEEHHHHHHEEEPPPUUU[[[]]]UUUjjjxxxnnnlllooottt@? -yyy >/qqqooo{{{'=www}}}xxx}}}$ ~~~xxxzzzvvv~~~yyyzzz~~~|||  " }}} - -|||{{{|||}}}{{{{{{|||}}}ppp{{{tttlllkkkpppqqqpppppphhhbbbbbbnnnnnn^^^ZZZVVVZZZYYYUUUQQQPPPTTTNNNYYYWWWZZZVVVfff[[[___]]]]]]mmmTTTWWWWWWZZZUUUSSSVVVWWWXXXQQQUUUuuuTTTNNNGGGFFFEEEAAAFFFDDDIII^^^```YYYeeeJJJUUUddd<<<888CCCGGG888...,,,...)))...222)))***)))---++++++***)))+++///%%%000///888+++%%%***'''%%%$$$!!!$$$"""###)))###!!!"""(((""")))''')))"""###&&&,,,222777EEEAAA;;;@@@999444***((()))((('''+++999JJJ555444:::999<<>>EEE???DDDBBBAAABBBCCCLLL???GGGBBBEEEJJJDDDKKKRRRLLLVVV[[[fffeeelllaaarrrzzzMgyyy~~~ ppp}}}(mmmmmmuuuwwwwww{{{"zzzpppsssooouuutttxxx~~~}}}{{{}}} }}}  yyy |||yyy~~~vvv~~~yyyqqqkkkmmm {{{ooo|||aaahhh```{{{dddYYYYYYVVV^^^\\\RRR___WWWRRROOObbbVVV\\\OOOXXXaaahhhkkk___VVV[[[nnn^^^^^^[[[XXXVVVYYYUUUaaagggwwwoooZZZFFFIIIDDDGGGGGGWWWQQQSSSMMMEEEGGGWWWxxx~~~sssMMMXXXBBB===:::111...---)))...///((('''&&&444WWW000((('''))),,,---+++---...%%%%%%,,,666''',,,,,,!!! """/// !!!$$$%%%%%%<<<666&&&$$$&&&111BBBEEEBBB000(((+++EEE444...(((%%%)))$$$***FFF222666222444777222AAAEEEXXXYYYIIINNN]]]^^^dddTTTOOOOOOQQQIIIOOOCCCEEEAAALLLEEECCCEEE;;;AAAAAADDDUUUCCCEEE<<>>CCCHHHFFFGGGHHH>>>FFFAAA@@@FFFJJJRRRPPPbbbaaammmvvvnnnlllwww"E xxxtttwwwwwwppprrruuuxxxrrrssssss|||zzzvvvsssooo}}}wwwzzz|||~~~}}}{{{~~~ - {{{!{{{vvv{{{zzztttkkkuuusssnnnuuunnnddd___^^^```oooWWW]]]^^^\\\\\\WWWXXXUUUMMMRRRQQQSSSeeeZZZTTTZZZ___ggg^^^eeeaaa]]]\\\WWWXXX```]]][[[WWWSSSSSSaaa*bbbHHHGGGMMMEEE[[[@@@MMM\\\NNNLLLIII@@@YYYBBB<<<:::<<<222555888888;;;///,,,///---222))),,,***''')))+++222)))+++,,,,,,***,,,;;;333(((***+++$$$000((((((***---,,,***777######///&&&###"""%%%'''***111999555CCC;;;DDD555<<<555***)))&&&'''...///,,,111222444555;;;555HHHGGGUUUxxxKKKGGGXXX[[[jjjLLLJJJCCCLLLKKKHHHGGGFFFEEE@@@EEEBBBFFF@@@AAAAAAKKKMMM???KKKAAAAAAFFF???FFF???MMMEEEEEE???<<>>===888<<<:::999>>>333,,,+++---)))333))))))'''---444...''''''+++&&&)))''',,,))))))'''000+++"""%%%'''###111333'''))),,,$$$%%%###$$$...999333###222---NNNBBB___qqqBBB///888---...(((###((((((***000333///333111:::999@@@MMMbbbbbb[[[TTTSSSWWWKKKLLLNNNLLLJJJCCCHHHNNNFFFHHHBBB;;;===CCCIIIDDDCCCCCCEEE???DDDVVVCCCAAAFFFDDDJJJ>>>BBB>>>@@@DDD@@@IIIDDDDDDRRRRRRgggfff/xxxrrrkkknnn```jjjkkkaaaeeecccqqqZZZcccmmmrrr -rrrllllllqqquuuqqqxxxxxxpppsss{{{yyyyyy~~~uuuqqq~~~yyyzzz~~~~~~  |||xxx||||||xxxuuunnntttuuuwww tttooorrroooeeesssqqqkkklllgggtttkkkfffbbbcccggg]]]ZZZbbbRRR[[[YYYXXXZZZXXX[[[PPPYYY\\\WWWWWWWWWTTTYYY]]]___[[[aaa[[[RRRTTTjjjXXXXXXVVVQQQMMMLLLHHHYYYVVVKKKEEEDDDCCCIIIVVVFFFIIIJJJVVVbbb___DDDCCC:::===PPP:::222555???444+++,,,...&&&111+++---((('''...)))***%%%'''******---'''===+++TTT///(((---###AAA000(((***444''''''(((222&&& $$$###555$$$###&&&555---___) {{{@@@,,,,,,,,,((("""===$$$@@@:::444666555222;;;999<<>>AAA>>>FFFFFF>>><<>>999LLLBBBBBBEEEMMMhhhYYYPPPKKKNNNRRRTTTdddSSSAAAKKKLLLQQQIIIIIILLLKKKBBBCCCFFFBBBAAAEEE@@@888???BBBBBBFFF???DDDAAAAAAKKKKKKHHHIII===CCCCCCCCCEEENNN```mmm dddbbbrrrnnnaaahhhzzzggg\\\^^^dddeeeZZZRRRXXXbbbhhhmmmnnnnnnpppjjjjjjmmmuuuvvvyyynnnttttttyyyxxxuuu~~~{{{ }}}{{{|||}}}vvvqqqyyy|||uuuwwwxxxrrrrrrooonnnwww|||wwwwwwmmmxxxlllvvviiinnnnnncccfff___bbbaaa[[[bbbeee```^^^^^^ZZZ^^^WWWSSSTTT]]]^^^TTTUUUVVVTTT[[[RRRZZZ\\\WWWTTTSSSQQQUUUUUUXXXaaaYYYUUUXXXUUURRRQQQNNNYYYTTTQQQRRRLLLFFFHHHCCC>>>JJJFFFEEEDDDMMMIIIDDDEEE<<>>======AAA===???@@@BBBEEE999===>>>EEECCC@@@>>>AAATTTKKKPPPWWW___]]]cccdddddd```|||~~~cccjjjkkkgggpppiiiiiiZZZggg\\\aaa\\\```sss~~~vvvvvvgggfff\\\pppxxxqqqsss{{{wwwtttssswwwrrrvvvyyy -~~~wwwqqqsss|||wwwpppmmmiiinnnnnnqqqrrrjjjmmmvvvmmmiiiuuuqqqlllpppdddaaafffccc^^^ZZZ___```ggggggXXX\\\WWWXXXUUUVVVUUUWWWXXXRRRPPPTTTUUUZZZaaa^^^YYYZZZ]]]XXXVVVZZZZZZVVV___```VVVSSSUUUOOOQQQQQQNNNWWWIIIOOOOOOEEEHHHMMMBBBBBBFFFCCCDDD\\\TTTFFFGGG@@@IIIkkkUUU???999999>>>EEE;;;000---111///---///222000'''***000111%%%(((+++'''(((&&&000((('''...TTTPPP000***...+++111222666$$$,,,222 ###!!!PPP%%%!!! !!!'''%%%((( ((($$$!!! !!!"""$$$%%%######&&&222%%%+++...:::999FFF???CCCJJJCCCNNNHHHFFFIIIKKKUUUMMMZZZ\\\PPPNNNPPPVVVSSSKKK;;;888===BBBFFFGGG<<<777:::AAABBBBBBAAA???GGGEEEAAA???@@@???===<<<;;;>>>AAAIIILLLLLLLLLRRRWWWwwwiiiddddddoooggg]]]sssqqqiii^^^RRR```bbb___aaaddd^^^pppuuupppsssjjjfff\\\gggfffrrruuunnn{{{rrrxxxuuuuuupppqqqttt|||||| |||~~~yyyzzz -xxxgggllljjjlllqqqqqqkkktttlllhhhmmmdddaaannnqqqfff```gggYYY___YYYaaa]]]^^^]]]bbbWWWPPPTTTWWWWWWWWWUUUZZZTTTUUUTTTUUUWWWYYY|||]]]lllSSSddd___\\\WWWWWWZZZXXXaaaaaaZZZVVV```TTTPPPNNNLLLIIIPPPRRRDDD>>>;;;BBB???>>>EEEFFF___OOONNNPPP<<<>>>AAACCC@@@AAA999///>>>555@@@///333???+++...(((''',,,111''''''+++,,,'''***((((((&&&444$$$111))))))(((***###***111&&&%%%(((222555///###(((+++###$$$!!!!!!!!!$$$"""&&&"""222 !!! """(((!!!%%%---((()))+++,,,000444333;;;DDDXXXFFFPPPDDDHHHMMMKKKNNNQQQXXX```hhheeeWWWccceeeJJJ888666<<>>>>>;;;???@@@@@@@@@EEEGGG>>>@@@???DDDDDD@@@???GGGDDDCCCDDDEEEEEELLLOOO[[[,gggpppaaadddccc___jjjuuucccRRRRRRlllggghhhbbbiiinnnpppeeebbbqqq___YYYfffdddxxxppprrrvvvxxxxxxqqqtttuuuqqqwww}}}  ~~~xxxtttqqqssstttvvvkkkgggnnnqqqrrrmmm{{{sssmmmrrrrrruuu|||mmm```^^^gggqqq___ZZZYYYcccZZZ^^^[[[\\\SSSWWW\\\SSSVVV]]]XXXZZZ^^^```hhh^^^WWWPPPWWWVVVRRRYYY^^^YYYfff[[[QQQVVVZZZ\\\]]]ZZZRRRSSSSSSYYYKKKKKKHHHCCCDDD@@@CCCBBB>>>===CCCKKKQQQNNNAAA???GGG<<<888888888333888555222+++---...,,,...000+++222AAA222000'''555(((,,,---%%%)))&&&$$$###!!!+++%%%222)))%%%'''$$$###''')))&&&***000---333(((,,,"""!!!""")))333 !!!)))$$$+++!!!!!!""" (((%%%)))***+++)))&&&(((,,,CCC+++;;;<<<666444555888:::CCCEEEMMMBBBKKKVVVXXXYYYvvveeeqqqxxxYYY:::777KKK888777BBBPPP@@@;;;@@@@@@===BBB???;;;CCCIIICCC@@@???DDD???CCC??????AAA>>>AAAFFFKKKXXXddddddhhh[[[ZZZaaa___eeedddeee[[[^^^kkk -mmmrrrppptttiiiuuuyyyqqqoooeee[[[```______eeeppp -nnnpppoooqqqtttqqqwwwttt ppppppnnnmmm}}}nnnqqqjjjlllbbbfff___gggjjjrrryyyxxxeee{{{wwwhhhdddooo^^^kkkccc___fff```___zzzccc\\\eee[[[UUU[[[\\\bbb\\\XXX]]][[[\\\]]]XXXTTT^^^ZZZUUUYYYZZZ\\\YYYYYYYYYYYYVVVZZZTTT___TTTOOOLLLJJJMMMAAA@@@NNN;;;666FFFFFFBBBBBBAAAAAA777;;;222:::999...///000,,,333222222///---------,,,...---...AAA222---((("""$$$------%%%&&&111(((!!! &&&)))&&&''''''+++%%%###)))+++///(((&&&$$$"""/// %%%!!!"""###$$$$$$UUU~~~%%% !!!###"""$$$%%%###''',,,...222888FFFAAA111///777>>>CCCBBBCCCGGGIIIPPPqqqiiibbbgggnnniiiDDD777555666333;;;IIIFFFAAA>>>;;;;;;AAA???:::DDDDDD===888777BBBAAA???EEELLL@@@HHHDDDFFFPPPPPPQQQ___RRRVVVbbb___```hhhooodddfffeeeeeegggyyykkkhhhfffaaaqqqrrrqqqdddiiippp___ZZZ[[[cccmmmooolllmmm#xxxmmmuuu{{{ooozzzxxxrrruuupppvvviiifffkkkmmmjjjjjjaaa```hhheee```ccchhhfff^^^TTT```iiiaaa______]]]aaahhhtttbbbbbbcccmmmfffkkkggg^^^\\\\\\]]]WWWXXXYYY]]]\\\]]]QQQRRRMMMTTTnnn]]]^^^dddeee^^^\\\[[[aaaYYYWWWTTTRRRMMMJJJGGGBBB@@@<<<<<<===<<>>???EEEaaaCCCHHHLLLGGGeeebbbdddjjjaaaSSS^^^qqqJJJBBB999999///;;;FFF@@@AAA@@@:::999@@@;;;???<<<<<<>>>>>>999;;;CCCCCCEEERRR;;;===DDDBBBFFFRRRNNNTTTPPPWWWcccddd\\\fffpppiiieeefffcccXXXSSSgggppppppbbbhhhZZZgggiiiggg```ddddddwwwjjjcccmmmeeefffkkkvvvmmmpppgggrrrnnnyyyssssssmmmbbbeeemmmgggjjj~~~nnn```fff^^^iiidddbbbUUUgggaaaXXX___WWWggg```ZZZ^^^SSS[[[YYY[[[```qqqdddVVVXXXWWW^^^aaa___ZZZZZZ]]]YYYYYYZZZZZZ\\\\\\\\\YYYRRRTTTWWWVVVYYY\\\[[[aaahhh\\\WWW[[[]]]\\\OOOMMMFFFHHHIIIGGG999>>>777;;;777;;;:::;;;___aaa>>>222777;;;666888666666222111111111---222...***+++...'''///***333...(((666(((###+++222000+++&&&&&&$$$$$$'''###$$$$$$'''+++))),,,:::AAA///---(((---777'''$$$...!!!***###!!!""")))FFF$$$ ### %%%%%%...'''$$$,,,222777555666555===???<<>>BBB:::888<<<<<<===@@@>>>555>>>>>>EEEEEECCC@@@<<>>AAAAAAEEEKKKWWWSSSTTTYYY" ]]]fffnnnbbbaaadddttt___\\\bbbeeessshhhggg qqqgggpppZZZpppkkkhhhnnnhhhpppffffff^^^dddnnnnnnmmmiii\\\aaaiiilllhhhiiihhhlllfffrrrbbbgggkkkccc]]]^^^YYYUUUXXX\\\fffaaafff[[[XXXXXXSSSTTTXXXcccaaaaaabbbWWWWWWVVVVVVXXXWWW\\\aaaWWW```]]]UUUUUUMMMSSSRRRSSSOOOVVVTTTWWWUUUVVVaaaYYY]]]lllaaa]]]WWWTTTRRRMMMKKKDDDEEEIII___>>>BBB;;;===;;;===BBB666FFF???JJJ:::999;;;888555///000666444000111+++***+++***.........***%%%&&&(((...FFF(((%%%(((---+++***&&&(((((()))'''((($$$(((;;;***(((IIIPPP###((((((JJJ444777%%%'''!!!'''&&&((($$$$$$***$$$###(((!!!%%%%%%$$$((($$$(((444333222666AAA999???JJJ999CCCEEESSSJJJRRRNNNPPPWWW\\\XXXVVVNNNQQQSSSDDD999555666;;;888EEEcccDDD@@@444:::<<<<<<>>>666@@@@@@>>>@@@FFFCCCAAA???EEE===CCC???CCCIIIMMMQQQ\\\SSSjjjbbbWWWXXX[[[cccbbbhhhaaaddd^^^eeedddiiikkkiiirrr3lllaaagggqqqllliiiqqqllliiiiiiZZZ```dddfff{{{ZZZ^^^fff^^^lllfffdddccczzzjjjdddbbbmmmhhhjjjlllccc___gggddd```___ZZZ]]]TTTVVV\\\YYY]]]RRRUUUWWWWWW[[[___aaaZZZXXXTTTYYY]]]YYYaaaYYYcccsss^^^]]]\\\YYYXXXXXX\\\___]]]YYYTTTVVV\\\\\\^^^ddd\\\\\\YYYUUUUUUNNNHHHEEEDDDBBBBBBFFFLLL<<<<<<;;;:::======KKK???:::<<>>888FFFAAA@@@EEEEEEMMMPPPJJJUUUlllUUULLLQQQGGGJJJLLLFFFQQQDDDEEE;;;666777;;;QQQ@@@===;;;<<>>;;;:::<<>>>>>888777888RRRAAA444???AAACCC<<<777444777...)))(((...%%%---///******------***)))$$$!!!$$$+++***,,,,,,000((()))(((''')))$$$''')))...000111000***((($$$%%%'''///((((((+++&&&999%%%$$$%%%&&& '''!!!'''!!! """  %%% ###%%%---555111---///333@@@III===>>>OOO<<>>>>>AAADDDAAAAAAGGG>>><<<555777999;;;???BBB@@@DDD999CCCHHHJJJIIIOOONNNGGGJJJOOOYYYxxxbbb[[[\\\```aaaggg``````[[[ccchhheeerrrvvvoookkkqqqgggllllllnnn|||QQQWWW```aaa______[[[```]]]ccc^^^^^^fff___fffjjjsssmmmiiivvvnnntttbbbXXXYYYZZZXXXUUUaaaeee```YYYUUUSSS[[[XXX^^^ppplllqqqeeecccaaa___bbbaaaYYY[[[]]][[[YYYWWW___mmmiii^^^jjjaaa[[[\\\ccc```ccc___UUUUUUWWWPPPMMMSSSLLLMMMNNNNNNNNNEEE===<<<<<>>DDDEEEaaaEEEAAAQQQUUUKKKNNNJJJOOO[[[\\\WWW^^^ZZZ___fffhhhfffVVVaaa```mmmjjjdddooohhhnnnmmmhhhnnnjjjgggiii______[[[WWWffftttfffTTTWWWhhh\\\^^^dddkkkeeehhhfffvvvppp}}}yyyfffeeeaaaVVV[[[YYY\\\UUUqqq^^^iiiVVVXXXXXXdddYYYaaapppuuuzzzhhhlllfffeeeiii\\\dddddd```nnnZZZbbbkkkiii``` hhh^^^aaa[[[```[[[eee```YYYVVVTTTOOOHHHLLLTTTOOONNNVVVJJJCCCBBBDDDCCC<<<===EEE???888999>>>AAA@@@???666BBB666666222777111///******,,,,,,+++...111------++++++'''***&&&)))+++)))&&&...---$$$$$$,,,'''111+++***(((&&&(((,,,;;;777555(((111"""111+++%%%&&&%%%  &&& 000111000!!! ###%%%"""$$$&&&'''(((000------777111???^^^999@@@MMMBBB@@@???OOO>>>???III```jjj^^^HHHBBBHHHHHHGGGAAAKKKNNNOOODDDKKK___:::444555>>>>>>777???777888888444>>>:::888:::===CCCLLL666<<>>555<<>>AAA===BBB>>>:::;;;AAA===999444;;;<<<777:::777777666111...///111...555)))000+++((($$$''''''%%%%%%---222---)))((()))'''%%%###"""###%%%...(((***+++NNN333,,,+++(((,,,'''###&&&$$$,,,...===HHH!!!%%%!!!###***''' !!! ((()))''''''222222777;;;:::<<>>777>>>@@@@@@GGGEEEOOOMMM\\\MMMQQQHHHWWWTTTWWWYYY[[[VVVbbbZZZ^^^ZZZZZZ[[[LLLeeeeeeeeekkkdddhhhrrrpppZZZdddkkkhhhjjj^^^\\\eeeWWWTTT\\\aaa_________QQQ[[[ZZZ[[[[[[]]]aaaZZZkkkbbbWWWYYY]]]ZZZTTTVVV```[[[bbbggg```]]]```eee^^^^^^```\\\\\\[[[[[[]]]```aaa```dddjjjdddccc```ddd\\\nnndddaaaaaa^^^aaa^^^eeeXXXYYYVVVVVVNNNLLLMMMUUURRRLLLVVVLLLQQQEEE???CCCDDDAAADDD:::<<<<<<;;;444777<<<:::EEEDDD666333222555333333222///222666---111---)))(((000111222+++,,,$$$$$$((()))+++***%%%'''"""&&&)))333777***'''***444...$$$)))---(((***$$$***'''QQQCCC"""###(((!!!PPP !!!  ###&&&"""((((((---111777777CCCEEEBBBFFF<<>>===??????DDDAAAKKKMMM:::222666999333444666999===<<<===???;;;<<<;;;:::===@@@<<>>IIIBBBFFFCCCHHHHHHDDDEEE;;;777CCClllbbb666222AAA444888888;;;555888555888:::CCCRRR======DDD>>>AAACCCIIIIIISSSHHHAAAHHH@@@GGGCCCCCCLLLKKKKKKRRRWWW^^^qqq]]]]]]yyy```mmm]]]fffbbbfffbbb[[[UUU[[[TTT^^^aaaaaaaaa]]]ZZZccc``````PPPPPPTTTYYYmmmxxxuuulll```nnnccc___[[[ZZZ^^^___eeefff]]]ddddddddd```dddeeebbb___ccc___aaaZZZggggggaaaaaa]]][[[[[[jjjfff^^^\\\\\\]]]```aaa^^^ZZZYYYUUUVVV]]]fffxxxWWWQQQNNNMMMOOOdddwwwVVVYYYbbbFFFGGGJJJFFF???AAA>>>EEE===>>>>>>888<<<;;;<<<<<<<<>><<<999<<<@@@===;;;<<>>??????AAA___SSSIIIPPPFFFCCCDDDSSSCCCCCCHHHEEEJJJKKKUUUVVVTTTTTT]]]aaaiii___bbb\\\fffbbb\\\______fffeeeiiiaaaYYYPPPQQQZZZ]]][[[___bbbtttpppsss~~~uuuuuujjjfffbbbjjj{{{kkkcccddd]]]______eee```^^^cccbbbkkkeeegggfffeee___]]]fffbbb[[[iiiggggggjjj\\\YYY\\\XXX^^^VVVYYYaaaWWWVVVcccZZZUUUWWWMMMRRRLLLJJJLLLGGGKKKPPPVVVQQQSSSTTT===JJJGGGPPPTTT```GGGLLLEEEJJJJJJBBB<<<>>><<>>CCCBBB;;;BBBIIIHHHEEEKKKAAACCCaaa@@@EEEBBBDDDBBBPPPNNNNNNTTTXXX\\\```WWW___]]]^^^ccc^^^^^^eee]]]^^^pppmmmjjjaaa]]]^^^___YYYaaa\\\VVViiioooeeettt xxx -}}}uuuiiiccccccaaagggfffbbb___ddd___^^^bbbhhh{{{mmmbbbeee^^^bbbaaabbblllaaakkkZZZZZZ```UUU]]]]]]WWWVVVYYYWWWUUUQQQPPPJJJPPPHHHJJJMMMJJJIIIHHHKKKJJJKKKAAAGGGEEEbbbZZZWWWaaarrrPPPdddnnnBBB===???<<<<<<;;;;;;AAA,,,111...***333666333//////---+++000&&&---000222+++)))$$$&&&)))&&&'''((($$$+++,,,(((,,,(((...(((,,,'''+++%%%'''$$$""" ''')))&&&!!!+++""" ######+++---///  %%%!!! """%%%,,,///+++...555999555:::AAA===CCCEEEEEEJJJGGG@@@AAATTTAAABBB===BBB>>>:::999<<<:::<<<:::;;;888999555---,,,...555888888444222222999999:::===:::<<<777HHHIII888555:::FFFAAA===@@@MMM>>>FFFKKKIIICCCEEECCCKKKbbbXXXMMMXXXZZZVVVZZZZZZaaaXXXZZZ______XXXXXXkkkfff]]]\\\```hhh^^^hhhjjjdddfffccciii}}}$zzzvvvlllccc|||uuuooohhhfff______\\\___fffkkkccceee^^^lllaaa```]]]bbbmmmhhhfff^^^YYYTTT[[[TTTTTTPPPPPPLLLNNNKKKKKKJJJHHHKKKGGGJJJJJJBBBFFFKKKJJJCCCEEE@@@AAALLLDDDNNNfff-?fffRRRDDD===;;;777<<<666999777???555222111222111666333...777111===000***,,,---)))''''''$$$&&&###$$$(((++++++,,,&&&///***000,,,)))---)))666###'''))) ***%%%***$$$$$$ %%%///!!!"""000 ,,,)))!!!!!!"""%%%***+++,,,333111444555EEE???AAA>>>JJJCCC???CCCAAABBBAAACCCGGG>>>>>>:::;;;<<<999666===999;;;:::===UUU;;;333+++777444333111555777:::III888;;;<<<555999999@@@999888@@@>>>III:::EEECCC>>>FFFDDD@@@@@@GGGFFFfffttt^^^VVVVVVUUURRRZZZUUU[[[WWW^^^XXXZZZZZZYYYUUUiii___\\\___WWW\\\aaaXXX```eeebbbfffsssuuuvvv:@)2zzznnnlllmmm```___```]]]]]]VVVbbbddd```aaaZZZdddXXXjjjmmmkkkaaa^^^aaaMMMZZZSSSQQQNNNTTTRRRcccLLLGGGJJJIIIHHHHHHIIIGGGKKKDDDOOOJJJAAADDDNNNBBB;;;BBBKKKHHHSSS dddRRRFFFCCC:::888;;;::::::999222666???333:::333,,,444888FFF---,,,111&&&,,,+++'''***!!!'''$$$$$$ ))))))///'''///999///555***%%%***(((***$$$((('''"""'''&&&$$$&&&%%% &&&222 !!!  ###$$$###+++111,,,000AAAEEE???FFF>>>AAA===:::III;;;DDDAAAGGGDDD@@@CCC@@@???EEECCC:::===@@@888888FFF888777AAAPPPDDD444888///777>>>:::<<<@@@;;;:::???999777999DDD;;;FFFDDDEEECCC===GGGCCC>>>LLLMMMHHHNNNBBBlll```SSSOOOTTTKKKOOOPPPSSSRRRRRRUUUSSSSSS\\\ZZZ]]]___ZZZWWWaaa___VVVZZZXXXZZZ^^^YYYffffffooo -~~~hhh}}}wwwvvvvvvrrr fffUUUaaaWWWXXXXXXbbbdddUUUYYYWWWWWW[[[TTTOOOWWW```^^^sssmmmYYYXXXUUUNNNSSSKKKIIINNNGGGIIIFFFKKKOOODDDGGGDDDCCCCCCGGGLLLMMMJJJEEEHHHMMMIIIJJJ>>>DDDFFFKKKDDD^^^___QQQCCCGGG>>>???888:::???:::@@@fff111>>>666444MMM>>>555333222,,,)))+++%%%***444000888"""&&&&&&###$$$((()))+++PPP222...))),,,+++---''')))+++***$$$&&&&&&!!!###%%%((('''!!!""" $$$### &&& $$$***///222---555999:::999GGGFFFAAA>>><<<@@@;;;AAAGGGCCCGGGIII===;;;FFFAAA===<<<;;;:::;;;===XXX444CCCKKK999<<<222333555888;;;888555777666===>>>666===IIIDDD<<<:::@@@??????AAABBB@@@BBBGGGIIINNNKKK[[[FFFMMMDDDHHHEEEJJJFFFJJJIIIYYYVVVPPPPPPPPPkkk]]]VVVWWWUUUXXXYYYVVVTTTVVVVVVXXXXXX\\\fffccc___uuunnncccmmmcccooo|||jjjooohhhlll```SSSVVV[[[^^^RRRZZZYYY\\\VVVRRRPPP```XXXYYYXXXXXXXXXUUU___VVVSSSTTTJJJIIIFFFLLLPPPPPPJJJEEEDDDHHHFFFPPPGGG@@@GGGNNNFFFVVVWWWJJJ]]]NNNDDDCCCBBB>>>CCCAAADDDFFFPPPGGGCCCEEECCC@@@===BBB>>><<>>666BBBIII>>>===555>>>AAA<<>>999DDD>>>EEEEEEAAA;;;;;;666999;;;555???333:::---999111444222///333888888444555888===;;;888;;;::::::999888>>>FFFJJJ===AAABBBGGG???EEEJJJ___jjjUUUCCCJJJAAABBBMMMLLLPPPKKKHHHVVVSSS```SSSQQQYYYPPPXXXMMMSSSZZZVVVXXXWWWUUUSSS^^^^^^bbbeeeXXXYYYYYYWWW^^^cccnnnccciii```\\\]]]bbbXXXXXXZZZTTTZZZQQQPPPWWWTTTgggZZZTTTVVVSSSRRRNNNNNNNNNUUUTTTPPPPPPIIIIIIIIIGGGOOOJJJGGGEEEMMMHHHWWWFFFGGGEEEDDDCCCJJJcccgggiiigggRRRZZZCCC@@@KKKCCCDDD<<>>BBB:::888LLLJJJAAAOOONNN777111...---333///555444///)))>>>888;;;888---333,,,)))---111222******111333---***'''***222,,,%%%000&&&'''???TTT$$$"""%%%((()))""""""!!!444 ### """&&&&&&((($$$)))$$$)))---///888222666;;;CCC===777;;;>>>EEEEEEFFFMMMBBB???>>>CCC999FFF@@@;;;999999======EEE777===999;;;<<<111:::000777:::888222666777888>>>>>><<<@@@;;;CCC===<<>>EEE<<<:::EEE???<<<999:::===999<<<999666BBBUUU<<<666999CCC000+++555333555'''***111***///EEE---)))333***))),,,(((***...,,,,,,000(((***'''***%%%///---%%%&&&$$$&&&...,,,%%%######"""((("""+++::: ### ***'''''''''!!!'''***)))...888666@@@777???>>>BBB>>>EEE>>>AAAAAAIIIJJJBBB___oooAAA@@@888777222999888;;;:::444111555333444111444666;;;666111:::888333;;;>>>>>>AAAFFFGGGGGG>>><<<@@@>>>EEECCCGGGAAA;;;EEEIIIPPPiiiCCC???<<>>FFFBBB;;;===:::999666:::QQQIII666444;;;666AAA555333999000---111BBB333%%%(((111333---...&&&***333******)))###,,,***------...---+++555---%%%,,,+++222444)))+++''':::"""###!!!$$$<<< 555''''''###!!!111$$$$$$###$$$...###+++)))%%%CCC<<<===>>>;;;>>>MMM???CCC===???@@@???===FFFCCC@@@@@@@@@<<<===:::777666888444999222555444555555555999???999///>>>======<<>>BBBEEEJJJUUU???999;;;???===BBBKKKSSSUUUEEENNNKKKFFF@@@BBBEEEIIICCC444;;;888:::<<<555888888>>>999@@@333111999999666KKK222...666000---%%%))))))+++111...'''***111---000,,,---111---...///---111+++,,,((((((333------222111555777777""" 999,,,111!!!### '''###!!!((( $$$ !!!+++***)))###%%%(((***...///<<<111@@@<<<777BBBCCC999;;;GGG???FFFEEEOOOBBB@@@<<>>BBBccc<<<333:::999555777CCCCCCFFFRRReeeXXXNNNSSSEEEBBB===CCC>>>DDDGGG???NNNhhhBBBPPPIII>>>??????>>>===CCCCCCAAAHHHDDDFFFEEEJJJZZZKKKLLLPPPFFFKKKCCCEEETTTmmm#XaaaRRROOOKKKFFFOOOYYYUUUQQQbbbZZZUUUOOOYYYSSSWWWNNNPPPPPPMMMIII@@@CCCCCCDDDFFFJJJLLLFFFEEEIII\\\QQQLLLCCC===???FFFGGG@@@>>><<<>>><<<999@@@???FFFEEEWWWAAAGGG;;;;;;<<>>___@@@<<<:::;;;888;;;333888888999555000333333222222666000@@@555NNN777111,,,+++)))...///000,,,***,,,000888,,,EEE:::222(((---555000)))((((((,,,...666)))"""%%%111111---,,,'''""" 333GGG***"""###"""$$$... ))) """***777***&&&###***((((((===111555777333666;;;777;;;777888777FFFEEEFFFMMM999<<<777999DDDNNN@@@777555666999555666999>>><<<666;;;===<<<111555;;;EEEIIIFFFLLL|||PPP::::::FFFFFF@@@@@@BBBJJJYYYPPPOOOEEE@@@JJJ@@@555666<<<@@@BBBNNNFFFDDDCCCFFFMMMNNNMMMTTTMMMOOONNN@@@LLLwww#yyy[[[GGGEEEKKKFFFMMMGGGJJJOOOMMMQQQXXXZZZQQQSSSJJJHHHDDDKKKGGGFFFDDDDDDEEECCCIIIEEEJJJEEEEEELLLEEEBBBCCCGGG@@@>>>AAA???BBB;;;???999999;;;AAA???>>>GGGDDD<<>>CCCEEEAAA555...888@@@HHH===CCCBBBCCCRRRBBBDDD???KKKBBB:::===BBBEEE@@@:::??????RRRLLL777555AAA???AAADDDDDDAAAAAAIIIIIIIIIFFFJJJ___HHHGGGJJJKKKPPPcccQQQUUUFFFHHHGGGIIIKKKLLLLLLPPPIIINNNNNNYYYNNNOOODDDEEEBBB???CCCDDDGGG@@@???AAABBB@@@AAADDDGGGGGGGGGBBB@@@CCCAAA@@@AAAGGG???@@@???@@@:::777;;;999888;;;HHHBBBIII;;;:::BBB;;;DDDCCCIII???]]]TTTXXX???888HHHKKK@@@:::777888BBBEEE>>>777888999:::???:::333222444...333999CCC888???BBB444...222...+++)));;;---$$$)))(((...CCCNNN@@@000,,,...222000&&&'''***)));;;555((()))KKKKKK111111LLL000999222%%%)))$$$!!!"""...222888111!!!:::###///,,,$$$"""&&&!!!,,,'''+++555&&&...111HHH===555FFF777<<<999???===999AAA;;;@@@BBBBBBIII<<>>IIICCC>>>888@@@GGGUUU;;;;;;;;;::::::AAAEEEFFF000000:::<<<===<<>>>>>CCC>>>999777KKK===???999EEEMMM===PPPIIIMMMGGGBBB444777===@@@CCCOOO<<>>CCC===CCCEEEJJJGGGDDDFFFBBBEEEXXXVVVTTTQQQ___JJJHHHSSSNNNFFFBBB<<<>>>@@@===@@@FFF@@@AAADDDCCC>>>GGGJJJKKKFFFKKKDDD<<>>CCCAAAGGGJJJBBB999@@@777888777999666333BBBAAA>>>444^^^???666666333333777222444111SSS777;;;;;;111+++---)))))))))(((333///+++///---666444111222000+++>>>...///999)))---((()))---'''LLL***,,,///777,,,###"""111(((%%%000$$$###%%%###(((  ###""")))'''###""")))%%%&&&$$$"""%%%+++,,,111111222777JJJ444999<<>>333>>>999777999<<<;;;BBB@@@AAA;;;AAABBB>>>>>>NNNEEEKKKNNNMMMGGGIIIUUUjjjFFFKKK;;;888@@@FFFJJJDDDCCCAAAGGGGGGIIIAAADDD===>>>UUU???OOOEEEAAABBBEEE???DDD???TTT]]]hhh WWWNNN???MMMFFFBBBAAAHHH@@@BBBCCCDDDEEE@@@DDD>>>DDDBBBDDDFFFCCCFFF??????BBB===;;;999???<<<999<<>><<<>>>999<<>>AAA=========TTTEEEIIILLLcccEEE>>>BBB999999???777777888;;;999555;;;555222333333777TTT888222333111000777@@@>>><<<444((()))000000...222FFF333333000///999333111555999:::PPP666222@@@***111((()))###333FFF%%%---######%%%###%%%###)))"""111%%%'''###*** ### $$$$$$777---'''///---+++***111222@@@666<<<@@@@@@===777===999CCCJJJnnn___nnn===GGGAAA777BBB999555AAABBBBBBDDD666444777<<<>>>JJJ???666555333>>>444777<<>>;;;<<<>>>BBBEEEHHHIII@@@IIIVVVCCCIII;;;=========BBBRRRFFF>>>>>>DDD???AAA@@@GGGaaabbb}}}~~~ZZZRRRCCCBBBFFFCCCAAA<<<:::BBBBBB>>>===???<<>>>>>>>>BBB???555<<<:::>>>:::???HHH999999<<<@@@777444444888???BBB???;;;======555BBBEEEEEE;;;===>>>EEE666333999;;;666;;;???555;;;555777222444333===;;;222999555777,,,+++111---111KKK:::,,,+++111555777XXX999EEE333333444111444777999555EEE666000,,,***222888--->>>888444---$$$ """###"""&&&((((((&&&555$$$+++!!!$$$111%%%"""$$$777333,,,......000555888555999444;;;777???999>>>OOOkkkhhhjjjCCC:::666AAA999===>>><<>>???@@@>>>===EEE===@@@<<<<<>>888===555;;;777:::999===;;;===BBB666777;;;???>>>???===>>>@@@FFF===666:::999KKKEEE===>>>DDDHHH;;;999111777666555444555555SSS@@@999333:::///...---JJJ444+++555...555222444444@@@444EEEBBB888///<<>>ZZZBBB999:::888;;;;;;>>>???;;;???>>>OOODDD555===PPP===888999444444444222222888<<<;;;:::<<<===KKKOOOAAABBB???999???>>>>>>JJJ===KKK??????;;;CCC@@@???LLLJJJ???BBB@@@CCCGGGPPPGGG>>>EEE<<<999???:::======<<<======:::AAA@@@QQQ}}}wwwZZZ>>>===BBB@@@>>>???888888<<<999555<<>>:::>>>DDD<<<:::888444333000>>>???999666888888888;;;<<<999;;;555444888;;;111555HHHOOO333111888MMM999AAA<<>>---&&&&&&222---'''***...000333666222000333888888222333III===AAA;;;@@@BBBAAA@@@999999<<<999:::SSSPPPCCC888555000777;;;??????;;;>>><<<444666<<<999???;;;>>>@@@CCCEEEDDD@@@888???BBB<<<>>>999444DDD???===>>>BBBQQQLLL@@@TTTBBB@@@@@@GGGKKKAAAAAA>>>@@@DDD;;;888666HHH===777888>>>???>>>DDD\\\[[[HHHGGG777777>>>999@@@JJJ:::>>>;;;:::===EEE:::NNN<<>>888999<<<===;;;CCC@@@>>>KKKAAABBBCCC===??????::::::???===111777666666666:::999<<<666>>>999<<<:::;;;888111555;;;444===<<>><<>>CCC666333>>>???:::CCC===@@@===888666666:::;;;<<<<<>>CCC:::@@@===HHHNNNDDDEEE???XXXLLL???777:::<<<888CCCMMMZZZKKK>>>IIIUUUVVVDDD@@@>>>bbbAAACCC<<<666888AAAAAABBB?????????777BBB???@@@;;;EEE===:::888:::>>>>>>@@@999:::??????CCC<<<777>>>BBBMMMCCCAAAAAA@@@???GGG>>>===<<<:::???GGGCCC;;;777555666555888333999??????CCC:::999222;;;AAA333777///888777<<>>TTTHHHAAAOOO:::MMM666<<>>KKKBBBGGG===FFFEEE===???<<<>>>???HHH@@@AAArrrJJJPPP777999BBB>>>FFFWWW[[[======QQQ:::888@@@999999;;;EEE>>>===>>>CCCCCC@@@EEEBBB@@@>>>UUU@@@CCC???===:::666888999AAA>>>;;;;;;AAAAAABBB888BBB>>>EEEBBBLLLDDDBBB999FFF???LLLHHHGGG>>>CCC===CCC888===JJJ:::444777<<<...999888>>>;;;CCC444;;;FFF:::555444888<<<:::777111XXXAAA???>>>GGG;;;;;; qqqCCC;;;<<<888333OOOIII666hhhccc888===999444222---333333000888---...444222999@@@666111222___***)))---222---,,,...---***+++"""444111)))$$$(((""">>>???//////222FFF###,,,$$$666&&& !!! 222###%%%""" ###%%%(((&&&''',,,)))...111***222333777---...>>>bbbYYYBBBAAABBB:::>>>;;;:::999;;;BBB777:::@@@888>>>BBB<<<222888===OOO>>>AAA:::CCC999777<<>>DDDJJJGGGEEELLL<<>><<<;;;666777;;;999BBB===;;;DDDAAA@@@NNNJJJ999>>>FFFBBB>>>===444:::<<>><<>>OOO@@@???EEE999CCC999===666888555888>>>PPP???999>>>KKKCCC999<<<:::777666222---===MMM777///666666]]]UUUIII>>>555999777333:::DDD...<<<===@@@000000///+++...---+++///777;;;///000...444...///...---888***///111......333:::222333(((+++'''"""###"""###++++++...''';;;777''')))!!!...''' &&&### <<<$$$%%%!!!!!!###+++ %%%...000...;;;///===222///000<<<:::<<<555???@@@===<<<999;;;===AAA666???:::555<<<:::777aaaCCC999111>>><<<DDDDDD<<>>EEE>>>BBB<<<888HHHCCC???KKKBBB???KKKAAA:::DDD]]]EEEFFF;;;MMMHHHTTTEEECCC999PPPMMMJJJ>>>999777@@@AAA>>>777777999888???:::999:::EEE:::<<<<<>>CCC???>>>???888===>>>@@@@@@HHHDDDHHH>>>:::???AAA<<<;;;::::::<<<<<>>DDD^^^ZZZFFFFFFAAA<<<999888===888777:::999AAAAAA@@@WWW???===:::???777===222NNN999---JJJZZZ333222777555NNNFFF;;;AAA666666:::333666888+++111000444666111:::+++111333111,,,>>>@@@333///...000......000)))***///---222333...333<<<888;;;###&&&'''333&&&$$$(((...***%%%***444...***AAA111""" ### '''$$$'''$$$$$$555)))111111666111...&&&000>>>222---111///***+++111888>>>999888AAA```CCC;;;:::999444111999;;;DDD777AAA<<<::::::KKK===<<<999999999555555>>>AAA>>>OOO>>>@@@HHHAAABBBPPPNNNKKKNNNFFF===RRROOOEEE@@@:::<<<777>>>CCCEEE??????777<<<:::===999AAABBB888666999999<<<>>>999888666AAABBB???999@@@===CCC???LLL@@@<<>>FFF;;;JJJGGG>>><<>>999888;;;999;;;DDD999AAA>>>===999:::FFFJJJGGGHHHLLLIII;;;999;;;???;;;;;;KKKhhhVVV[[[eeeKKK@@@777;;;888@@@666555666777777888555///444---,,,...000:::222111999>>>888777222---...222444@@@888555333===777333000888///222///000(((---111+++//////---666111---///>>>,,,+++???(((***---"""###&&&...888)))444+++&&&999000%%%%%% ---***!!!000***(((%%%''')))GGG;;;666///***666000...+++...333333///>>>333>>>>>>777>>>===>>>HHH<<>>;;;555AAA666000@@@;;;<<<999888;;;;;;___HHHNNNVVVPPPDDDBBBDDDPPPDDDGGGSSS???555@@@:::AAA===999888:::555<<<888======EEE;;;777>>>===999666999;;;DDD<<<;;;NNN;;;===BBBDDDGGGEEE@@@AAA??????@@@;;;@@@???>>>CCCMMMXXXNNN===DDDDDD:::;;;555@@@EEE>>>CCC???AAA666>>>>>>>>>===???MMM[[[BBBJJJ666::::::???BBBUUUNNNNNNZZZbbb^^^HHHBBB999@@@333888<<<;;;777222000888000///333---'''...///333666)))000444111<<<000,,,***===333111+++666777...>>>777777+++555---******...--->>>:::000222///+++===...***333444,,,000)))''' (((+++)))888+++)))(((:::,,,"""---!!!$$$,,,>>>&&&@@@000$$$(((+++///777LLL;;;333111555+++...111333---000555111555555:::;;;;;;:::CCCEEEVVV???888DDDBBBLLL999AAAAAADDDEEE888FFF:::AAALLLqqqdddTTTUUU;;;:::888666;;;===;;;IIIYYYNNNSSSRRRDDDAAA===KKKEEEBBBEEECCC444::::::EEE<<<@@@888JJJ111444666333:::::::::555555444<<<888<<>>CCC;;;888:::@@@===999888777===EEESSSVVVjjjTTTBBB;;;;;;;;;>>>;;;<<>>AAACCCAAALLLgggfff???===FFF999666///555333222555222///...222555111...111000222111...//////>>>+++555999111???222444---...+++---...///...//////***+++555///,,,***(((---333111(((111(((%%%%%%555---''')))$$$$$$888FFFSSS)))&&&''')))---,,,!!!%%%$$$ %%%!!!%%%'''))))))'''...333***---???888...111666///...777333888>>>AAA===>>>AAAFFF>>>:::<<<<<>>IIIFFFOOOAAA555666>>>NNNrrrhhh???>>>???:::555DDD@@@GGGPPP___kkk```GGG<<<666999666888;;;>>>???555999888\\\FFF666:::>>>PPP<<<;;;???:::@@@CCC666666444777???111===444888888@@@>>>???>>>CCC???999777===???:::999999777:::666CCCEEEAAABBB???>>>===;;;===888===???999777;;;DDD@@@@@@<<>>999@@@CCCGGG???___YYYQQQCCC888:::888555444...222777+++///---333888777,,,666000666999555+++///222,,,---...***000111===000---+++888...'''111)))...,,,)))---***,,,&&&&&&&&&'''777))),,,...))))))&&&'''&&&&&&+++"""***///)))555---%%%$$$+++!!!+++###!!!))) ######%%% %%%...,,,''',,,!!!---+++;;;+++222555222999///---222333666777666BBB999QQQ===TTTIII\\\DDDJJJ<<>>AAA>>>___nnn[[[<<<333666CCCdddkkkRRRDDD:::555;;;BBBAAA@@@>>>HHHLLLYYY)!ZZZRRRNNN???999777999FFFJJJ;;;999CCC777AAA???<<<777;;;<<>>;;;<<<999EEEGGG<<<666CCC???===<<<777:::<<>>>>>TTTNNNSSS]]]HHH666EEETTTBBB===CCC<<>>666111111???;;;888;;;444???777555333555:::888:::888888111666===>>>???555<<<@@@@@@>>>===:::>>>:::777777FFFJJJ===888999888///555777:::777666::::::<<>>888DDDGGGIIIMMMKKK@@@???AAA666KKK:::<<>>===777<<<666888444111777;;;<<<:::///:::666333444999777;;;777333222:::===:::777444666555DDDNNN333???<<>>:::888>>>FFFRRR@@@VVV}}}CCC???FFF666???999999;;;:::888333======XXXWWWOOOLLLCCCDDDBBB===777333@@@333>>>...,,,...---000///***...888222333***'''''')))555666---)))+++***,,,...333%%%%%%'''((('''(((,,,&&&&&&---++++++---@@@333888JJJmmmfffDDD;;;999000YYYIII000)))+++***'''###!!!'''444)))"""###&&&222:::333***%%%$$$%%%$$$,,,222$$$***---///(((...///)))555---...333---:::///======AAA@@@999FFF222>>>???@@@GGGCCCIII???======???<<<222222888;;;===BBB888:::???QQQZZZfffooo888TTTCCCkkk___LLLBBB999???===666555999222444111;;;>>>;;;???999;;;???333BBBFFFJJJ555III999444NNN<<<>>>555555666999>>><<<777999::::::;;;777<<<>>>CCC444333666666333000888;;;999888999999444333666666666>>>CCCAAAAAA\\\#EEE===>>>:::IIIHHH777BBBMMM555000:::DDDSSSsssJJJ;;;888333CCC888,,,000...,,,,,,222;;;:::///,,,(((...666111***&&&'''888EEE999444,,,+++000222000***+++((((((((("""((()))000555***888///***---:::DDDIIIiii;C-jjjVVVPPP222333>>>///((('''>>>)))---&&&'''&&&###%%%###   222CCC000222555'''***""" %%%''')))---555777777777111,,,...888000......111111KKK======777???GGGQQQ666;;;BBBHHHRRRAAA===<<<;;;666@@@888===888;;;===333<<<===GGGXXX -uuuFFF:::@@@yyyUUUKKKlll999AAA;;;000444555---,,,000@@@DDDSSS>>>:::999666444===}}}HHH888AAA222555999444222444777:::MMM555777999777555999888444999>>>BBB999:::<<<999555666666777:::333888;;;;;;888999444222555:::@@@FFF<<<<<<[[[hhhNNN@@@>>>@@@<<>>:::444666;;;888@@@999UUUqqqAAA999222222888222444---,,,000---111---///333444---''',,,444...)))000;;;444888222***222222---(((---...---,,,)))$$$+++---666...------;;;555222333;;;FFFwwwK[^^^UUU;;;DDDCCC222111...))) !!!(((((()))@@@000$$$***"""$$$+++$$$HHH,,,&&&&&&***(((&&&***)))$$$&&&%%%---GGG222BBB???000333666555555///444666888999<<<222===;;;888@@@;;;@@@===IIICCCAAA444666999FFFaaaUUUGGG>>>AAABBBNNNBBBHHHHHHXXXCCCMMM<<>><<<999;;;<<>>@@@999333000888999666999;;;333333888:::666???;;;BBB888@@@KKKOOO>>>DDD<<<>>>>>>???KKKHHH:::777666---777444888:::222111888222111///,,,******777666222+++///LLL333:::(((111...,,,///...:::222666555)))...///DDD333***&&&)))***000'''%%%&&&%%%***((()))***...333***///+++JJJ LLLTTTDDD444iii]]]222===444000%%%%%%)))&&&,,,###000***)))!!!###%%%+++"""&&&&&&:::***'''CCCRRR666%%%)))++++++)))///...000444333111333AAA111555888888>>>;;;999;;;===DDD<<<777CCCOOO===999EEECCCBBBeeeDDD===CCCSSSIII```KKKpppTTTUUUOOOHHHJJJ555333222333999;;;888888333777111<<<666<<>><<<555555AAA999======DDDoooIII222555555222666333555555666444333555888333777888CCC777555888::::::444??????<<<;;;;;;777999666222111777888444888111444:::///,,,***+++666---///333***)))+++111555;;;555111---...---333///)))@@@666222@@@...;;;333)))&&&(((&&&,,,,,,+++)))'''GGG)))###(((///777;;;)))%%%)))OOO___999III222333222888///@@@===+++444AAA$$$111???$$$***$$$'''444""")))"""...(((,,,333+++!!!###,,,,,,***)))&&&***AAA...,,,***???000333777666888444EEE:::666999DDDCCC<<>>:::666444888444666GGG===888222333666555222<<<999>>>???111666HHHEEEEEE;;;:::999333555000///666888555===444888666555:::666888///666;;;<<<666888@@@AAA333222AAA666555333===444777111222444000...///+++333<<<444222000222---222444000III333,,,222...((((((...444...(((...777444'''666&&&"""&&&'''666***,,,333))),,,'''(((111444888......(((555(((------777444333...,,,333111(((&&&;;;,,,111222???+++###&&&)))((($$$ !!!"""!!!)))111000333KKK---!!!###...(((,,,&&&///888>>>...---+++000---///222777;;;999ccc666111;;;NNNBBB>>>\\\DDD<<>>777LLLPPP;;;======:::666666:::CCC999777444aaa<<<@@@:::>>>@@@777333444666999777DDD<<<444444888666555555222000999777???:::444666777888<<<777555666:::PPP777555CCCEEE;;;;;;555DDD111,,,666777555AAA...888@@@222444555444///666000111888,,,444888777111777...,,,...,,,(((///------,,,000111+++'''&&&&&&,,,&&&&&&(((((()))'''$$$))))))(((***...,,,222777777;;;000!!!666555333000222000///000777...555---'''***+++//////666DDD$$$"""###&&&GGG,,,BBB222 !!!"""%%%&&& $$$>>>666555++++++(((...;;;777///444777444>>>111666333III;;;;;;???<<<777;;;MMMRRR???FFFAAA<<<<<<<<>>???000666;;;???555888111333111333999666333222666666555666666777444666;;;]]]<<<555222777999777:::999777>>>CCC===DDD777999~~~___>>>===:::555:::@@@CCCBBB999444...111444<<<---))))))@@@000222;;;BBBAAA000CCC......555666EEE///---333222+++&&&&&&000)))222+++&&&)))$$$'''///''')))///000+++,,,)))(((333QQQ)))222333DDD,,,'''///888:::XXXSSSWWW999LLLXXX...******)))000'''!!!"""!!!222$$$###---'''++++++!!!---$$$%%%&&&$$$###,,,444)))%%%,,,,,,+++(((555///222;;;555444000555333???DDD888___;;;BBB;;;===>>>MMM@@@AAARRRTTTFFFcccyyy-9MaaaiiiwwwRRREEEIIINNNaaaRRR111666999:::555777999CCCLLL555666```>>>;;;000,,,444444BBB:::PPPyyy;;;BBBBBB>>>>>>EEE666;;;444555===555///333<<<<<<555999555444222///555555222666===???HHHGGGDDD555444222???111555777333666:::<<<444999DDD666MMM777;;;MMMQQQ:::666:::666888444XXX777>>>===555111...---///111)))444%%%)))...///...000///***...;;;333:::444///555777999+++&&&)))***...222$$$---$$$222HHH---(((000777555...666888'''(((,,,888***''' (((+++,,,EEEbbbMMM::::::666BBB---///)))+++((('''   ###(((######"""&&&"""!!!$$$%%%***%%%&&&...111AAA&&&'''''',,,222222333444@@@999LLL///;;;;;;555888666999BBBDDD@@@???EEE===<<<999;;;;;;AAAbbb ]]]dddYYYyyynnnRRRUUUccc\\\RRR\\\NNNLLL???999:::<<<666555888;;;222555888;;;bbbCCC777777---444888<<<@@@%WWW666>>>UUU===222///555:::BBB<<<999<<<;;;888===999555777777;;;777:::555555777888===RRR]]]DDD555000555???>>>666000444<<<555777:::999;;;OOO555999777:::CCC---:::444;;;;;;666444UUUBBB\\\OOO444000333)))111222...999222+++222//////+++555...---888555,,,...HHH666===777///+++333...""";;;111***(((***)))111555555KKKAAA555RRR333111+++&&&!!!+++%%%...(((111888111+++,,,111333AAA111'''&&&+++999''' &&&666 )))###000---$$$$$$,,,)))###&&&''')))III,,,)))((($$$***!!!&&&000,,,***111222000555777555999999333888999===>>>CCC999666III999<<<555888???>>>888DDDLLLPPPOOOQQQVVVUUUKKKYYYXXXSSSMMMXXXTTT333===:::333<<<<<>>888@@@jjjTTTSSS888???;;;BBBAAA:::???777222555>>>\\\===666999999666EEEFFF555555555===CCC<<<:::CCCHHH]]]OOO<<<<<>>---'''333///000///222,,,000111'''$$$''''''+++***,,,)))111KKK===VVVUUUDDD555+++444666QQQ111'''$$$###888444++++++""")))JJJ++++++---$$$)))!!!(((PPP"""$$$"""!!!)))&&&(((...'''%%%&&&$$$((('''"""$$$$$$$$$((("""%%%))),,,(((666???JJJ888...222555222===888666222000:::@@@999@@@<<<888DDD444FFFFFF>>>===GGG???dddIIIHHHJJJZZZUUUQQQYYYtttYYYPPP___???FFFPPP888;;;999JJJ;;;777333000LLL111000333555;;;444@@@///AAABBBJJJ777666999ZZZGGG<<>>AAA===555000333222999666999===888///777EEE444777555,,,%%%)))888888<<<444???---777444...---...000111333000***,,,,,,---(((111333ccc---111;;;555///222888:::111666:::777222666***222'''$$$***///,,,,,,666;;;ZZZLLLPPPeeeFFF777...===>>>...,,,HHH***:::***((()))***"""###KKK!!!,,,<<<******$$$ ---:::$$$"""&&&###%%%;;; ...((($$$###***%%%$$$***///$$$%%%***%%%$$$+++***333999...333---...444666...444+++999@@@222444;;;BBB???888555CCC??????>>>===CCCTTTGGG;;;>>>CCCBBBGGGMMMTTTsssmmmTTTMMMKKK;;;444333777===AAABBB777,,,888111,,,...===???333;;;555777:::>>>:::DDD<<>>777999;;;OOOGGG000555???999555666999666===MMMDDDAAA;;;999777777<<<555888888@@@===444444444777222777...111///000444777;;;iii333555:::333444444777000777000111///777222111111222,,,,,,555222>>>:::222222///---222...333999JJJ\\\kkkDDD;;;333///777***%%%''')))$$$'''&&&111...///:::ZZZ:::???rrrUUUWWWRRRggg%%%&&&+++111+++MMM,,,***LLLBBB>>><<<%%%(((---...%%%###!!!'''!!!###(((!!!###"""!!!+++$$$(((+++%%%"""%%%&&&%%%***888&&&++++++,,,111,,,+++333333...333555000///000999444///000:::666999333;;;222888999???AAAGGG]]]EEESSSEEE@@@???EEE@@@EEE[[[\\\JJJ222222666444999444@@@]]]555555;;;555555333222;;;444222222666333333333222<<<>>>@@@777<<<777<<<<<<<<<555:::111333>>>>>>888888???SSSOOOVVVUUUPPPlll;;;FFF>>>>>>777333333<<<;;;222888555777000:::444111555111666AAA???QQQ555444???111111;;;888000OOO...---+++555222---///111333...555>>>???GGGAAA000+++222@@@@@@GGGK.eeeKKKAAA444111+++000'''+++)))###+++AAA111111QQQ QQQ999222OOOAAA:::;;;///<<<000---+++000***===+++666888+++...,,,)))$$$SSS ,,,!!! 888###"""---777...---111444%%%$$$###""" ###$$$"""'''222(((***+++---((()))''',,,000...222,,,666222222:::777......444111222444888333111;;;;;;BBBGGGYYY^^^OOO@@@JJJLLL999BBBNNNLLLNNN```VVVLLL<<<000777:::;;;999BBBFFF888FFF---111222;;;999666888777444777222000777777666555999555999;;;555999666444444:::CCC999<<<999999FFFSSSPPPbbblll___JJJCCCCCCAAA<<<666444222000666666555222444///333000***111222000666AAA888PPP//////444222...000...+++))),,,)))---FFF,,,&&&:::666666555888<<<999SSS;;;...***,,,===jjjvvvD&^^^SSS:::,,,111(((---;;;555'''&&&###;;;333CCC999DDD<<<000)))222+++444)))(((---((()))'''AAA***444'''+++...222;;;222555!!!!!! 000"""  ###"""&&&((( ###999777,,,555---%%%!!!$$$$$$***,,,...555,,,&&&,,,111---222...111)))---...//////777444...111222333///333:::333:::999:::BBBVVVKKKHHHWWWGGGOOOFFF:::;;;888BBBDDD^^^AAAZZZ===333555222:::666888MMM<<<===444000...<<<333555???CCC;;;444222555333888444111555///999HHHDDD777000333:::FFFjjjDDD???AAA@@@???CCCZZZzzzwwwpppLLLLLLAAA666777666555333000333OOO222777666333222444222:::777333>>>222444999666888555:::---888666///))),,,333,,,+++---333...111;;;,,,888:::;;;===...(((---QQQKKKzzzssskkkfffYYYGGG>>>***---###'''888$$$%%%>>>...///111:::EEE;;;:::)))---333111***%%%+++&&&"""+++---888%%%,,,OOO...>>><<<:::000''' """"""'''!!!+++$$$>>>$$$+++ $$$(((???,,, ###$$$$$$)))III***(((666---+++***...---((($$$&&&+++,,,333>>>CCC,,,111333444000999,,,111:::;;;333777III;;;HHHkkklllGGGJJJKKK:::888888BBBGGG555FFF888000777999<<<777333000666:::///666===666777555888444???222444???<<>>:::OOOccc;vvvkkkLLLAAA444777777444666222888,,,444888111444777555>>>;;;AAA777555111111AAA===CCC333666111111...(((...888)))***333111((())))))666:::UUUggg444111888...+++>>>@@@LLLOOOOOOWWW]]]JJJ>>>'''))) """%%%$$$ &&&***)))555...bbbPPP***EEE'111***)))(((%%%###DDD000'''$$$???777III,,,///JJJ///555%%%  222///"""KKK%%%444!!!***!!!%%%'''''''''###***AAA%%%,,,111+++(((000555222'''***(((***,,,---///aaa666111111444...888000222666999333444CCC666===IIIXXXOOOoooGGGEEEBBB666...###)))---::::::555555000000555222666:::777FFF;;;222BBBAAA///333AAA444777===>>>TTT===>>>555555555555>>>???111;;;===???666555<<>>444888@@@___<<<222666111HHH888;;;333555222:::)))222000///111***(((222DDDHHH,,,DDD333'''///---999MMM___aaaRRRIII@@@999---&&&"""%%%%%%...)))+++''''''(((%%%111^^^))),,,FFF///111"""$$$)))&&&999***%%%<<<"""555===###222000***$$$$$$$$$!!!""""""%%%333---###***&&&###!!!"""#########&&&%%%(((%%%+++(((---,,,EEE888,,,+++***---//////333444444+++,,,666///CCC///,,,444333666---111999:::XXXEEEUUUIIIMMMOOOIII::::::'''$$$...000999222///555)))///333;;;111888:::888999000333555333222:::000888777888???;;;777888;;;???555OOOAAA<<<555LLL===333<<>>:::---BBB***333DDD===...///,,,...///---:::,,,@@@>>>++++++333---+++///***------CCC>>>JJJ===222666111***)))&&&&&&$$$ *** ###(((""" '''&&&%%%///###%%%... ###((('''%%%&&&(((((("""%%%000%%%***$$$###&&& &&&***'''!!!...###///333888!!!!!!!!!""" $$$ )))(((...&&&''',,,(((%%%555,,,******---///333(((666111:::///,,,222777///000111333444000CCC555:::LLLTTT@@@777???<<>>222555444888999888555555===999666;;;999666777777555555===BBB;;;666666IIIMMMKKKMMMPPPhhh94.\\\BBBGGG666<<<999;;;111111...444555AAA:::222///===444...888222333000999222///===---///111000111---555222222888555<<<333999000000;;;333333777222444,,,000444///000,,,222666***%%%$$$+++%%%$$$ '''!!!!!!111&&&'''...$$$""""""'''%%%***&&&(((&&&++++++'''DDD///&&&///)))&&&""" $$$222!!!&&&###===FFF888999!!!,,,  '''"""%%%!!! ,,, )))MMM***'''(((&&&)))+++...+++000000***,,,)))...+++333...555444***???000777777333666666999AAA444<<>>999555444:::===777888666AAA999777<<>>...===,,,<<<555CCC333333666888444000)))......///111+++***+++,,,)))((()))$$$+++%%%$$$$$$&&&,,,!!!888!!!!!!(((""""""&&& (((%%%,,,!!!%%%>>>777%%%+++...333((("""### $$$$$$BBB333""" 888###!!!,,,'''###***"""---"""###%%% )))%%%$$$ $$$888+++)))&&&(((000:::BBB+++000444+++444///555111444...222//////555999;;;111222333555666;;;===BBBMMM===777DDD>>>@@@777FFF777DDDNNNLLL777---///......444444///,,,---555222000***888999@@@444999EEEUUU<<<<<>><<<111888888666666444333DDD555111<<<<<>>@@@BBB>>>666333000444000666222444,,,***BBB000GGG///***222///***...--->>>OOOOOO>>>:::HHH999888444222777555DDD666333666,,,000111222888@@@GGG???<<>>111---///111444666222,,,111999444999222111,,,nnn???\\\aaabbbccc:::444---000222...---++++++333---)))***%%%$$$***))))))'''(((((($$$"""***&&&555!!!&&& &&&  ((((((###$$$&&&,,,"""!!! &&&$$$%%% !!! 555GGG[[[555+++(((!!!!!!!!!""",,, ###)))...111'''000...(((222+++...---(((...222KKK@@@---***+++)))555111666222111<<<888HHHMMM>>>999;;;>>>666>>>AAAEEE888666777???ZZZxxx???888444555666666777,,,999///222TTT777333222---777---444000666999444>>>III<<<888>>>777777555555444GGGKKKggg000---333;;;>>>>>>EEE777555;;;<<>>]]]@@@>>>>>>888111JJJzzz888999PPP===CCC999CCCAAA777555222666111******888BBBOOO???000000333111444...,,,+++,,,333222999KKK<<>>666444666:::555~~~eeeFFF333222<<<999===CCC222777888999DDDNNNUUUMMM@@@???;;;CCC333111000444888111777111333444555444///555///222;;;999222///000333444444>>>HHH...444+++111999BBBVVV 3YYY888111000%%%(((222,,,(((///000---444...:::555###VVV***"""###""""""$$$ '''---"""$$$"""'''$$$ !!!000888'''***$$$(((***''''''!!!'''###$$$'''%%%"""''')))333<<>>///)))$$$######%%%+++)))&&&000777---!!!###'''VVV888444***+++'''""")))000777***&&&888,,,'''999 """""""""[[[eee)))'''$$$,,,###+++...:::]]]///+++555***AAA777,,,******(((888,,,111......333,,,...---"""---...666,,,===GGG888666EEEFFFcccccc111888AAAOOOGGG555555222888---...)))<<<888+++&&&TTT<<<333000444111+++******...++++++,,,222777???888000;;;<<>>III===<<<---555+++000FFF999:::999222>>>777666000444+++---'''***///MMM000...ZZZkkkJJJ444555jjj999------)))+++%%%%%%222<<<%%%//////!!!+++'''!!!000''')))!!!FFF%%%)))&&&BBB333MMMeeeVVVddd???999...)))+++ ))))))BBBEEETTT***###""""""""",,,...eeeiii------???***777???555))),,,333333...(((---111---000------'''///888333---444...---333;;;555<<<@@@555NNNqqqOOO999---///&&&000+++///000+++111+++---555///EEE333***000222---+++---...+++666<<<222333666>>>vvvggggggFFF444333000000666,,,555666,,,444111999999//////888222111///111222777///333333666888<<<777:::;;;666888CCC===;;;333777666888<<<555666FFF---111222444AAA222''',,,,,,BBB888ZZZ333111111***---666)));;;!!!&&&$$$###'''DDD555'''hhhZZZWWW555222FFF888'''000$$$###,,,555aaa(((!!!###(((!!!555!!! !!!,,, '''(((!!!+++"""...***???111%%%%%%000...BBB%___000111  $$$???555eeeEEE$$$ %%%***$$$"""$$$222111111000^^^,,,000<<<000,,,444;;;rrrMMM777+++,,,444000///...&&&(((555999///777@@@***888;;;===///:::,,,???777,,,555444333%%%(((***333:::666(((222---+++***---###)))...999***,,,(((...111333---555555666JJJmmmaaaKKKSSSCCC555000,,,,,,;;;666111555333,,,......******---333***111444...444,,,000444111777666888444555@@@888888666666888;;;222777555555???333...---555===222...)))444555///***...(((------%%%###***AAA&&&)))888111((()))&&&444&&&...>>>NNN???BBBSSS,,,***%%%)))&&&(((%%%###"""'''333--- +++!!! ,,,!!!%%%333111...<<<$$$&&&===bbbccc>\[[[SSS---)))""" !!!%%%///...VVV***!!!!!!###,,,+++"""&&&!!!+++,,,+++DDD---'''888>>>III>>>OOO4888000666888+++---+++"""&&&111666***---444222CCCGGG)))+++===---(((555+++###)))(((000444,,,------)))!!!******)))...$$$$$$)))(((+++444((('''666///@@@111999999...AAAUUUeeeNNNGGGKKK>>>,,,***(((***222---&&&***,,,***---333///444...,,,///---...///---000...///666444666///777222666LLL555>>>///VVV333333444333111///***000;;;;;;,,,888'''444***,,,333///$$$"""''',,,!!!&&&,,,555%%%'''%%%'''%%%%%%+++ %%%&&&333<<<---%%%DDD---$$$"""&&&$$$!!!""""""111&&&###***!!! ((((((222666333:::@@@777IIICCCWWWHnnnlllqqq---HHH)))!!!$$$ %%%%%%'''"""###"""...***"""%%%%%%******((()))999---888HHHoooppp___MMM888((($$$((((((%%%'''&&&%%%%%%+++,,,)))---(((***&&&666+++===DDD+++333:::...+++,,,((((((,,,***///))))))+++$$$((((((%%%$$$---&&&%%%------333+++,,,)))%%%)))(((222:::???IIIGGGIIIAAA***---)))'''***(((+++000,,,000222***+++///000+++***---666:::000---111...------222///333222444666777111>>>888777444444444555---HHH222000777555111000???000111---%%%&&&;;;###$$$000888$$$&&&%%%***%%%$$$$$$%%%$$$ !!! MMM,,,333+++///JJJ$$$%%%!!!!!!777,,,(((CCC***KKK(((###999(((((()))IIIQQQMMMKKKhhhttt*5( 8333%%%%%%777222!!!,,,III%%%YYY444)))%%%+++---888@@@<<<...///666???gggiii```GGGWWW999AAA---444...&&&///)))%%%+++)))))))))+++...///,,,///444---+++***(((%%%222333)))+++!!!"""---'''---///...***$$$%%%'''///(((%%%+++***RRR&&&111******+++111>>>AAA***000222999...000(((,,,&&&$$$(((444$$$(((EEE...000...000000***111''')))''',,,111---000///OOO111555444555CCCBBB:::222<<>>:::..."""&&& ---MMM111%%%$$$555<<<>>>???AAA,,,777DDD<<>>&&&&&&&&&'''DDD)))'''333+++%%%%%%###***,,,&&&(((### '''***666CCC,,,&&&###&&&$$$%%%%%%!!!$$$%%%'''))),,,+++,,,(((+++)))222,,,111555000;;;+++---333$$$'''"""///(((###---+++>>>TTTNNN111,,,,,,%%%...III))))))...111333BBB111111666333000000333555999222===999MMM<<>>>>>BBB>>>333???777111>>>???>>>///(((+++...///######&&&+++%%%000 +++666""")))"""&&&'''(((...HHH'''AAA"""---"""555666NNNddd...%%%666333CCC &&&AAA!!!'''###444///CCCVVV```KKK333555MMM///***>>>'''%%%$$$$$$!!!;;;!!!&&&###%%%$$$+++RRR666+++ )))OOOvvvGGG:::xxxyyyVVV vvvUUU:::111AAA+++GGG***###$$$+++&&&(((,,,(((######$$$%%%###"""***%%%$$$$$$######'''))),,,***$$$%%%&&&+++,,,III111)))---$$$(((%%%!!!(((!!!###""" '''###((()))+++&&&&&&((($$$!!!###+++%%%(((&&&((($$$"""###...%%%+++"""%%%444___'''000FFF...222000......111///333\\\333333bbbEEERRR111888KKK999JJJHHHDDD???CCC444555===222999444###'''((('''$$$%%%+++***'''((((((***&&&555"""222###)))(((###444 444EEE"""""")))"""''''''$$$###PPP(((---XXXKKK999+++EEE888777>>>555IIILLL"""''' """((([[[QQQ'''&&&%%%%%%)))GGG]]]CCC:::EEEAAAZZZbbbEEEMMM,,,:::---CCC)))((("""&&&$$$&&&!!!###)))%%%%%% """$$$(((...'''&&&!!!'''$$$&&&((("""'''$$$$$$"""&&&222222&&&'''******&&&"""!!! !!! !!! ...///222%%% &&&)))///###!!!###&&&%%%222!!!%%%%%%,,,%%% %%%&&&$$$777***---;;;444---'''000///777===<<>>000???555444((((((&&&---"""""" !!!!!! !!!"""&&&###%%%&&&VVV---(((555###222!!! $$$$$$222+++VVV 000---***333888 !!!###GGG""""""222ZZZ***'''###))),,,...--- ,,,$$$%%%(((MMM; -%%%###$$$$$$###///SSSHHH===<<<333333!5gggGGG444,,,+++!!!***!!!%%%"""$$$***%%%###///%%%((( $$$+++######$$$ ###"""%%%### """)))(((''')))999QQQ&&&'''///***$$$&&&!!!$$$!!!!!!$$$***%%%555'''$$$""" !!!$$$'''%%%###$$$((( &&&((($$$%%%%%%$$$!!!)))000???;;;,,,''';;;555:::???222;;;]]]YYYdddYYY]]]???777111&&&...888......;;;222...---666***''')))"""""""""+++)))***))) ###!!!$$$!!!999///$$$"""111)))***111 ### :::;;;888''')))///'''$$$***;;;%%%333---%%%""",,,%%%:::ccc===)))///"""%%%***WWWOOOMMM333///444qqq#VVV777((( %%%$$$,,,(((!!!)))###&&&!!!)))+++"""'''***&&&)))$$$%%%!!!###'''###"""""""""'''%%%555###===ooo!!!$$$(((((("""$$$"""))) $$$"""!!!!!!%%%"""!!!!!!!!!+++!!!&&&---+++...((($$$%%%###)))"""###$$$222222333iiiGGG000000333???FFF===888888fff NNN^^^VVVFFF///...,,,(((777---)))((( (((...'''(((,,,"""'''''')))+++###''' $$$$$$......GGG///)))777FFF&&&"""""" +++###,,,+++"""###&&&BBB)))***!!!222+++PPP;;;777)))222(((FFF888VVVFFFAAA///555222:::444---///%%%"""'''666***'''000%%%!!!%%%)))%%%++++++$$$###,,,((( $$$"""### %%%###)))###&&&$$$)))222''' """(((---&&&###""""""<<>>???555///$$$ )))$$$!!!>>> %%%###+++  ---!!! &&&!!!222:::---&&&""""""%%%]]]ZZZ999)))000''',,,ccc"""000 -KKK***---&&&!!!555%%%"""######CCC---"""777""",,,222///+++000&&&***!!!###!!!######'''&&&!!!!!!$$$"""###""" !!!%%%---###'''###$$$###"""%%%(((***%%%333999777DDD777,,,IIIWWWbbbFFF999---+++ )))???999CCC###!!!444,,,!!!### ,,, $$$ """(((///$$$### (((+++&&& ...uuufff===&&&%%%&&&$$$,,,)))GGG'''===EEEGGG''',,,&&&+++ """)))$$$"""$$$'''!!!!!!###)))---AAA444000444***###'''!!!'''&&& ###"""###"""&&&111333111######""" $$$'''!!!$$$  """ +++"""!!!!!!*** 333###'''&&&%%%)))---222111ZZZHHH((("""+++""""""$$$###777###???!!!###EEE&&& ---+++EEE 444JJJ333***"""'''"""###;;;...---,,,### )))$$$&&&###!!!777###!!!!!!###***^^^111###XXX###!!!$$$&&&"""!!!(((###!!!!!!...111DDD111,,,''' %%%&&&"""%%%###### """###!!!&&&###$$$ ((( ((( ,,,(((,,,&&&'''$$$!!!===+++)))WWW$$$777%%%***$$$""")))%%% 111,,, """ %%%''',,,CCC,,,999!!!"""$$$$$$777,,,///---***$$$ """$$$ !!!$$$%%%&&&%%%'''&&&:::444((()))MMM(((""" !!!"""%%%(((!!!"""$$$!!!!!!###***$$$"""###$$$ $$$(((%%% !!!%%%###)))$$$"""!!! !!! """!!!%%%@@@$$$%%%$$$$$$""""""%%% )))&&&$$$ 222 +++%%% !!!!!!"""### $$$"""  !!!!!! """"""$$$ ,,, """###%%%&&&444(((***'''$$$---000''''''---111)))%%%'''>>>___---(((+++...---AAARRRGGGNNNpppZZZ<<<;;;GGG333???jjj:::)))///,,,...)))000---///+++)))'''222&&&""">>>FFF'''+++)))&&&(((&&&***,,,'''$$$333+++***+++)))222%%%,,,---,,,++++++((((((...777,,,,,,111111000...---000222444999000333111222JJJ///222555333...000///888000888///888>>>333888+++111***)))""" %%%+++<<>>JJJ888999---AAAYYYEEEAAA000***(((...---,,,///((('''''',,,+++,,,(((%%%&&&&&&%%%)))***)));;;>>>'''%%%+++,,,+++(((+++(((111,,,+++---...((('''...,,,,,,777===333000111111000000555222444444555555>>>333000666666555444444;;;???222999,,,,,,333<<<666111***...///...222555000###$$$555,,,,,,000+++LLL???;;;EEEGGGAAA:::FFFBBB@@@DDDHHH======@@@<<>>777222333000111444000111999---&&&(((444666BBB///333666:::444555777III]]]PPPEEEMMMJJJMMM???999YYY???MMM444999,,,...))),,,***)))FFF$$$###&&&)))'''...---$$$$$$### ((('''777999 !!!"""111%%%###333#########)))"""777"""!!!"""  +++999'''***---%%%***((('''---***,,,;;;---333+++111(((&&&///&&&222###&&&###%%%---(((---+++...555222///000>>>777???SSS000111)))''')))%%%$$$&&&&&&&&&)))+++***,,,$$$&&&&&&+++111555))))))(((&&&***)))''''''((((((%%%%%%(((''',,,%%%&&&,,,,,,))),,,???@@@222333777///555222,,,---,,,...+++//////444222777AAA:::;;;>>>DDD888<<<>>>777888666;;;;;;777BBB555222---222CCC444888777,,,$$$999???AAA???333888777888IIIEEEMMM___QQQMMMAAAGGGFFF;;;>>>000666>>>@@@222,,,+++***,,, %%%+++(((!!!"""111***+++...  ### 444 ---&&&###%%%%%%+++ +++'''!!!(((((( """$$$ $$$###!!!%%%###***'''))):::111"""+++(((&&&'''&&&!!!---...,,,777<<<...,,,///%%%### """+++555***---)))///***333///)))+++000444222;;;@@@000***+++...)))&&&%%%(((***'''+++...---///000&&&222///$$$"""%%%---GGG(((&&&(((%%%$$$%%%%%%''''''((((((&&&)))+++000111FFF444555555222111222:::///222---)))+++---///333666222111555999UUU===ZZZ<<<:::999>>>HHHCCC<<<333<<>>AAAHHHUUUNNN666......///+++///%%%---***%%%(((***$$$&&&###$$$""" !!!AAA"""&&&!!!!!!((( """$$$###$$$ ### ///$$$555))))))&&&+++(((<<>>AAA>>>======IIIEEE555///333222HHHVVVJJJCCCNNN<<<111///===555000000999OOOFFFAAAOOONNNLLLYYYGGGJJJDDDHHHMMMYYYeeeKKKGGG@@@888///+++***111'''(((///)))$$$&&&'''$$$"""""""""%%%&&&"""''' ---###999 000:::MMM """!!!... $$$%%% ###::: """))) ###'''???...444===000,,,PPP***(((&&&------(((,,,>>>&&&))))))---&&&///>>>dddxxx,,,,,,(((&&&###%%%&&&)))+++444)))+++,,,000666,,,))))))***,,,222>>>FFFAAA___555111///***)))&&&(((+++%%%$$$***))))))'''"""***%%%333+++===###&&&((()))((($$$$$$&&&***''')))++++++)))))),,,---+++000...///+++---***,,,...///999111333444===888111444555111333,,,222444FFF>>>SSSGGG===@@@999<<<999===AAA>>>AAA222:::nnn======FFFeee===++++++888///777HHH???BBBBBBGGGKKKYYYrrr>>>III;;;eeebbbCCCBBB===FFFKKK///---333,,,,,,---///"""$$$$$$!!!!!!%%%,,,+++&&& """ !!! ,,, ;;;&&&+++'''&&&!!!%%%)))000$$$!!! ((()))$$$===AAA%%%***///:::111(((&&&'''''')))///777)))555CCC...>>>///''',,,444777666((('''&&&...***///***(((---,,,///---+++;;;...&&&(((,,,'''(((---333PPPNNN;;;///,,,&&&&&&&&&(((666((('''&&&)))DDD,,,###%%%%%%)))(((***)))###"""&&&%%%(((&&&&&&((((((******(((+++))),,,,,,+++'''+++,,,///---///------+++===,,,...666222555111999===AAA777---///444<<>><<<@@@MMM666;;;777555IIIKKK888LLL@@@DDD???888+++(((333]]]VVVHHHHHHEEE|||zzzJJJTTTJJJCCC<<>>''',,,555,,,,,,+++(((###""""""+++,,,???bbbhhh???+++---333***'''%%%'''///(((%%%)))---444***+++---&&&'''$$$%%%######$$$'''555$$$&&&***)))(((###)))***))))))(((+++,,,++++++***+++333///333///...111***+++222222444999::::::555333---222CCCQQQ@@@QQQCCC???PPPFFF===KKK@@@???555777444777999jjjGGGDDD:::;;;888???666444EEEDDD>>>DDDEEEFFFOOOJJJDDD===bbbIIISSSSSSRRRQQQ>>>AAA???<<<---,,,555@@@555000'''&&&&&&)))(((%%%888 !!!!!!"""!!!""" ))) '''"""!!!,,,000%%%JJJ...000$$$ ,,,   """!!! +++)))###%%%"""***555HHH###$$$%%%:::---111+++...'''+++,,,******<<<+++...000333******EEE666444''')))...+++,,,)))'''&&&$$$***,,,...''',,,......,,,))))))'''"""+++777---444iii:::''',,,***%%%+++..."""666???))))))...666---000)))%%%'''000+++&&&%%%%%%))))))'''(((&&&%%%(((+++,,,'''&&&'''''',,,''')))*********---000YYYbbb111IIIttt333,,,---222777777666444444///777888888===777>>>===KKKJJJ<<>>GGGFFFFFF\\\___RRR[[[AAA777555444...333333...333222((('''(((:::999<<<---!!!"""!!!"""$$$  !!!,,,%%%***+++### 999 !!!%%%"""!!!"""%%%!!!"""$$$((('''===III111@@@NNN333,,,444LLL;;;888%%%......((()))444OOO((($$$&&&((('''...'''(((&&&,,,===222---+++%%%###%%%###((()))666+++)))+++******)))((()))######"""''')))(((%%%>>>RRR&&&###"""###%%%&&&)))------)))...)))///555(((((($$$***'''))))))'''%%%%%%&&&$$$%%%)))((('''%%%&&&((('''***''',,,***'''+++,,,111000333555555555???222000---777444666333666333222888555999888>>>===???@@@III>>>AAA:::BBBCCC???333444???```777<<>>bbbmmmBBBzzzCCC<<>>666666555555666777//////111111///===???>>><<<>>>:::===FFFDDDFFFjjj555333222AAADDDFFF888;;;999444555::::::999777000000LLLZZZQQQTTTjjj|||VVVRRRHHHEEE???777000777888222///222,,,222111///***+++111///'''$$$&&&###%%%"""!!!### """ !!!!!!"""$$$!!!"""'''@@@"""!!!### (((!!!###... !!!!!!###### """###999'''333)))...///---,,,...111333222---%%%...HHH000///***444+++'''&&&###$$$!!!"""%%%"""!!!"""!!!,,,---***((((((,,,(((%%%++++++///)))***&&&888&&&%%%"""EEE&&&###$$$%%%>>>&&&&&&%%%$$$$$$%%%%%%%%%###***$$$%%%'''+++))),,,)))***)))222333888(((444,,,&&&***)))***...---,,,++++++,,,)))...,,,,,,...666...555---000111000+++''''''((()))000111000)))---AAA^^^555777777999888333444555...000333;;;@@@AAA999???LLLAAA;;;EEEBBB>>>:::777666777]]]LLLRRREEE999;;;333666;;;<<<555999)))...GGGGGGPPPSSSJJJHHHRRRGGG:::777444888777------,,,111<<<---***))),,,***999999555&&&###%%%######$$$ %%%!!!!!!"""""" !!! ###&&&!!!,,, %%%%%%!!!"""''' ... ---"""&&&DDD777%%%""" %%%(((%%%///"""$$$+++'''+++333...<<<999333>>>222@@@,,,///...---+++---)))(((...***///$$$"""&&&,,,---"""### $$$'''%%%'''"""$$$((('''$$$###''')))$$$&&&&&&''''''''')))%%%$$$$$$%%%///###$$$'''%%%'''(((***(((''')))PPP'''000)))'''===,,,***$$$$$$%%%%%%...kkk333(((***---)))---***///AAA+++---555+++++++++///111666111111333...------:::---......---000444333......,,,111555111000222777555111666888111...333333555<<<888JJJ;;;AAAEEE======HHH<<<999888888:::888>>>;;;???:::444444666888888333***###DDDLLLIIIdddIIIKKKIIIQQQ;;;===@@@888>>>444,,,,,,888111+++***888111)))((((((444---((((((###%%%'''$$$%%%888$$$)))$$$"""%%%""""""***333777"""(((  ===666 $$$###"""###HHH###$$$!!!!!!'''######%%%###)))'''&&&+++:::///222777222'''$$$***MMMWWW666555666000+++)))+++---&&&!!!((()))+++---&&&%%%'''+++)))%%%!!!"""((('''%%%((((((((('''+++(((###$$$'''&&&"""%%%***---&&&&&&---%%%$$$&&&%%%%%%'''&&&,,,///'''$$$***'''***$$$###(((&&&,,,+++......,,,(((,,,...+++,,,---222333...,,,'''...000......222666222222555555///---...,,,///333222///,,,111...---===333222333222555444999444444000...444111000===FFFLLLAAA@@@;;;===:::FFF???@@@999<<<555666GGG:::]]]EEE555666555555777666777---)))---CCCKKKEEERRROOOKKKNNNJJJBBBIIIEEE777HHH555<<<---***(((+++***)))---,,,666***)))&&&%%%&&&$$$'''&&&'''"""%%%---"""###!!!!!!!!! $$$###555'''$$$'''%%%))))))www ...'''\\\'''%%%$$$###$$$!!! ***###"""$$$((((((000''',,,+++777???;;;...---...(((BBBwwwQQQ---...DDD+++)))***!!!)))$$$%%%///)))(((&&&(((++++++555%%%!!!%%%((('''(((&&&[[[((('''###%%%'''%%%&&&$$$$$$$$$'''))),,,,,,,,,(((%%%"""(((&&&'''&&&((($$$((('''''''''%%%$$$&&&***,,,000111,,,///...******))),,,111+++***+++333+++///111,,,---111...,,,444+++222444555555444...000777<<<<<<777222333111999222111111+++777<<<@@@777:::555444666...111666:::KKK:::???QQQ>>>777888???AAA===;;;888999III888???===555555888777777777888222222...777\\\hhhsssXXXSSSPPPNNNHHHCCCBBB;;;222000555444333333222333------:::)))((('''"""&&&%%%%%%%%%$$$""""""!!!""" """###((()))  ******!!! !!!### &&&!!!######&&&"""(((,,,&&&### $$$!!!###%%%'''###""" """%%%///---(((&&&///111---222,,,KKK;;;---SSSOEEE'''###***...%%%&&&)))000'''***'''(((***&&&(((***)))'''+++"""&&&###'''&&&%%%%%%'''&&&%%%###"""&&&(((###%%%%%%$$$$$$ ###'''%%%%%%$$$'''&&&''')))%%%((('''((()))(((&&&'''((('''&&&777---)))))),,,+++***))))))***111111///+++...111...111:::444//////,,,000///111111<<>>>>>:::???666777666444------+++---888888DDDLLLMMMRRRLLLhhhKKKAAAQQQ888666777555777111...000,,,111>>>***'''***'''...---$$$%%%###---===+++%%%(((""" """&&&$$$'''&&&$$$### 666 222!!!lll!!!""" &&&777///$$$"""!!!!!! ''')))!!!$$$666$$$&&&######'''%%%bbb111$$$$$$!!!###%%%>>>555UUUPPPQQQ666###&&&###&&&555///%%%)))(((((('''+++))),,,******&&&&&&$$$(((&&&!!!%%%&&&$$$&&&***222'''((()))&&&)))+++%%%---(((***+++)))(((***'''&&&((()))))))))***$$$(((''''''&&&)))))))))--->>>222...***444333888333///000333///999777777555666111333CCC...333333444000444111,,,000000777999666BBB999???EEE:::>>>;;;AAA444333777333222555111000444<<<333555;;;:::777999<<<888CCC444888>>><<<888===III<<>>:::777:::666555888888777444111((()))///;;;KKKLLLcccTTTHHHLLLIIIEEEDDDTTT333:::>>>555444777000...++++++%%%,,,///***(((---333)))'''&&&---""",,,%%%***### ###""" %%%''')))((()))%%%$$$"""###... ***+++### &&&%%%+++### %%%!!!$$$ ***######!!!$$$%%%!!!### """///###""""""$$$$$$&&&%%%$$$%%%)))!!!(((000000777...###,,,333***)))+++(((%%%...'''...---111+++///...,,,'''######%%%&&&'''(((&&&+++)))&&&(((,,,,,,((($$$(((,,,,,,&&&***,,,,,,)))((())),,,,,,+++---******(((''',,,)))***((())))))+++222000,,,,,,***///***,,,000...///000333888000111///555777:::333000888;;;222...111+++,,,222555KKK777999;;;NNN===222000777999999444555444444444555444333444JJJ888888BBB???888888:::<<<888444666;;;===777@@@DDDFFF======AAA===;;;???:::777888888;;;@@@;;;333111444...333888KKKAAA===GGG```JJJWWWAAA999333;;;999999555444000***+++(((''',,,***++++++///<<<555///)))...''''''&&&###---%%%(((***:::!!!###;;;&&&###$$$%%%((( <<>>***%%%&&&$$$### """---***(((******///---***)))+++DDD---***,,,***222222888***(((,,,///,,,+++***)))&&&,,,)))***,,,------+++,,,---000///++++++,,,333///...,,,...***111111---...222999444444333???777000111222,,,111666222,,,222555:::WWWHHH999111111444333000888888666444<<<555333777666777666111111666<<<<<<;;;::::::444<<<333:::888999999===AAADDD>>>???:::;;;;;;;;;:::===:::999AAABBB888555333444777:::555CCC<<>>...***+++111+++&&&)))<<>>333000///111///444:::<<<555<<<444444333111444222111111>>>???===;;;>>>444000222000777<<<999===JJJKKK<<<===<<<;;;;;;===>>>>>>???CCC:::;;;>>>;;;:::;;;::::::555@@@XXXWWWKKKbbbIII<<>>:::---,,,111(((+++------))),,,)))))))))222999>>>,,,))) %%%!!!)))$$$'''#########'''###""",,,*** $$$$$$555 ###$$$"""XXXVVV555 %%%===%%%---&&&!!!&&&!!! """!!!""" !!! $$$###$$$%%%!!!&&&&&&%%%((($$$$$$%%%...777666222III^^^666666777***$$$)))......(((+++)))777444???...+++%%%%%%$$$(((&&&)))))),,,******///...***,,,...777,,,---------333;;;888+++...++++++...333999111000111222...444666---+++222555///+++111///---111//////000...DDD...---777444000666===DDDKKK555888000666111444000...111222;;;:::;;;DDD666666666444EEE333000444333444KKK888888222===>>>444222333222333EEESSS:::888555111......666777777555===???DDDBBB<<<:::999777:::999777>>>@@@:::=========:::888>>>===EEEDDD@@@EEEEEEBBBMMMBBB;;;DDDBBBVVV===III333000222000---111......+++***888---'''222+++000,,,%%%!!!#########""" ###$$$KKKFFF***CCC///***###$$$+++ ((($$$CCCAAA444!!!"""BBB%%%&&&BBB$$$!!!"""&&&"""###&&&###***%%%%%%"""$$$%%%(((''')))'''$$$+++333555VVVsssCCC555...000***<<<222&&&'''---...+++666,,,222******&&&(((%%%,,,777111***(((***...444>>>222000---000444///+++...111///111222111111===333555333BBB999444@@@;;;444<<<:::444///000333333......---...+++444111444???999444999444///???MMMKKK555111000---777000000---///111222111777555777000111<<<:::999///222===444@@@;;;???444222666666888333333111222888888666555999000222222333333999999CCCDDDBBBGGG999999666;;;;;;;;;CCC===>>>???@@@DDD???444888===HHHQQQ;;;<<<@@@>>>CCCRRRFFF===DDDHHHHHHCCC333555555555000///))),,,***,,,---&&&333lll555+++---'''"""%%%((('''%%% !!!%%%%%%***$$$ ###'''+++&&& $$$---!!! ;;; 333%%%,,,"""222^^^$$$(((!!! %%%)))""" """!!!%%%"""!!!111%%%######$$$$$$$$$***"""$$$&&&((()))111---111000;;;cccLNWWW777888999,,,444000333///,,,...+++---+++'''***))))))(((000000111000---+++,,,//////444@@@000...---888666999555CCC///...222333777111>>>:::<<<777===<<<;;;@@@000666:::<<<666555888:::444===///...///000---...000000222666777666FFF999777@@@111111111333***,,,,,,111,,,,,,000111:::///333222<<>>444BBB999===GGG555777888<<<666666888444333===:::888666333333888555777555AAA???===@@@AAAGGG<<<999@@@<<<>>>@@@999>>>;;;IIIAAA999999888>>>RRRCCCCCCEEE===AAA@@@EEETTT^^^TTTJJJIIIAAA444111///444111///...+++(((,,,)))(((666aaa@@@(((((("""((($$$***######!!! !!!,,,&&&$$$...$$$###((("""###!!!444$$$ ###$$$!!!"""$$$  $$$ 444 ///...)))  ######!!!%%% )))""""""((("""###&&&)))///$$$%%%$$$$$$(((&&& !!!///---444:::___*JJJJJJ...///333///666333111444...///))))))***000;;;---,,,111,,,///,,,222111111...***,,,+++///000000======:::555555444222222555000888555:::999666SSS777555888333000444888555111000...666000000......000222......000///111444//////---888<<<666000UUUCCC:::222000,,,...---111+++000///333444<<<666555444AAA<<<666;;;DDDWWWKKK;;;777???666777===<<<666777\\\>>>666666666444222222888888BBB<<>>@@@;;;:::;;;???DDD<<>>999///...)))///((('''MMMLLL333;;;############$$$'''"""$$$"""%%% ..."""!!!###"""###"""%%%&&&%%%"""222###  %%%###***(((:::!!!""""""""" """"""###!!!"""$$$"""######///CCC+++%%%!!!$$$&&&%%%777***FFFWWW===999HHHKKKKKKHHH111222222...,,,,,,777<<<===444111,,,---///888222+++***...)))***666333444333000666333333000222222111666555000999888777666000222777666444JJJGGG333222999666000111222111222---111...bbb777222333555333000...000CCC...000,,,---555***,,,111777999999111000CCC<<>>888222999:::666AAA555222333777555---444444666999AAA===???CCC@@@???<<<<<>>>>>;;;444888AAAAAA@@@>>>:::888888333222333HHH999;;;IIIbbbyyyccceeeNNN999111///333222...111'''+++*********&&&$$$%%%$$$'''$$$%%%'''$$$$$$&&&%%%###%%%$$$%%%%%%!!!!!!'''!!!%%%'''"""888,,,---***... $$$+++"""$$$  !!!"""((($$$###$$$ %%% $$$...***$$$###"""$$$&&&---???555888000WWWDDD999:::444222,,,---111)))***000777???SSSCCC???111111---,,,222++++++***&&&///444111222......000,,,...666<<<444555555OOO888999888666555666444;;;222777;;;333000333555444///PPP222222000111222888111666555777;;;111444222222000111000------+++***///333KKKJJJ666333,,,,,,......)))000+++,,,...000444>>>;;;&&&&&&+++///555888AAA???;;;>>>:::333///777333444333777999......000LLL444---...222@@@===JJJBBBQQQLLLHHH;;;AAA:::888<<<>>><<<:::===999999AAA???KKK333777444000$$$''':::;;;FFFOOOVVVrrrKKKJJJJJJ<<<888BBB333000...+++************$$$'''((($$$'''///'''&&& %%%###### !!!%%%""" &&&!!!!!!"""((((((***###'''%%%///,,,111!!!!!!!!! &&&$$$ ((("""!!!"""###$$$ ### """$$$$$$"""###!!!***'''222***555:::IIICCC555333BBBAAA222***,,,...555@@@333222///111444111000...777%%%***+++---,,,)))(((444777333...000222111;;;888;;;===???444;;;===777666;;;666:::;;;222222333777666666333222333444777;;;===999666333444333666444>>>777666888333333333///333111///...,,,,,,333222BBB666:::bbb333***...>>>+++,,,------222666333222555AAA(((***...333444HHH777===<<<888<<>>>>><<<888999555888===<<<<<<;;;777===DDDAAAAAA<<<;;;000+++(((((()))777[[[kkk -YYYPPPAAACCCAAA666222333...;;;///***'''&&&%%%###&&&&&&%%%***'''%%%&&&'''### $$$%%%%%%'''### """"""$$$&&&((($$$///BBB%%%&&&!!! $$$&&&$$$  (((***!!! ###111 ---'''&&&111&&&'''%%%"""!!! !!!$$$###&&&((((((&&&%%%---777)))111---===EEE000<<>>888@@@777444777QQQ999888444666777777555999999::::::<<<:::555000666777999555777;;;999444888666444000444999666333111444444222000000222333///222555555:::999444111333333444...///000:::GGG111777666:::???LLL555666///444<<<666///555555777???XXX444333///FFF===PPP777)))***111555000222JJJ...333[[[>>>>>><<<>>>???<<<===;;;>>>888888999999???<<<:::>>>EEE^^^FFFUUU555(((&&&)))''')))WWWxxx___sssaaaMMM@@@666CCC333.../////////'''222''''''&&&,,,"""$$$***'''***"""***&&&'''&&&&&&$$$###$$$""""""$$$&&&---,,,)))MMM333$$$!!!"""%%%  +++(((!!!'''###$$$333---999###!!!$$$###((( 555"""!!!###(((+++### ---&&&&&&000((($$$&&&&&&###''',,,%%%)))222===~~~PPP444000444222UUU;;;:::PPP333333555222111333333333000111000555444777222777777<<<===999NNNAAA;;;@@@===888666:::===999999666999<<<888666@@@???:::AAA<<<::::::;;;:::888999:::;;;===<<<777444777555555222///LLL111777111333222111777111222777222;;;AAA:::PPP>>>333444222333444000---000///111333999222555,,,444888===444666666555111666>>>999;;;000333222VVVAAA222+++(((///333444333000222,,,000DDD@@@>>>===<<<>>>;;;>>>===:::<<<999:::@@@>>>@@@AAAAAACCCEEE>>>444...'''JJJ555(((:::IIIIIINNNLLLEEEEEEIII222999///,,,000555111***)))%%%'''""")))111######&&&&&&000&&&&&&***'''%%%$$$$$$!!!###$$$(((!!! """###$$$000''':::***///((($$$*** !!!!!!!!!''''''!!!(((DDD666""""""$$$$$$###)))###"""""",,,+++'''""""""  ###%%%...'''"""$$$)))'''"""&&&$$$'''222999:::@@@VVV555444444666===555FFF444000:::???///...111000///:::222222555888<<<===;;;>>>???:::???@@@<<>>AAA999:::777777999:::===<<>>FFF<<<999===:::666888666444555000...333222000000222555444666555777333>>>@@@GGG333???444444666555>>>...222111333//////222777000444>>>+++...222888111GGG111888888777111777666999???<<<000---...222333444222666111000@@@???;;;;;;;;;999KKK???;;;:::???999???<<>>...000...'''''',,,(((FFF(((&&&((('''((()))######$$$+++***&&&'''&&&&&&%%%#########""""""---LLLlll222%%%$$$ """#########!!!!!!$$$!!! $$$$$$+++))) """"""###???!!!$$$999333((((((&&&'''222!!!$$$&&&!!!"""!!!$$$$$$&&&,,,"""***&&&%%%'''---,,,)))000;;;555444777999>>>111///888555333999CCC:::,,,...333666222:::777333888???@@@<<<;;;<<<>>>@@@AAA888>>>QQQ;;;@@@::::::??????III;;;;;;;;;;;;>>>GGGHHHCCCJJJJJJ???<<<@@@DDDJJJ888IIIAAA;;;BBB???999555444333222111111000000555111444666111666333///888444LLLPPPDDD===444666???AAA>>>???555111111222444EEE111(((,,,000000,,,///777DDD999...000///:::333666;;;555666666777FFF<<<444333444000555666---333888;;;===;;;:::>>>999???DDD;;;??????BBB;;;AAA<<>>mmm***!!!)))"""""" (((!!!,,,&&&555###888###((( ###### """!!!%%%333:::111......((("""""" %%%'''$$$,,,$$$)))'''((('''$$$&&&&&&((()))'''+++++++++,,,000000AAAVVVRRR555???777444777222222...666333888555;;;EEE666888<<<;;;YYYiii???;;;<<<<<>>444===999<<>>>>>@@@444444...555555SSSIII:::000555444000888DDD222444---999---000444444333555333444999===777888777888999999BBB333000BBB999;;;;;;777;;;@@@;;;???666EEE???\\\DDD===???BBB>>>999;;;111000(((###+++///>>>BBBNNNPPPKKKSSS===888222666777000***......+++...---+++)))%%%)))&&&///***+++$$$&&&&&&!!!"""***)))%%%&&&LLLggg%%%'''&&&$$$&&&(((;;;'''!!! 333(((>>>777!!!"""$$$ !!!!!!!!!###///666;;;''''''AAA###$$$%%%%%%!!!!!! ###)));;;!!!"""111!!!'''((()))))),,,000---555///999<<>>?????????@@@<<>>LLL@@@```JJJBBBEEECCCLLLIIIFFFIIIDDDLLLIIILLLCCCNNNHHHNNNPPPBBB;;;<<<===??????999???;;;>>>999:::;;;777777777777777888888999111222000000666???;;;;;;777555555;;;;;;===333666222777777EEEMMMyyy555666555444666999666555111111999555999000333666111555888666666333666===SSSEEE???555111999444<<<999:::<<<===<<<;;;888777===???BBB>>>===AAA<<<>>>888444111)))%%%,,,111111===BBBHHHJJJHHHHHH<<<;;;333333444111...333//////''',,,)))(((((($$$,,,+++###&&&%%%###%%%&&&$$$$$$""")))&&&+++...+++$$$&&&!!!)))(((""" """ 111!!!(((...000"""***&&&%%%%%% """""" ###%%%777ooo???)))(((!!!$$$"""%%%%%%(((333###%%%$$$"""$$$%%%+++!!!###''',,,222777777MMM555\\\EEEKKK>>>222999777333666666666888:::BBBBBB:::888:::@@@999999>>>:::;;;@@@>>>DDDCCC???DDDQQQGGGAAAMMMHHHdddXXXHHHFFFOOOAAAIIIBBBHHHMMMIIIIIILLLKKK???AAABBB@@@BBBJJJGGGCCC===AAADDDDDDAAA>>>:::;;;;;;;;;999;;;888999777999>>>999>>><<<555777444333<<<@@@UUUGGG>>>======888;;;:::888555444>>>???>>>AAA666555999111444444GGG333:::111999777555>>>777FFFDDD>>>SSSddd<<<;;;???:::???EEEJJJ666111888<<<333;;;???666;;;===777======888===CCC?????????AAA>>>999333999///***000333111LLLFFF>>>KKKNNNIII<<<444888777000555---444******444)))'''''')))---(((&&&&&&"""######### %%%&&&'''999***uuu===""" !!!,,,000#########)))"""!!!"""''',,,(((%%% !!!!!!!!!"""!!!//////)))///$$$***'''---$$$"""***%%%$$$"""!!!### ######,,,+++111333///888:::===IIIDDDAAA888666<<<>>>888<<>>===>>>@@@EEE@@@EEEDDDEEELLLCCCLLLzzzOOO===<<<<<>>@@@KKK::::::888AAAHHHLLLEEEDDD@@@AAAAAA>>>:::<<<<<>>;;;<<>>??????<<<@@@999666999;;;>>>???EEE<<<@@@;;;777444222444222333555555999333777777???===<<<999XXX???NNN;;;888888999AAA999444555BBBBBB;;;===999666@@@>>>IIIGGGPPP@@@DDDBBBCCCDDD??????999777555444""")))111111...111>>>@@@DDD???:::555666444555...+++,,,777...111+++***&&&''''''&&&+++%%%  ######---///...888&&&""" $$$,,,+++### BBB######(((555!!!!!!"""$$$$$$ ###JJJ+++222'''((('''$$$$$$%%%:::===''''''***%%%"""$$$'''((($$$&&&)))+++:::777000333:::>>>EEEFFF;;;ZZZWWWHHH@@@888:::AAA<<<:::<<<888555444<<<<<<>>><<>>===<<<>>><<>>AAA???<<>>BBB===AAA@@@@@@???CCCAAABBB???>>>AAACCCDDDBBBGGG>>><<<:::===@@@BBB666888444999444333222<<<;;;666:::;;;888888===IIIGGG<<<<<<@@@LLL888555222///>>>DDD>>>===::::::888:::CCCFFFCCC@@@KKK@@@AAACCC===@@@:::777999>>>"""///;;;777111666AAA===:::>>>999888777:::///,,,111222000///;;;&&&&&&(((000&&&&&&%%%###$$$"""######%%%$$$$$$)))777NNN((($$$)))!!!"""""" (((!!!###(((''' >>>&&&&&&(((333###&&&!!!  $$$222!!!!!!)))'''&&&+++MMM((('''&&&+++$$$"""###&&&'''&&&###///777:::SSS222222444===:::JJJ>>>EEESSS>>>===333777:::>>>:::CCCDDD777999999:::???===>>>KKKJJJHHH===;;;;;;???NNNEEE>>>EEETTTDDDIIIAAAHHHGGGHHHCCCIIINNNOOOKKKMMMWWWNNNKKKEEEHHHFFFKKKGGG666444BBBSSSZZZ===???IIINNNTTTQQQKKKIIIIIICCCMMMKKKLLLFFF@@@BBB>>>FFFEEEGGG???CCC???@@@DDDCCCAAABBBAAAFFFGGGMMMFFFJJJBBBFFF@@@HHH@@@@@@III;;;555KKKAAA<<>>:::DDDIIIEEE>>><<>>CCC888;;;;;;;;;@@@555======<<<;;;<<<999;;;999999>>>BBB666222333444???>>>>>>666>>>>>>AAA@@@???BBB;;;===BBB???>>>>>>DDD@@@AAABBB>>>>>><<>>KKKBBB@@@NNN===>>>===666...///000...///(((,,,---+++###***###&&&%%%%%%$$$!!!""""""$$$###"""'''((((((((($$$$$$"""""" """ &&&''' !!!333$$$!!!%%%$$$%%%#########)))(((""" !!!%%%""" $$$ $$$,,,&&&;;;:::+++(((333333444<<<===;;;AAA===<<<@@@AAAOOOZZZ999444777999<<<;;;AAA:::===???AAA999@@@<<>>999///111777EEE???777999BBB<<<===@@@AAA777888999===888999;;;666888;;;999777777777333;;;===NNNBBB===GGGCCCBBB777999888????????????KKKCCCCCCJJJooo???;;;FFF===///%%%&&&111888<<>>@@@VVVDDDDDDBBB>>>===888333:::;;;FFFCCC@@@>>>===CCCAAACCC999999:::===<<<999@@@::::::===DDD===777:::222DDD888DDDDDD<<<777333:::555777999;;;===>>>EEEAAACCCGGGDDDCCCCCCHHH:::@@@,,,)))111===888@@@FFFIIIHHHMMMAAA<<<222***---...000000777444[[[555&&&111((('''&&&"""&&&+++'''"""###$$$$$$###%%%555***%%%&&&&&&###""")))"""000///!!!!!!  ***'''$$$'''""" """***!!!'''###%%%!!!###&&&"""""""""***'''"""$$$///...%%%$$$***999111)))///...,,,---+++333;;;@@@444888///222111444;;;???KKKHHH<<<666:::JJJ>>>???III]]]FFF@@@PPP>>>JJJAAAEEEMMMAAADDDGGGQQQEEEVVV4%kkkgggyyy qqqfff|||uuurrrWWWPPPWWW___bbb^^^YYYLLLXXXaaaaaaeeeUUUUUUUUUMMMJJJhhhhhhlllZZZLLLccc```nnnooo]]]WWWTTTXXX______[[[WWWPPPKKKOOONNNXXXPPPMMMPPP[[[RRRLLLKKKIIILLLIIIKKKCCCEEEPPPBBB===111111===BBB@@@FFFDDDCCCAAA<<>>;;;<<>>:::666;;;BBB444666999<<<>>>===BBBBBBCCCBBB===>>>???>>>444'''666FFF===???BBB???GGGBBBJJJHHH;;;---000;;;777333...///333,,,***###((()))%%%'''&&&$$$+++### ###"""!!!!!!$$$''''''&&&!!!)))%%%!!!"""$$$&&&$$$ !!!"""%%% '''***!!!###$$$,,,;;;(((&&&"""+++$$$$$$&&&""" )))(((+++222...$$$&&&---222***+++***,,,000666)))...666SSS555444000222444///,,,---...000///333444666======SSSpppEEECCCNNNBBBAAAEEEBBBDDDBBBCCCDDDFFFQQQZZZ ```eeeZZZaaa6vvvYYYddd~~~cccbbb```MMMMMMXXXLLLNNNQQQ```OOObbb|||fffwwwaaa[[[UUUDDDIII[[[___{{{aaaUUUWWWWWWooofffcccooocccjjj{{{aaa[[[XXXXXXTTT^^^TTTRRRPPPQQQTTTVVVUUUXXXVVVRRRKKKKKKLLLIIIGGGLLLGGG777000...;;;DDDIIIPPPMMMHHHIIIAAAjjj___EEE:::333222<<<:::@@@AAAZZZFFFCCCAAABBB===<<<777@@@<<<>>>??????000+++///666CCCHHHCCC===>>>777;;;:::666555<<<999>>>HHHBBBEEEIII>>>DDDFFF???///***111AAA<<<999AAAAAAGGGFFFJJJJJJ777DDD999===999888///,,,)))******,,,&&&&&&(((%%%%%%((($$$$$$$$$&&&"""'''###"""''')))***$$$=== """"""""")))!!! <<<%%%###$$$'''$$$###111###&&&###""""""###///))) ######***!!!&&&***$$$+++'''666+++***+++666'''---111111...------+++///111***...000999777::::::888555...555222222:::>>>;;;??????===999===BBB@@@>>>CCC>>>BBBEEEDDD@@@GGGTTTPPP```\\\aaaccc\\\WWWaaauuunnnZZZ___xxxfffXXX[[[VVVRRRLLLYYYWWWQQQPPPHHHRRRTTTSSSZZZVVVLLLRRRVVVccc\\\bbbvvvooojjj[[[XXXccc\\\fffgggfffnnndddddd```oooeeeTTTZZZbbbcccbbbfffYYYTTTUUUTTTQQQNNNKKKKKKKKKQQQNNNKKK<<<:::>>>AAAEEEKKKLLLLLLFFFMMMMMMOOODDD???AAA999IIIYYY333@@@PPPOOOFFFBBBGGGDDD???<<>>999444666999>>>???AAACCCJJJGGGGGGAAAAAA111((()))111///KKK???AAA@@@EEEAAADDD444<<<777555444...---+++)))+++******%%%''')))(((#########$$$$$$%%%///"""'''%%%&&& %%%###"""###%%%(((((($$$!!!&&&$$$""",,,000HHH""" )))((("""%%%###"""!!!%%%$$$(((###$$$,,,...'''+++'''$$$%%%...///@@@EEE333---222...---,,,///777222444666555111555444666888DDD555:::QQQ===555999777===@@@???>>>999GGGAAA@@@888GGGFFFIIIDDDRRREEEFFFMMM______uuuiiinnn\\\______bbbUUUYYYUUUNNNIIISSSCCCIIIIIIPPPHHHKKKSSSOOOTTTiii```dddbbb^^^pppqqqsssaaa[[[SSSddd]]][[[___aaa___bbbzzzrrr```fffXXXJJJKKKUUU\\\XXXYYYSSSXXXWWWNNNMMMLLLOOOUUUTTTPPPMMMHHH@@@FFFFFFHHHHHHIIIIIINNN```WWWOOOTTT888===:::DDD;;;===HHHLLLQQQJJJEEEEEECCC:::;;;@@@CCC@@@HHH<<<555333666444AAAAAADDDHHH???>>><<<;;;:::;;;===@@@DDDLLLEEEHHHFFFBBBFFFAAAAAA>>>@@@...///222:::===DDDCCC>>>>>>999888:::999>>>;;;333///...---,,,***---,,,%%%"""&&&&&&&&&$$$'''((('''###%%%###,,,$$$!!!######!!!""""""""""""&&&$$$!!!###***!!!!!!''';;;SSS### %%%(((111333666222888$$$###***%%%""" ###"""$$$"""///***+++(((+++)))'''&&&(((///***((()))222,,,000...444555;;;555000@@@999444555888999???KKK???>>>;;;;;;AAA777444666;;;555BBBOOOWWW>>>???CCCDDDLLLJJJGGGFFFFFFIIIGGGWWWQQQoooqqqSSSNNNTTTTTT[[[```XXXUUUNNNJJJQQQIIINNNLLLNNNRRRPPPRRRJJJ[[[[[[mmm[[[^^^hhheeeZZZYYY]]]iiieee[[[[[[\\\ccc^^^ZZZ```eee^^^lll]]]___mmmhhhXXXUUUQQQPPPWWWTTTVVVTTTSSSTTTPPPYYYTTTVVV[[[WWWZZZTTTNNNNNNCCCDDDJJJKKKRRRTTTQQQOOO^^^MMMJJJJJJHHHiiiAAA;;;@@@GGGIIIEEECCCAAA777AAADDDBBBEEEAAA;;;;;;444EEEIII222:::QQQEEEAAAGGGDDD<<<999===<<<888@@@@@@FFFEEEDDDCCCFFFKKKFFFCCCBBBddd&&&(((111777666888;;;HHHAAA<<<:::999999@@@888888555???000111111,,,000%%%###,,,(((###$$$%%%%%%%%%((((((&&&'''(((&&&"""!!!333 """###&&&$$$###$$$((($$$"""######"""'''222222444555iiihhhJJJ((('''(((%%%###333888III###)))===***)))...%%%***333$$$,,,000...333222222:::999JJJ;;;222333999555888AAA:::DDD999444666:::>>>444999999222333333222<<>>444>>>BBB???EEEIIIEEE222777FFF333///<<>>???>>>BBBEEEEEEDDDDDDDDD<<<@@@666+++((('''%%%%%%666===BBBDDD>>>;;;999>>>555;;;777<<<777FFF999---333'''(((***!!!&&& ###$$$$$$)))+++///''''''***(((###!!!!!!!!!!!!""" ###%%%444'''###111&&&###!!!$$$***!!! ,,,CCC000(((333XXX@@@%%%###%%% ###'''///VVV$$$(((///111)))111...777&&&000---,,,===---111111???888GGGFFF???888<<>>;;;???666333444333333000...333---***EEEDDDJJJ[[[IIIGGGNNNFFFcccTTTDDDTTTIIIJJJRRRZZZWWW\\\^^^dddQQQVVVOOOMMMTTTZZZ\\\ZZZWWWLLLOOOVVVQQQTTTPPPVVVZZZTTTRRRaaaYYYUUUSSS]]]aaaeeeaaa___fffeee```WWW]]][[[^^^ccc```RRRjjjccc___aaa[[[VVVUUUUUUSSSPPPXXXfffTTTWWWWWW```WWW]]]ZZZ^^^WWWSSSYYYNNNUUUQQQTTTTTT^^^wwwSSSSSSSSSQQQUUUIIIEEEKKKNNNLLLJJJJJJIIICCC<<<>>>DDDAAADDDNNNHHHCCC@@@777333666:::AAARVVVNNNppp>>>::::::555<<<@@@<<>><<>>888;;;;;;888>>>888888666777___:::222)))$$$&&&###$$$%%%%%%&&&$$$&&&$$$)))777+++***&&&(((###"""!!!$$$!!!###$$$###%%%333 ######""",,,%%%((('''###LLL777///;;;666'''$$$&&&&&&%%%"""'''""""""<<<(((---))),,,444---222---333///+++///111>>>222KKK666222555777IIIKKK888:::;;;;;;EEEHHHGGGAAA;;;888:::777666333666666333;;;777---666666<<<555555FFFRRRGGGSSS]]]SSSNNNKKKIIINNNPPPKKKOOORRROOOUUU___VVVUUUSSSTTTVVVIIINNNVVVnnnNNNLLLIIIPPPQQQ\\\LLLOOOTTTSSSXXXWWW]]]\\\]]]```dddcccxxxlllddd___^^^\\\___aaa\\\```eeebbbaaa]]]```]]]VVVYYYUUURRRSSSSSSSSSXXXUUUWWWQQQTTTVVVnnnbbbWWWWWWNNNPPPQQQSSSUUURRRUUU]]]]]]QQQVVVOOORRRRRR[[[RRRHHHIIIJJJKKKHHHGGGIIIBBB???BBBCCCBBBDDDBBB<<>>AAALLL888666666888111...)))''''''$$$###%%%555###$$$ )))%%%,,,&&&%%%$$$###""")))######"""###$$$''' """ $$$###%%%CCC+++%%%!!!&&&BBB777***$$$...)))$$$""""""###&&&...===))),,,%%%'''---***---...***,,,222///...222000777DDD===222666EEEDDDFFF>>>888444666IIIOOOOOO;;;<<<===888666444222555@@@OOO999>>>555333888888>>>BBBBBB@@@JJJJJJ___jjjPPPJJJ@@@HHHPPPUUUKKKJJJ___KKKOOOSSSTTTPPPWWWNNNKKKIIIKKKMMMPPPPPPPPP@@@DDDOOOTTTKKKTTT[[[jjj___]]]VVV\\\YYYYYY\\\ccc^^^fffmmmaaa^^^```ggg]]]aaabbbjjjxxxeeeaaabbbaaa^^^WWWVVVYYYbbb]]]RRROOORRRYYYRRRRRRSSSWWWUUUWWWXXXVVVUUUYYYUUUUUUYYYZZZUUUTTTQQQLLLPPPPPPUUURRRJJJKKKGGGFFFHHHKKKIIILLLJJJAAAFFFCCCBBBDDDBBB<<<<<<;;;:::;;;999EEECCCOOOCCCEEEAAADDD@@@;;;888???AAA@@@DDDEEEFFFIIIBBBFFFCCCLLLHHH<<<+++000&&&999@@@@@@CCC>>><<<===>>>DDD<<<999777888444333999111---'''(((%%%$$$###+++(((+++%%%999%%%$$$$$$"""###""""""###$$$### ###&&&"""###$$$ !!!!!!"""%%%$$$!!!%%%(((!!!(((&&&,,,---***%%%&&&'''%%%%%%))),,,---(((...///)))///*********(((%%%++++++999AAAFFF;;;888??????:::888;;;555777666888333111444555>>>???777666,,,///333AAAHHH444AAA@@@EEEGGG???BBBFFFEEE@@@EEESSSTTTKKKWWWPPPQQQMMMBBBLLLMMMEEEWWWRRRUUUUUURRRTTTOOOPPPKKKGGGJJJMMMNNNJJJOOONNN<<>>>>><<<888:::<<<<<<<<>>GGGHHH999>>>>>><<<;;;666888666777777:::999TTT///***...,,,$$$$$$'''&&&&&&)))''''''***)))222!!!(((######$$$---444<<<..."""""")))""" $$$&&&!!!%%%%%% $$$)))))))))+++""")))666)))&&&***///***)))---444((()))(((''''''***000222888<<<@@@888:::222666777888666666555888444777444BBB;;;999555111333222555444666000888:::AAAUUU??????CCCCCCCCCBBBDDDKKKWWWGGGHHHMMMVVVQQQCCCBBBAAAFFFOOOHHHLLLFFFfffMMMIIIKKKVVVFFFHHHKKKHHHDDDHHHDDDBBBIIIQQQSSSPPPaaa]]]ZZZ[[[\\\TTTSSSWWWXXXaaa]]][[[^^^^^^\\\\\\]]]YYY]]]]]]bbbfffiiimmmcccttttttmmmgggaaa^^^^^^ZZZZZZTTTVVVQQQQQQOOOUUUSSSTTTSSSYYYXXXYYYVVVQQQVVVXXX[[[WWWSSSYYYTTTUUUWWWSSSRRRPPPIIIRRRLLLKKKIIIFFFGGGHHH@@@EEEFFFBBB@@@CCCIIIFFFEEEBBBAAA===???999777999===FFFBBB@@@666333333999CCCMMMEEEIIICCCGGGDDD===GGG???777666>>>777%%%HHHQQQTTTCCC<<>>CCCFFFQQQsssYYYTTTTTTWWWBBBKKKIIIKKKNNNKKKRRRLLLAAATTTFFFFFF===HHHDDDEEEIIIIIIAAA;;;BBB>>>EEERRRYYY\\\]]][[[\\\ZZZSSSPPPZZZccc]]]nnn[[[]]]cccbbbbbbggg```ZZZ^^^ddd___bbbhhhiiijjjdddpppkkkkkkllldddeee\\\WWWYYY[[[___SSSTTTSSSWWWVVVWWW]]]WWWUUUOOORRRQQQUUUaaaZZZXXXWWWZZZZZZTTTSSSRRROOOMMMNNNNNNJJJFFFFFFHHHGGGAAA@@@BBBAAA@@@JJJYYYGGGEEECCCDDDAAA:::333555>>>???NNN888;;;<<<555777>>>DDDFFF@@@FFFCCCDDDCCCNNNFFFAAA999333???%%%555<<>>???<<<===<<<666666222555...///)))'''***'''&&&'''***+++!!!%%%!!!$$$$$$&&&,,,)))!!! %%%///"""""""""(((&&&&&&$$$###%%%###"""(((...)))===###!!!%%%###BBB''''''))))))&&&+++%%%(((;;;'''&&&******+++,,,000555222<<<444:::888CCCPPPUUUCCC???===HHH???;;;;;;===;;;<<<888>>>666<<<777000666555444111999AAABBBTTTNNNEEEIIIIIIUUUIII???BBBAAAEEESSShhhUUURRRPPPXXXTTTSSSIIISSSLLLPPPXXXQQQDDDMMMEEE;;;666:::@@@===AAAJJJBBB@@@===DDDKKKUUU^^^[[[WWWXXX[[[]]]\\\XXX^^^^^^XXXZZZZZZ^^^iiixxxmmmgggcccmmm[[[\\\]]]aaaccceeebbbkkklllmmmtttmmmhhhggg```aaacccbbbaaaZZZZZZPPPSSSUUUUUUUUUXXXWWWWWWRRRRRRUUUVVV]]][[[WWWUUU___TTTUUURRRSSSMMMTTTNNNLLLLLLPPPKKKHHHBBBCCCAAA???BBBBBBDDDCCCDDDGGGFFFLLLVVV888555555DDD;;;<<<888666333444888<<>>444444111+++;;;===999===:::>>>;;;<<<:::<<<333111555555***)))(((,,,&&&)))&&&)))&&&%%%###'''%%%(((+++)))$$$000---&&&!!!&&&$$$%%%$$$"""%%%"""'''(((### """&&&$$$(((&&&&&&%%%"""$$$&&&%%%888)))'''(((:::******######((('''$$$(((...000...666555111:::BBBGGGWWWpppOOOAAA444888;;;???GGG;;;@@@===888999444666<<<888...222111888>>>BBB:::PPPHHHKKKMMMEEEOOOXXXIIIJJJCCCGGGGGGHHHMMMMMMKKK@@@IIISSS```TTTWWW```ZZZJJJEEEIIIIIIAAA888222666999>>>AAAAAA>>>CCCIIIJJJMMMNNNWWWVVVYYYWWWZZZ]]]aaa[[[ZZZZZZ[[[VVV^^^^^^bbbhhhdddeeedddeeeeee]]][[[YYY\\\ccchhheeecccmmmfffkkkfffhhhlllkkkjjjllljjjccc]]]\\\XXX\\\[[[VVVVVVWWWWWWSSSVVVYYYYYYZZZ[[[^^^ZZZWWWTTTTTTVVVWWWRRRRRRSSSPPPOOOQQQMMMKKKGGGEEEGGGEEEKKKIIIDDDGGGGGGDDDGGGCCCGGGAAA666666<<<===:::777111000***777===EEEFFFHHHFFFKKKIIIFFFEEE@@@888---,,,111<<<555111>>>???;;;GGGSSS<<<:::888888333222:::))))))'''666+++***%%%######'''### $$$$$$###"""!!!%%%&&&### """$$$((((((***))),,,<<>>EEEFFFJJJIIIGGGAAAKKKLLLQQQ]]]^^^aaaqqqLLLEEEHHHVVVHHH>>>:::777>>>>>><<>>888555QQQ[[[CCCFFF999EEE;;;GGGSSSFFF>>>777999666555777888444333111+++000000///555>>>VVVGGGDDDSSSEEE@@@DDDHHH]]]YYYHHHNNNNNNOOODDDFFFUUUEEENNNNNNGGGVVV[[[PPPHHHIIIKKKHHHFFFAAA<<>>IIISSSKKKMMMIIIFFFMMMRRRGGGEEEFFFCCCEEEAAA999>>>;;;111+++)))111999>>>CCCCCCBBBJJJUUUGGGCCC@@@@@@EEEMMM===<<>>777///***,,,///+++333***---,,,(((### +++###%%%%%%%%%)))999222$$$!!!###((("""$$$"""###---///---%%%&&&'''HHH !!!&&&###"""+++$$$###$$$111###)))((()))+++%%%""" """ ***111------///000222222555<<<===:::>>>AAA@@@[[[JJJ???MMM===@@@;;;999777???888>>>999666444...111...333555GGGCCC@@@===@@@===@@@DDDBBBGGGFFFAAADDD>>>NNNLLLGGGDDDAAA@@@333;;;;;;^^^___QQQJJJNNNPPPHHHEEEHHHGGGEEE@@@HHHKKKKKKQQQUUUXXXRRRXXXSSSUUUXXXYYYVVVTTT[[[WWWsssuuusssfff```___]]]___bbbiiigggccc]]]ZZZ___```cccpppsssyyy* rrrkkklll```bbbgggiiimmmuuuppptttnnnlllqqqsssxxxfffbbb]]]^^^```aaaYYYYYYddd```]]]\\\bbbfff^^^gggVVVVVVQQQYYY\\\YYYUUUQQQQQQBBB;;;EEEMMMLLLKKKHHHHHHIIIMMMJJJHHHFFF??????@@@AAA@@@???444***%%%333888BBBGGGDDDDDDDDDGGGFFF>>>???@@@CCCFFFDDD333***222:::888777:::@@@<<>>AAA<<<:::===>>>GGGIIIHHHKKKIIIHHHFFFFFFBBBGGGKKKJJJJJJOOORRRUUUVVVSSSTTTTTTZZZWWWRRRVVVYYYbbbaaaeeeeee kkkfffaaa[[[___dddbbb___ZZZYYY^^^[[[aaannntttqqqgggzzzttt~~~nnntttqqqgggjjjnnnooosss|||||||||tttmmmrrrsssttt```___\\\___]]]YYYbbb\\\YYY[[[cccbbbgggdddkkk```WWWXXXYYYcccWWW___UUUJJJDDDIIIJJJLLLMMMIIIPPPKKKKKKMMMIIIJJJDDDAAAFFFFFFFFFEEE888>>>---222888CCCEEEGGGGGG@@@EEEIIIEEEFFF;;;???QQQVVV666999NNNEEEEEE888???;;;999:::666666888...///222000)))%%%%%%)))&&&%%%))),,,&&&%%%))))))......111%%%((('''***&&&%%%(((''''''&&&&&&222666&&&$$$&&&***###...&&&(((%%%###"""$$$%%%%%%((()))+++%%%"""###'''******,,,///000222......555888777BBB999??????lllVVV@@@AAADDD777???===SSS::::::666666444333222===888999<<>>???BBBVVV\\\CCCGGGHHHJJJDDDJJJIIIFFFFFFKKKMMMKKKHHHUUUKKKOOOKKKEEE@@@GGGHHHWWWPPPKKKQQQQQQ```XXXRRRUUU___bbbhhhnnn\\\```ccccccqqqlllccc\\\oooqqqiiidddQQQIIIRRRPPPRRR\\\aaammmdddiiiaaa\\\[[[aaarrrmmm}}}{{{uuukkk```kkk{{{yyywwwhhhqqqzzzyyylllfffffflll]]]WWWZZZjjjVVV___YYY]]]___eeeeeeuuuqqqlll___ccc^^^TTTMMMKKKVVVKKKEEEKKKHHHQQQOOOKKKPPPNNNPPPUUULLLIII===@@@FFFCCCAAA>>>333'''333@@@GGGBBBFFFFFFBBBCCCHHH===111555@@@DDDBBBDDD;;;CCCEEEIIICCCBBB>>>FFFCCC??????;;;444777111999777)))%%%'''))),,,)))((()))%%%,,,---***,,,(((((()))$$$$$$'''''''''$$$'''&&&'''&&&***'''"""---000((((((((((((%%%+++###(((&&&+++((('''&&&&&&)))(((***111)))111666222444...@@@===BBBaaaIII;;;OOO===AAAIII>>>???GGG@@@@@@GGGBBBNNN<<<333777777555666@@@???<<<444444CCCMMMAAADDDFFFAAAMMMBBBWWW888>>>AAAJJJeeeVVVNNNIIIYYY[[[QQQNNNHHHHHHYYYSSSGGGGGGIIIHHHHHH@@@???===HHHMMMWWWNNNNNNLLLRRRSSSWWWYYYUUUYYY```_________hhh```ccchhhkkkhhhpppyyyyyyooo]]]IIIFFFMMM^^^iiihhhkkkssszzzuuuiiibbbkkkiiikkkqqqtttuuutttpppuuusssqqq|||rrryyymmmrrr|||qqqlllfffhhhaaa\\\XXXiiihhhmmmaaaZZZYYY]]]```tttqqqyyyttt___aaa]]]UUUOOOQQQQQQEEEIIIVVVPPPNNNPPPTTTQQQMMMLLLLLLIIIHHH@@@BBBIII<<<:::...???BBB<<<<<>>CCCHHHIII===;;;777111++++++***,,,+++%%%(((&&&$$$))),,,***((('''(((***EEE;;;>>>'''&&&%%%$$$+++&&&&&&'''&&&999LLL%%%&&&"""%%%%%%(((,,,+++###'''%%%###%%%!!!&&&&&&)))---***222GGG111999999NNN@@@HHHtttSSS>>>CCC;;;666:::BBB;;;666666::::::HHHEEEEEE999666DDD???333>>>;;;:::888;;;>>>???BBBBBBBBBIIIIIIGGGOOOBBBFFFIII\\\QQQaaaNNNPPPMMMLLLQQQPPPBBBHHHIIIMMMVVVCCC???999999@@@JJJAAALLLOOOMMMGGGKKKNNNPPP]]]XXXTTTOOOLLLhhhtttdddXXXmmmTTTTTTYYYTTTVVVZZZdddbbbbbbbbbaaaSSSVVV^^^hhhkkkxxx{{{ {{{ uuummmbbbeeejjjttt{{{{{{xxx||||||zzzrrr{{{ ~~~{{{pppiiifffdddbbbaaasss___XXX[[[^^^[[[cccppp~~~uuudddbbbaaa\\\RRRRRRMMMOOOGGGGGGNNNZZZOOOLLLMMMOOONNNMMMHHHJJJ@@@@@@AAA>>>@@@>>>oooLLLAAA???DDDBBBIIIDDDBBBFFFMMM<<<222333<<>>;;;555666444444:::TTTNNNIII;;;FFFAAALLLLLLEEE<<<>>><<>>===<<<>>>TTTBBBGGG;;;999>>>444000:::---,,,***'''---,,,///+++(((***&&&(((+++---,,,888^^^@@@...+++(((###)))MMM000''''''000%%%...''''''&&&)))(((333KKK...)))$$$%%%%%%%%%(((&&&(((///+++111666===TTT666___SSSzzz*lllRRRFFFSSSBBB<<<:::777;;;777666111555555YYYEEEEEEVVVrrruuulllRRR???DDDGGGLLLQQQHHHGGGKKKOOOOOOLLL\\\WWW???GGGFFFOOOIIIAAACCCDDDBBBKKKFFFVVVGGGCCC999444555<<<>>>CCCBBBBBBPPPAAACCCGGGNNNUUUUUUUUUQQQTTT[[[UUUOOOVVV]]]QQQUUUhhh\\\\\\]]]^^^bbbfffeeemmmssstttppprrrxxxooo{{{ssslllrrr~~~yyyhhh{{{yyyqqqzzzwwwrrrzzztttyyyuuu}}}xxxsssoooqqqtttkkkfffnnnnnniiijjj```aaaaaabbbggggggmmmooofffhhhfffhhh]]]\\\SSSOOOCCC<<>>777@@@HHHRRR@@@666222///000......,,,555111))))))+++)))&&&%%%(((///++++++,,,+++666666+++(((%%%'''+++III@@@111$$$'''$$$&&&$$$&&&&&&%%%&&&222))))))'''&&&&&&'''### %%%,,,111222<<<777;;;>>>TTTfff[[[lll}}},zzzgggGGGCCC999888===;;;999===222111===:::mmm]]]rrryyy|||lllQQQOOONNNVVV___RRRXXXVVVUUUPPPiiidddKKKHHHPPPYYYZZZJJJNNNEEEBBBFFFGGGAAADDDGGG;;;777333777???===???@@@FFFIIINNNMMMMMMUUU]]]XXXUUUXXXUUUUUUYYYVVVWWWaaaTTTZZZaaabbb]]]```^^^ccc^^^```bbbjjjtttuuuqqqoooxxxyyysssxxx - -~~~# - ~~~ooo|||zzzpppkkkjjjqqqkkkrrrppplllpppjjjkkkkkkhhhmmmbbb```fffhhhuuukkkgggiii~~~rrrddd___UUULLLDDD999@@@QQQPPPOOOWWWQQQQQQKKKFFFAAAGGGKKK___cccFFFDDDIIIHHHDDDDDD???===<<>>@@@BBB@@@KKKLLLRRRQQQSSSXXX\\\]]]XXXVVV^^^VVVWWWYYYaaammm^^^```oooeeeeeejjjgggdddeee\\\bbbiiijjjnnnhhh{{{eeerrrwwwzzz  -1"$|||||| -  kkkdddfffjjjzzzxxxyyywwwrrrooopppnnnrrrkkkbbbeeehhhjjjyyytttiiisssuuupppccc___XXXBBB666999???GGGKKKTTTSSSOOOKKKEEECCC@@@JJJXXXFFFCCCCCCEEEHHHEEE777333??????BBB===DDDIIIIIIRRRUUUPPPKKK===GGGBBBFFFBBB@@@GGGCCCCCCDDDAAAHHH777444555333333<<<:::111111---***))))))+++111((((((,,,***@@@333777++++++000///@@@111,,,000:::...%%%&&&'''$$$&&&+++)))***)))---***///...,,,%%%'''666%%%,,,---000GGGAAADDDiii___fffbbbZZZNNNaaa!oooYYYBBBBBB???<<<<<<===FFF222222999===KKKuuu,+nnnttttttgggpppgggkkk~~~\\\RRRRRRYYYIIIBBBMMMIIIIIIJJJGGGBBB@@@999???222333999AAAGGG???FFFKKKKKKKKKLLLUUUUUUbbb^^^[[[UUUYYYbbbUUUWWW___|||eeennnjjjhhhiiinnnnnnqqqjjjoooggghhhiiijjjpppuuummmhhhttt}}} }}}|||xxxttt}}}!$ *$|||~~~}}}iiifffiiiqqqwwwtttrrrttt{{{mmmqqqssskkkfffiiiqqqpppqqqiiipppkkk}}} dddeeeRRRBBB>>>EEELLLKKKQQQWWW[[[LLLCCC555777GGGGGGYYYCCC<<<>>>@@@888777>>>???AAACCCAAAAAACCCFFFQQQKKKRRRKKKCCC666)))111<<>>>>>999999PPP;;;;;;::::::;;;HHHppp)2" -|||zzzzzz\\\UUUWWWUUULLLPPPIIIFFFGGGIIIIIIEEEDDDEEEGGG666GGG???FFFCCCGGGCCCEEEIIIJJJMMMPPPYYYSSSSSS^^^\\\YYYZZZ^^^aaaaaa```ppplllqqqoooqqqooonnnsssrrrvvvbbbooouuuxxx}}}$ ggghhh\\\)". - ~~~~~~hhhbbbhhhjjjpppuuuiiivvv~~~wwwqqqrrryyyoooooodddwwwqqqyyymmmiiiqqqrrrppplllggglll[[[HHHMMMLLLXXXMMMQQQTTTRRRLLLIIIGGG:::GGGHHHfffNNNGGGBBB999>>>;;;DDDBBB@@@BBB@@@UUUMMMNNN```LLLMMMBBB===)))###777@@@JJJMMMNNNTTTMMMCCCHHH666;;;999DDDRRRMMM:::888000///+++))))))))),,,+++///---+++------///;;;...222EEE******+++'''+++111***&&&&&&)))+++***))),,,---222&&&((((((+++'''))))))&&&---'''EEEIII???JJJHHHQQQ]]]uuugggaaaZZZYYYZZZ___HHHEEE___FFFLLL===888<<>>===DDDHHHGGGVVV65%2.%&  (yyyeeeWWWYYYXXXMMMGGGHHHIIIJJJHHHFFFFFFJJJTTT]]]ggg777JJJ???FFFCCCFFFBBBFFFFFFKKKNNNRRROOO[[[___aaaaaagggkkkmmmcccdddnnnqqqvvvzzzpppuuu: }}}{{{  kkkrrrnnn rrr ~~~jjj```kkkvvvrrrwwwvvvooonnnsssttt~~~vvvsssiiitttqqqkkkeeegggqqqZZZQQQUUUUUUPPPIIIOOOLLLLLLFFFDDD666@@@<<>>:::>>>@@@FFFGGGKKKXXXOOOPPPJJJRRROOOAAAHHHYYY???FFFMMMSSSGGGBBB===BBB???>>>KKK;;;QQQwwwfff555...---///***)))(((,,,111//////)))+++***......eee666000555)))'''&&&'''***///000)))+++///***)))))))))+++,,,(((---(((+++***,,,///***...000111LLLDDD;;;SSS>>>FFFpppeee\\\BBBPPP@@@MMMNNNRRRBBBCCCAAAAAA======888:::===DDDFFFPPPXXXwwwBCA@BI=9GsssdddbbbaaaWWWOOOJJJDDDFFFGGGGGGCCCKKKIIIHHH___PPP666888;;;>>>BBBFFFCCC;;;KKKZZZVVVYYY\\\UUU]]]\\\bbbUUUhhhwwwnnnuuuzzzrrr|||gggsss% )  {{{{{{uuuzzz|||xxx||| -uuujjjtttttt|||{{{~~~wwwyyy vvvooo}}}oookkklllgggcccjjjnnnxxx___SSSQQQKKKJJJEEEJJJRRROOODDDEEELLLJJJ;;;BBBKKK@@@BBB<<<999666<<<999:::FFFGGGTTTTTTWWWUUUTTTQQQDDD;;;<<>>???@@@HHHVVVbbbqqq%WZ\a_]]1sssfffUUUVVVLLLIIIGGGEEEJJJBBB===FFFIIIBBBkkkLLL@@@DDDCCCFFFEEEIIIHHHMMMQQQTTTWWW______ZZZ[[[WWW___bbbhhhzzzxxx~~~tttlllnnnnnnrrrxxx#!5R5 ~~~zzz uuurrr  ppp{{{nnnxxx}}} ~~~zzztttyyywwwyyyuuu{{{tttpppoooccceeedddddd```___jjjfffdddSSSVVVIIIYYYRRRSSSZZZRRR999KKKSSS===999AAAAAADDD@@@444333555333>>>999>>>EEEIIIUUU]]]SSSRRRNNNLLLUUU]]]JJJIIIEEEFFFLLLGGGBBB@@@<<<<<>>EEEJJJXXXdddnnn>>CCCJJJLLLVVVRRRNNNNNN[[[```dddYYY???LLLFFFCCCJJJAAA:::999>>>???<<<<<<:::444444999111222...222555222444///&&&''',,,***222666GGG???NNNbbb000'''$$$(((VVV222+++///---...,,,///444000((()))---...000))))))))),,,;;;000+++222222??????AAAAAA<<<@@@>>>FFF???;;;HHHNNNQQQLLLOOOmmm<<<666888TTT999777:::>>>>>>IIIUUU]]]ttt?cnzztnaC/vvvbbbYYYUUUPPPKKKDDD<<<;;;;;;888;;;,,,***333GGGHHHGGGNNNMMMPPPQQQXXXVVV[[[\\\UUUWWWTTT^^^bbbeee___nnnnnnnnniiiqqqyyy~~~uuuqqqyyy -tttnnnpppzzznnnkkkiiizzziiikkkttteeefffiiinnnqqq~~~|||}}}  vvv -mmmsss ttt}}}rrr~~~ uuu{{{kkkkkkiiilllaaabbbcccmmmnnnkkk]]]WWWPPPMMMOOOTTTUUUSSSMMMJJJNNNDDDPPPaaaJJJUUUKKKFFF@@@666666666666555BBBCCCFFFKKKPPPLLLNNNSSSYYYjjjmmmdddMMMCCCnnnDDDCCC999888:::BBBGGG>>><<<444444444999KKK000777---666555999===...000(((***333555@@@[[[qqqEEE,,,$$$%%%***,,,+++///***...%%%(((,,,...,,,***333+++,,,***+++(((///444<<<---777,,,---::::::FFFUUU<<<666???JJJDDDDDDCCCDDDVVVBBBAAACCC555111666:::888333999>>>???HHHTTT[[[pppCdr~tnbK/ {{{fffWWWSSSUUUJJJCCC:::;;;999777111***MMM>>>JJJNNNXXXRRRVVVbbbfffeeecccgggZZZbbb^^^___cccbbb\\\YYYbbbqqqhhhpppxxx {{{~~~ - zzzvvvsssvvvuuupppxxxwwwzzzmmmaaa^^^cccccciii```wwwwwwvvv -{{{wwwwwwbbbxxxmmmyyyvvvyyy -xxxjjjxxxvvvyyyzzzyyy}}}mmmoooeeeaaa\\\dddooorrrfff]]]YYYTTTRRRTTTTTTRRRPPPQQQKKKVVVIIIMMMQQQOOOQQQOOOHHHHHH;;;>>><<<;;;===@@@BBBEEEJJJQQQOOOSSS___^^^```YYY\\\ZZZWWWBBB@@@<<<888;;;WWWFFFOOO???999666555333EEE000000...333;;;444,,,222(((...???333777111222CCCWWWIII+++###***'''...,,,,,,...'''---###'''&&&(((///---)))((((((+++///+++...111111***333===BBB@@@BBBBBB888777>>>>>>AAA???EEEOOO???777888GGG333111111222444666<<>>===555BBBpppQQQUUUUUUbbbdddgggbbbiiiiiiaaaeeejjjeee```iiijjjhhhjjjffftttkkknnnrrr"|||~~~ |||{{{oooeeeiiitttzzzvvvlll^^^aaafffnnnqqqsssqqqoooqqqlllsssooo~~~yyy{{{gggccc{{{zzzzzz -qqqmmmzzz zzz___gggdddcccrrrhhh```aaa]]]XXX]]]XXXPPPXXXXXXVVVPPPTTTOOOLLLOOOOOOPPPLLLJJJHHHAAA>>>@@@===???DDD===CCCrrrMMMXXXRRRTTT[[[WWWVVVGGGHHHjjjAAA777444;;;;;;```LLL@@@;;;???AAAAAA666111222222888000)))222777999JJJ333777...111111>>>111GGG---===++++++***///---<<>>888666777<<<666333000111111111444333:::999@@@AAAKKKTTT\\\iiizzz3dmnuqfT6iiieeeaaaXXXPPPBBB:::BBBDDDCCC>>>999DDDCCCIIISSSUUUXXX___oooxxxpppwwwffffffmmmbbb[[[ggggggdddtttzzzxxxvvvnnnrrr #"& rrrxxxtttfffaaa]]]___jjjttttttrrrooogggfffooouuuvvvxxx{{{yyyqqqppp}}}ooouuuvvvzzzxxxrrreee|||||| }}}WWW }}}wwwxxxwwwrrrbbbhhh ooooooiiiccc[[[YYY^^^```RRRTTTUUU\\\RRR\\\QQQMMMNNNKKKUUURRRNNNPPPAAA>>>AAA???AAA>>>BBBIIIPPPKKKPPPSSSYYY___eeeXXXOOORRRDDDFFF999666666666FFF>>>BBB<<<<<>>ooo777666...222666555111777...???555333333JJJ999111---))),,,:::777===>>>222///;;;######'''###'''&&&"""&&&'''+++...,,,+++---)))...000555:::000777>>>;;;NNNNNNEEETTTdddBBB:::;;;666666999111...111>>>888444444::::::BBBIIIPPPOOO\\\rrrAMY`xxgL4|||]]]YYYVVVLLLEEE???DDDLLLTTTEEEDDDIIIJJJHHHJJJQQQYYY[[[```llluuurrriiiaaa[[[ |||{{{ppprrrjjjssswwwpppyyy  "(~~~mmmvvvoooiiiaaa^^^kkkrrruuu{{{uuurrrvvvpppjjjnnnxxxxxxzzz}}}yyyzzz{{{pppzzzuuuzzzvvvxxx sssrrr~~~  -xxxgggvvv vvvxxxnnniiijjj&#rrrmmm{{{jjjYYY[[[lll[[[LLLVVVVVVOOOQQQTTTTTTQQQPPPNNNUUUkkkNNNMMMFFF777CCCCCCDDDDDDCCCLLLLLLJJJQQQZZZ^^^mmmaaa\\\TTTPPP444***333999>>>999555::::::DDD??????@@@>>><<>>888;;;HHH???666999777BBB+++,,,)))000888222333000666888DDDAAAEEEMMMSSS"!'AQnsPP# ppp___[[[OOOFFF@@@BBBJJJKKKIIIRRRMMMOOONNNQQQRRRUUUVVV```mmmfff}}}hhhfffZZZZZZlll~~~zzzyyynnngggnnnmmmcccuuu~~~ lllXXX[[[fffmmmooohhhppprrroooyyy{{{||||||~~~xxxzzzxxx{{{}}}}}}xxxsssccc||||||{{{ooobbbfffvvv}}}|||()~~~iiillllllmmm' iiiuuupppdddYYY^^^YYYOOOLLLQQQVVVYYYhhhUUUOOOVVVTTT[[[RRRQQQPPPMMMUUU>>>FFFCCCBBB@@@FFFIIIIIILLLRRR]]][[[mmmkkk```___OOO000(((///333555<<<777333<<>>EEELLL666444111------222///...<<<...)))(((+++888222333000777;;;GGGCCCEEELLLoooeeeooo4LMTH2jjjbbb^^^SSSWWWKKKIIICCCHHHMMMKKKKKKJJJKKKQQQNNNTTTjjj{{{xxxuuuqqqjjjnnnmmm{{{|||vvv{{{|||wwwssslllmmmgggvvv |||zzzyyyuuuooonnnnnneeemmmlllpppssstttwwwzzz |||~~~ -~~~~~~{{{ ~~~}}}iii~~~wwwhhh[[[jjjbbbuuu-Jxxxhhhnnntttyyynnnkkkppplllggg\\\UUU\\\nnn|||RRRTTT^^^```\\\RRRRRRTTTVVVSSSQQQ]]]LLLfff>>>;;;:::@@@AAAEEEHHHFFFXXXQQQdddkkkaaaeeekkkfffTTTOOO<<<444000<<>>888888777777111///)))///******,,,---,,,---))))))444666000222000OOO>>>>>>444777000---...???$$$'''&&& !!!###%%%&&&'''***---///......000666888666444000::::::888333333///111+++***))),,,///000///111+++111;;;444555555999EEEBBBQQQxxxNNNKKKVVV --(-3%&~~~iiiZZZFFFIIIEEEHHHEEENNNLLLKKKKKKWWWSSS^^^___aaajjj~~~rrruuukkkzzzvvvuuuyyyzzz yyynnn}}}xxx||| - - |||zzzuuurrrrrrrrrttt}}}zzz|||}}}vvvyyy{{{~~~ - -  zzz -   ppp -|||zzzccc[[[^^^'+ vvvkkktttiiiiiijjjllllllxxxeeejjjkkkZZZLLL^^^GGG[[[YYY\\\XXXSSSTTTSSSOOONNNNNNLLLMMMNNNAAA555777PPPPPPEEEDDDMMMQQQOOOfffvvv{{{dddYYYUUUrrrllluuu;;;555777;;;777777:::>>>===<<<===>>>222222444555///***,,,***+++---...'''+++///222???[[[444888444FFF===NNN444999---,,,AAAXXX### &&&""""""((($$$&&&(((***///---,,,///333===444777555222444AAAAAA333000///000---)))000111000000000111222222///444///222======ZZZMMMIII>>>```tttttt}}}|||aaaUUUPPPIII???GGGOOOKKKRRRdddbbbccchhhjjjZZZhhhssslllmmmooouuu{{{rrr~~~vvvzzzzzzjjjbbbeeeeeefffyyy yyy -kkkhhhtttwww  ~~~zzzzzzyyy}}}}}}~~~|||  - -  ooottt vvv___QQQpppttt{{{ -yyytttmmmnnnnnnggg\\\bbbgggjjjkkkaaa]]]VVVCCCIIIVVV^^^eeeLLLGGGRRRRRRTTTWWWUUUPPPOOO@@@;;;<<<888CCCPPPGGGGGGCCCKKKWWW___fffbbb[[[XXXVVVbbbwwwXXXMMM555777;;;000333;;;999666;;;===888999<<>>hhhJJJ999---...+++...888"""###'''###***%%%&&&))))))+++,,,,,,)))(((+++000333888555888555999222222333111666...111<<>>WWWNNNNNNRRReeejjj^^^[[[SSS___```lllkkkppprrr}}}ppp|||qqqyyyffflllooohhhhhhkkkgggnnnwww {{{|||uuujjjrrryyyyyysssjjjpppzzz  }}}}}}|||~~~yyyyyyxxx}}} -    -~~~rrrffflllxxx|||}}}|||kkkXXXqqq|||nnn^^^eeeqqqiiibbbhhhgggkkk|||mmmZZZ\\\HHHEEE]]]hhhfffkkkeeeSSSZZZUUUgggjjjYYYUUUKKKCCCGGG:::DDDGGGIIIMMMLLL@@@OOOWWWSSSTTTddd^^^\\\UUUXXXTTT;;;@@@CCC666666???555444000111AAADDD<<>>===gggMMM666***---...000...###"""!!!&&&,,,&&&)))((()))***///***...888111---000222555777333666000777///111000...///))))))+++,,,333///444222...222,,,;;;JJJ666777999DDDAAA>>>BBBEEECCCLLLNNNKKKTTTYYYXXX```WWWQQQqqqMMMJJJPPPZZZQQQZZZaaajjjfff\\\hhh[[[eeefffmmmttt{{{tttppppppnnnhhhgggiiikkkaaajjjpppqqqooo~~~|||}}} {{{zzz~~~}}}kkkxxxooorrrzzzuuunnn|||~~~}}}}}}||||||}}}~~~|||~~~wwwwwwsss}}}   -rrrnnnsssvvv}}}nnnSSSggg -~~~uuucccTTTdddkkklllkkkgggvvvkkk```]]]\\\PPPOOOXXXccchhhkkkgggYYYSSSXXXPPPXXXSSSTTTLLLDDDEEEFFFIIIbbb:::HHHtttAAAGGGLLLZZZ___jjjbbbbbb^^^LLLAAAYYY@@@444444666>>>666888666222888999;;;<<<888666222000+++***---222777555222222:::===:::ooo~~~111$$$EEEOOOMMM:::EEE444777999555###"""&&&'''&&&%%%''')))$$$%%%666DDDHHH999333777111///;;;000;;;===444444444666+++---((((((+++)))******...,,,+++...222DDDDDD666888:::BBB???999BBBDDDBBBEEEOOOLLLOOOOOOZZZ\\\]]]UUU^^^ZZZllliii```VVVSSS___aaannntttsssoooccciiiuuuuuuxxxvvvqqqkkksssddd^^^SSSQQQSSS```fffdddqqqzzzvvvuuu}}}|||{{{vvvssswwwxxxyyysssggg}}}xxx}}}{{{|||{{{tttooottt{{{|||yyy   -zzztttuuuyyyuuu}}}ooojjjmmm1||| iii{{{nnniiijjjlllkkkhhhiiiddd[[[]]]VVVUUUaaagggdddbbb\\\^^^WWW\\\[[[SSSQQQLLLBBBFFFKKKLLLaaa[[[888EEEGGGHHHIII```yyyiii[[[ccclll___UUUAAA???@@@:::999CCC<<<::::::333888CCC999888999:::444+++000(((000&&&---III333...333:::UUUccc}}}DDDFFF:::>>>III:::XXX[[[999666111!!!!!!"""$$$&&&&&&***(((+++(((<<>>;;;666888555;;;MMMUUUQQQNNNQQQaaauuujjjccc[[[___[[[]]]ooo^^^___```jjjgggjjjxxxhhhtttkkkkkkpppvvvqqqxxxyyyyyyjjjzzz\\\VVVMMMUUUVVVeeeeeennnzzz~~~{{{xxx{{{zzzooopppggglllvvv}}}qqq^^^rrryyyxxx}}}uuu{{{wwwvvvvvvssssssppprrrtttrrr{{{}}}   |||ooowww}}}|||vvvuuu}}} -  kkklllsssyyy{{{lllfffhhhuuuaaa[[[dddZZZWWW___ccchhh\\\ccc___fff[[[\\\OOOSSSOOOMMMKKKKKKWWWyyycccGGGOOO???HHHNNNYYYgggaaa^^^WWWUUUFFFCCC000DDDIIIDDD;;;777666;;;===000222333777666:::FFF...---******))))))555333111<<<555BBBOOO^^^FFF<<<,,,222KKK???>>>CCCGGG777+++(((!!!#########'''$$$))))))###...---000333@@@999MMM777//////,,,000,,,<<<...---111222///,,,***)))++++++(((,,,///***FFF@@@000...000888222555666...555CCCPPPTTTRRRPPPMMMIII^^^\\\WWWbbbhhhYYY___ccceee^^^yyyyyyxxxyyyoooxxxmmmuuuwwwpppdddhhhfffppprrrrrr{{{aaa[[[cccxxxvvvxxxxxxzzzwwwwwwsssllliiipppsssjjj{{{qqqsss___```eeerrrrrr{{{  wwwmmmyyyuuu}}}yyy~~~{{{|||   pppbbb___lll{{{yyyfffbbbhhhmmmZZZ]]]\\\ddd[[[bbb]]]jjjXXX^^^[[[cccdddMMMCCCYYY[[[OOOMMMiiiyyy[[[777BBB999IIIVVVMMMTTTVVVfff[[[[[[OOO:::222SSSOOOKKKIII???;;;;;;666444888///444;;;333777111000------222---444000,,,+++:::@@@EEEWWW<<<***&&&---333333;;;<<<555666777...***)))$$$&&&$$$%%%&&&)))((('''...+++111BBBNNN:::999333444999333444999RRR888,,,*********)))'''###(((///+++///---???;;;...---000888...---///222666;;;HHHQQQSSSRRRVVVVVVHHHaaaSSSbbbZZZooopppeeennniii-"% uuuwwwaaassslllrrrmmmgggfffrrrnnnxxx{{{zzzyyyrrrhhhmmmzzz}}}~~~ -sssoooiiiiiimmmvvv|||ttt~~~yyydddgggrrrrrr{{{{{{ssszzzyyy~~~!"" ! ~~~uuuyyyyyyiiiqqq}}}}}}~~~ qqqcccYYYdddiiiyyyddd\\\UUUZZZWWW\\\fffkkkddd\\\aaabbbgggjjjiiiVVVTTTCCCKKKOOOLLLLLLXXXoooyyyiiiSSSQQQ888;;;???BBBAAA===QQQaaahhhPPP---AAAaaa[[[HHHEEE???>>>777555///333666333===;;;///333......,,,...000111444,,,333:::>>>SSSAAA444(((***&&&//////222777...222EEE888%%%"""!!!!!!'''$$$$$$$$$999zzzEEE111CCCLLLnnn;;;555000>>>===000...111111111*********+++((((((%%%((('''++++++999000......---555///---///333333777IIIJJJJJJQQQWWW[[[\\\ -zzz[[[WWW\\\]]]WWWdddhhhiiiwwwmmmfffdddRRRdddrrrmmmeee[[[___uuu! xxxuuuooo```jjjvvvuuuvvvxxxyyy}}}rrryyynnnuuuccckkkxxx vvv{{{vvvssswww}}}}}}}}}yyywwwnnneeepppttt "#$#  {{{}}}yyyjjjmmm~~~|||~~~}}}uuuuuu[[[^^^^^^ccckkklll[[[ZZZ\\\___gggfffaaaYYY\\\nnntttooossszzzNNNWWWVVVSSSVVVHHHBBBRRRYYYyyyZZZ___;;;111---666DDDCCCSSSddd```>>>999FFFKKKEEEOOOBBB???@@@555222333666888333///555000333,,,(((///555<<<,,,333000AAAFFFGGG???666KKKNNN666111555---)))000++++++...+++%%%$$$(((((($$$)))''''''GGGPPP:::JJJWWW>>>777777>>><<<888666555//////222111,,,///)))...(((&&&%%%&&&)))---000+++)))'''//////...444555444888111666<<>>===CCCBBB;;;:::444555777666666444111444111000///...333000...888FFF>>>HHH===CCCKKK===444EEE---000,,,+++(((***+++***&&&'''+++###((()))$$$...(((***...,,,@@@EEE888===VVV===>>>WWW>>>@@@,,,//////444)))000)))+++'''***---)))(((,,,555******)))---:::111......111666333111BBB:::FFFFFFUUUPPPXXXiiiIIIKKKUUUMMMVVVWWWcccuuu|||iiixxxppp```fffrrrtttrrrqqqjjj___aaayyyxxx &rrruuummmpppyyypppppp___XXXnnn -~~~nnnxxxaaammmooouuu}}}}}}}}}xxxssstttyyyvvvvvv|||yyy{{{{{{}}} ##('''()''%" -wwwxxxppphhhuuu~~~yyy{{{gggeee]]]^^^mmmdddlllxxxmmmhhhggghhhkkk]]]jjjlll|||yyysssqqqhhhfffSSSWWWLLLIIICCCVVVSSSOOO888:::777***)))000:::999999GGGQQQKKKLLLUUUFFF:::<<>>===@@@FFFNNNUUU******+++'''))),,,,,,)))+++)))+++(((999"""+++---&&&(((&&&---222000///---777666@@@CCCLLL888777888>>>...---...***---(((***((()))$$$&&&---333,,,,,,***(((,,,,,,...***)))))),,,)))444777555===KKKOOOHHHQQQZZZYYYBBBAAAHHH>>>TTT[[[dddfffggggggbbbfffddd___dddkkkxxxzzzmmmWWWBBBWWWuuu~~~rrrsssnnnnnnnnnuuu}}}nnn```TTTggg|||ppp```___hhhnnn]]]jjj xxxxxxzzzppptttwwwuuuxxx||| yyyxxx - #%$')**+,,*+)&$~~~wwwuuuiiikkkrrrxxx~~~{{{vvvrrrkkk```ZZZlllnnnyyywwwgggzzzkkkooooooooo^^^vvvxxxpppjjjccckkk^^^VVVZZZQQQ^^^gggdddIIICCC&&&)))+++'''++++++000666YYYGGGPPPGGGCCCVVVAAA222333000(((222;;;444888444000777333===999666<<<777555222EEE222444555cccBBB>>>MMMJJJ777(((222:::***,,,---777)))&&&''''''%%%)))######)))444&&&)))000000666222///333KKK===???777666666SSS999444111000......(((...,,,)))'''000555...))),,,***)))'''---000***%%%&&&+++...666777777???GGG@@@FFFMMMQQQOOO===CCCVVVTTTccceeevvvooorrrdddaaaZZZ\\\aaavvviiimmmjjjVVVJJJEEEXXXZZZhhhhhhuuuoooooowww -yyymmmggg]]]gggnnngggiiijjjhhh```kkkaaabbbrrrtttxxxmmmrrrtttxxxwww{{{  &#$)+-0//..-,)&   rrrmmmfffYYYlllyyyyyy|||~~~pppyyyjjjfffddd```eeennn{{{|||rrrxxxzzzlllddddddccc___gggllleeeaaakkkhhhcccZZZUUUPPPRRRYYYMMM???EEE===555111000***///888???EEELLLLLLKKKLLLQQQIII111++++++444999888777999===999888888@@@;;;999222666888555(((***333===ZZZ666666999111222***---///---///***,,,%%%"""!!!&&&'''%%%444###111222...---))),,,+++))),,,...555???666222@@@===555MMM888222RRR+++<<<...---...***(((000((()))))))))++++++%%%)))...***++++++777III<<<===KKKCCC???HHHUUUNNNUUUYYYvvvNNN^^^xxxeeejjjuuurrrkkkccc\\\YYY\\\ffffffggg___TTThhhjjjdddUUU\\\tttvvvooovvvkkkrrrsss{{{www}}}rrrlllfffcccuuuooobbbdddqqqnnnjjjddd\\\___rrryyynnniiirrrxxxyyyxxxzzz - -  !$&&*-/022110/--'$   tttmmmpppdddqqqyyyyyy{{{|||~~~yyypppnnniii^^^UUUhhhooorrrqqq|||lllmmmfffeee^^^______bbbfffggg```aaajjjbbbWWWPPPUUURRRTTTNNN???>>><<<@@@888777:::<<>>CCCQQQZZZYYYaaaYYY[[[eeeXXXtttnnntttnnnqqqiiibbb]]]ZZZ^^^\\\jjjbbb^^^VVVlllrrr______gggqqqmmmmmmpppzzznnnooolllllljjjiiigggdddmmmeeeffffff^^^eeeiiillloookkkhhhssspppaaapppuuuvvv}}}yyy~~~wwwiii  !#$'().0234653110.*'# |||uuuppplllyyy -}}}qqqvvv|||yyyrrrcccTTTeeewwwrrriii___vvvppplllddd\\\___^^^bbbuuuccclllhhhpppmmm]]]]]][[[SSSPPPQQQPPPEEE===:::777<<>>VVV:::666;;;:::EEE666AAA000,,,000$$$###'''''')))999+++(((''',,,%%%,,,888222666:::===AAAGGGDDDEEEFFF^^^]]]\\\fffYYYMMMfff```rrrkkktttfff^^^___\\\YYYYYYZZZYYY\\\XXXeeeaaavvvkkkkkkmmmuuuppp{{{kkkmmmmmmfffgggeeehhhfff]]]UUUZZZVVVqqq```kkkuuummmqqqnnnooojjjkkkeeegggtttzzzuuuxxxyyyxxxlllgggzzz!"%%((.24666776311/-)%! - yyyvvv{{{}}}yyylllwww~~~wwwrrrlll[[[ggg[[[\\\iiiaaawwwmmmtttuuu\\\^^^bbbbbbgggfffrrrwwwmmmYYY\\\QQQMMMLLLOOOOOOKKK>>>;;;999===???GGGGGGCCCIIIQQQ[[[TTTQQQ;;;'''000>>>BBBAAA@@@DDD@@@FFF:::666===CCC777:::CCCEEEHHH;;;UUU999HHH???HHH;;;bbbSSS000666111555***---333))))))((($$$(((''',,,###$$$;;;###+++HHH)))%%%'''...333///111000:::444DDDDDD:::BBBXXX@@@:::BBB;;;PPP>>>+++&&&...111$$$$$$)))'''''')))'''%%%)))&&&,,,...;;;<<<>>>777GGGEEECCCDDDFFFQQQXXXZZZ[[[[[[WWWEEEVVVMMMSSSlllhhhfffbbbaaa___]]]VVVTTT[[[WWWTTTdddhhhbbbhhhuuufffiiiccc|||jjjkkkjjjjjjfffnnnggg___]]]XXXVVVaaagggllluuuooorrrtttiii^^^___VVVmmmvvvzzz{{{zzzxxxlllvvv~~~#''(.2569898::9641,.+&$ yyyuuusssvvvhhhqqqzzzpppjjjqqqvvvvvvooo\\\jjjVVVUUU```bbbrrrooonnnlll``````fffZZZaaaqqqpppsss{{{kkkVVVXXXUUUNNNIIIMMMIII>>>;;;777999BBBFFFJJJWWWCCCCCCGGGOOO___dddFFF555666III@@@???EEE@@@AAA@@@222222888>>>===dddEEEAAANNN>>>AAAEEE;;;;;;???===UUUBBB444111666111111222999444///)))%%%&&&((($$$((()))&&&###)))000DDD))),,,111...,,,000///:::555>>>BBBNNN999777;;;777;;;:::999000333,,,+++'''$$$''''''&&&((((((&&&(((++++++...666444>>>???AAA@@@GGGDDDCCCKKKMMMOOO]]]XXXQQQGGGEEEHHH```]]]```lllbbb[[[WWWQQQUUUKKKOOOZZZRRRWWWXXXcccccc\\\uuunnndddcccfffiiikkkkkkhhhhhhfffeeeaaaQQQ[[[[[[fffmmmllluuu{{{~~~wwwqqqjjj|||iiihhhiiiuuuxxx~~~{{{xxxkkklllsss{{{  &'++37:<=?>=>=<<;9520-)% ~~~wwwpppkkkvvv|||ttt\\\nnnppptttkkkqqqpppoooqqqqqqkkkuuuxxxyyytttoooccc\\\^^^```hhhuuuooobbbZZZNNNKKKKKKIIIIII888>>>888===999III@@@DDDPPPNNNLLLFFFQQQiiiOOOEEE===999CCC@@@;;;BBB@@@BBB333111222;;;999LLLiiiJJJjjjHHHDDDCCC===<<<:::NNN<<>>444***,,,888333000,,,333<<<===EEEGGG<<<;;;OOONNN666222000...,,,,,,...,,,***&&&&&&******;;;222//////222@@@>>>@@@BBBDDDHHHJJJKKKJJJIIIJJJGGGKKKGGGDDDGGG:::>>>]]]mmmfffdddfff[[[gggQQQKKKSSSbbbVVVVVV\\\aaaQQQYYYWWW]]]|||dddeeeeeerrrnnnfffwwwfffgggcccVVVQQQ]]]___lllpppgggqqqwwwyyyzzzooojjjssstttsss{{{||||||wwwlllaaahhhttt||| -#*+/5;=@ACCCBBA?>>;863.+'  |||rrrhhh|||~~~ssskkkaaatttbbbqqqooorrrvvvsssuuuxxx|||zzzooojjjzzzwww^^^kkkiiiiiirrrjjjooolllaaaqqqRRRGGGEEE;;;333000222999<<<444888<<>>;;;CCCYYYIIIAAA888222888@@@===kkknnnLLLEEE??????@@@===666BBB888>>>>>>:::555333...+++???,,,***(((&&&&&&%%%$$$%%%(((&&&###%%%###$$$###%%%666222,,,---+++,,,222111...555===<<<<<;961.*% -zzzqqqqqqvvvmmmkkkuuurrrnnnvvvrrr|||rrr~~~yyysssoooiiivvvnnnuuukkkjjjggghhhqqqpppiiiggg[[[RRRaaa:::000111///666;;;999;;;LLL@@@???AAACCCAAACCCAAAFFFIII>>>)))222???NNNOOOGGGBBB<<<555AAA===UUULLLCCCMMMRRRGGG>>>???;;;;;;>>>>>>AAA@@@111DDD<<<222///222(((((($$$&&&$$$###&&&(((&&&$$$$$$%%%&&&&&&"""(((***<<<999)))***222444III111777888666888<<;82.,#  vvvrrrqqqooozzzxxxsssyyyssstttooommmzzz -qqqlllhhhsssuuu~~~pppgggjjjmmmwwwiiidddZZZOOODDD;;;AAA777//////444888CCCHHHFFF@@@:::???BBBEEEBBB>>>===888!!!333BBBPPPGGGDDDGGG===DDDBBBLLL^^^GGGAAAKKK>>>???@@@<<<888CCC@@@AAALLL333000666333777<<<,,,+++***)))&&&'''###%%%$$$######"""(((&&&"""%%%'''...111@@@......<<>>XXX666777777???//////,,,((()))(((...///999444;;;BBBGGGFFFBBB<<>>CCCGGGBBBBBBEEE888+++111:::???BBBAAAGGG@@@;;;BBB>>>IIInnnAAA;;;CCCIIIBBB555777222<<950,$%"yyymmmvvvnnnzzzwwwooofffjjjpppttt &|||{{{bbbaaafffgggjjj{{{rrrsssddd[[[OOONNNCCCGGGBBBBBB:::555999======::::::AAACCCCCCDDDDDDKKKHHH@@@222DDD>>>NNNJJJMMMAAA;;;;;;???<<>>===AAAGGGHHHNNNGGGAAA???GGGSSS\\\]]]XXXQQQUUUdddaaaiii|||gggggg___```fffnnnTTTSSS^^^SSS[[[WWWaaavvvpppoooccceee```cccgggfffcccgggppplllffffffiii]]]jjj^^^ccc]]]nnnwwwwwwvvvuuu}}} ooouuujjjkkkjjjmmmvvv{{{|||}}}xxx "&+/27=BHKNPSUWXXWVTROMIE@=82.(&% - ~~~vvvmmm~~~zzztttwwwmmmhhhoookkkkkkvvvzzz  -|||vvvbbbddddddgggiiikkkuuupppiiicccZZZPPPIIIDDDEEECCC???AAA333999???:::AAAKKKCCCGGGIIIFFFIIIJJJSSSDDD===HHHLLLOOO```LLLDDD666;;;999888111000111444888999;;;:::<<<@@@555BBBBBB>>>===888***---'''(((%%%&&&***((()))111%%%###&&&###%%%$$$'''---!!!"""&&&***222)))111NNNnnnAAAFFFRRRGGGCCCNNNCCC<<<555:::...///---222---666+++((())),,,222GGG::::::555<<:40*$ -|||wwwvvv|||{{{zzzwwwrrrkkkcccbbbdddttt uuu```bbbccccccllljjjvvvzzzmmmfff```WWWGGGCCCAAAOOO???AAA777666;;;AAA<<<;;;DDDAAATTTIIIGGGHHHHHHBBB???BBBGGGJJJSSSWWWNNNKKK666???888;;;JJJ---)))///444;;;BBBdddaaaDDDAAA???HHH:::222===,,,+++***BBB'''***000,,,((((((&&&$$$))))))""" ***$$$)))+++888666>>>///333RRRKKK:::AAABBB@@@___III???777222///---@@@))))))///***)))''''''+++ccc777777666>>>@@@;;;>>>JJJVVVKKKNNNQQQOOO]]]^^^ddd```RRRccc```sssrrrxxxmmmYYYVVVUUUSSSTTTSSSWWWWWWUUUWWWXXXUUUUUUggguuu___aaa^^^dddbbbiiikkkhhhxxxbbbiiihhhiii```\\\]]]gggccc~~~dddhhhlll|||qqqnnnooovvvcccmmmvvvuuu}}}}}}}}} xxx &(+/6=EIMRUX[^_aa_\XVTOLIE@;4.+& |||{{{nnnzzz}}}xxxqqquuummmhhheeehhhnnn}}}~~~pppjjjiiifffffftttvvvzzzhhhqqqddd```VVVOOOIIIHHHGGGBBB<<<666>>>888888999;;;???EEE@@@DDDJJJJJJGGG>>>555FFFLLLSSS\\\OOOFFF<<<@@@@@@:::999:::,,,+++777999DDD<<>>555333444222///***---***)))'''$$$!!!###%%%###  '''((()))111---222<<>>EEE\\\888///+++555,,,)))(((%%%***&&&)))******&&&)))999III555@@@===GGGHHHIIIKKKHHHWWWWWWyyyYYYgggjjj -nnnpppfffdddTTTTTTMMMMMMKKKNNNRRRRRRWWWRRRUUUUUUYYYkkkccc^^^\\\eeeaaa]]][[[ddd mmmuuukkkXXX]]]fff```ffffffrrrmmmvvvlllYYY^^^NNNZZZmmmqqqzzz}}}~~~zzz~~~ %()/:@GJOUY\_bcddb_][VSNLFA;51+&! -|||yyytttxxxtttvvvlllpppyyymmmlllhhhiiijjj~~~zzz|||ssspppqqqggghhheeehhh iiifff]]][[[SSSOOOKKKGGGEEECCCFFFMMMAAA555888===:::>>>@@@AAAMMMIIIQQQGGG999***???JJJZZZSSSKKK===???AAABBB555777///333222333777777]]]DDDTTTKKKUUU```CCCAAA///444///111,,,'''222,,,&&&'''$$$%%%%%% ###!!!$$$"""111&&&((()))000:::666>>>___ZZZ<<>>999777AAA???===BBB???@@@FFFOOONNN???---FFFJJJOOOfffLLLGGGAAA>>>???666222666888777;;;>>>;;;???GGG???PPPHHHMMMgggEEE333---;;;///%%%###***,,,++++++'''000&&&%%%""" &&&$$$"""+++++++++,,,666666EEEJJJgggTTTPPPEEEHHH>>>@@@AAA;;;///111******)))%%%""""""((((((......,,,333000000OOO@@@BBBBBBLLLGGGHHHTTTaaaUUU\\\TTTlll___zzzjjj]]]jjjuuurrrgggaaaXXXXXXVVVMMMFFFRRRSSSXXXXXXmmm\\\```[[[ZZZ___^^^^^^___WWW___kkkuuujjjkkknnniiihhh___eeejjjrrrrrrooossspppsssbbbhhhjjjtttyyyzzzyyy||||||yyyzzzzzz{{{ $'+16>><<<<<<>>>MMM444FFF@@@EEE7hhh888///444---)))((((((,,,<<<000(((%%%###$$$ 444###'''***)))///222BBBTTTcccsssAAAEEEIII999<<<:::GGGBBB222++++++...'''###!!!((())),,,---***+++,,,::::::sssAAA===EEEFFFHHHIIIPPPXXXOOOWWWSSScccmmmnnneee]]]KKKXXXmmmssspppaaaZZZUUUUUUUUUNNNRRRTTT^^^aaa~~~bbbaaa```pppTTTiii```qqq```]]]^^^ccc{{{ooohhhhhhjjjXXXeeellliiikkkwwwrrriiicccxxxfffmmmzzztttfffsss|||~~~}}}|||}}} !$%.3:@DKPTX_ciotrplhb^ZUQLFB=71,&  -yyyxxxvvvzzz}}}{{{uuuggghhhhhhzzzjjjhhhnnnyyy{{{yyyqqqqqqmmmxxx]]]```eeeuuuzzzdddccc\\\]]]TTTZZZbbbQQQTTTLLLFFFDDDDDDHHHGGGCCC666///...)))777BBBDDDCCC>>>>>>999BBBDDDJJJGGGFFFMMMMMM===:::888999;;;EEEDDDJJJJJJEEEIII@@@AAA444EEE999NNNbbb777999)))///,,,000%%%(((111)))$$$!!!###$$$"""!!!"""444AAA+++===...///444<<<^^^rrraaabbbMMM666999GGG@@@999333111+++((('''%%%!!!$$$%%%555((((((111///222000999???DDD===BBBPPPHHHRRRIIIKKKHHH[[[===QQQppp NNNBBBNNNOOO```ooo___ZZZYYYWWWVVVsss\\\\\\UUU^^^___pppccceeeddd^^^^^^\\\___hhhccc^^^^^^ssszzzzzzPPP[[[mmmiiimmmfffdddiiittt{{{gggfffmmmfffjjjrrrwwwyyyddd```pppqqqzzz{{{xxxzzz - "&)16;BFLQTX_diqy{uoid_ZVRLFB;70*%  -{{{vvvxxx|||zzzvvvrrrhhhjjjnnnqqqhhhkkkqqqxxx|||uuuyyy}}}qqqccc```cccxxxwwwgggddd```VVV]]]uuulllUUUSSSSSSDDD;;;>>>RRR===999555...***...888@@@DDDEEE===III666>>>DDDKKKNNNIIITTTGGGTTT===444666666BBB]]]QQQEEE]]]XXX???999777:::;;;;;;;;;444///,,,***333***FFF000)))&&&"""!!!(((222"""$$$"""(((222,,,<<<444///BBBAAA]]]RRREEECCCCCC111777FFF???===444777+++%%%<<<+++(((###((())))))(((111111@@@///555666>>>999FFFGGGHHHCCCDDDVVVgggooo<<>>:::444222111000///222:::000***,,,'''$$$$$$$$$%%%### !!! %%% '''555888;;;NNNVVVEEEZZZ<<<333555BBB999555===333+++000:::000+++%%%&&&%%%'''+++,,,000OOO666444666666SSSTTTAAADDDBBB@@@AAAxxxaaaYYYUUUKKKEEEIIINNNMMM\\\ZZZTTT]]]aaabbbYYY^^^XXX]]]kkk]]]]]]TTT___YYY___dddddd______oooeeetttbbbiiirrr}}}ssssss^^^ZZZWWWXXXddddddfff___llluuukkkuuueeedddiiivvvooouuujjjyyygggtttvvvttt $'078>DHMSWZ^chlsvtmgb]YTPJE@93/'"  -~~~wwwsssuuutttyyyuuuqqqppphhhhhhvvvpppllljjjlllwwwyyymmm|||'zzziiivvvnnn -ddd|||xxxtttbbbbbbUUUTTTRRRQQQTTTDDDHHHCCC>>>===888888111<<<:::777333:::<<<===999...000GGGOOOXXXNNNAAAFFFGGGBBB@@@===999FFFSSSIIIDDDFFFGGGmmmEEE:::OOO@@@111UUU:::666+++---888((()))@@@(((&&&&&&&&& """!!!$$$!!!######...___SSSFFFJJJKKKHHHOOO555444666444666888444>>>222111```BBB'''$$$'''&&&:::///777888666555<<<:::KKKLLLHHHEEE@@@KKKDDDPPPTTTXXXYYYiiiOOOBBB???HHHSSSaaa```]]]ooo\\\ccc___eeekkk~~~```MMMVVVZZZSSSRRR___[[[XXX]]]```bbbiiigggooooooiiivvvyyyrrrlllccc___OOOUUUcccdddbbbhhhkkknnnnnnyyyfffRRR\\\eeeppplllooozzzsssxxxzzzlllsss "',39?CHMSVY]`dflolgc`\XRNHD=83.'! }}}xxx{{{vvvxxx{{{uuunnnllljjjhhhlllsssssskkkpppggg{{{ yyypppwwwhhhhhhrrruuu|||yyykkk[[[XXXPPPMMMKKKJJJ@@@<<<:::===DDD777444000111666BBB===666777;;;777...DDDBBBNNNccclllFFFCCCCCCFFFBBBDDD===888AAAKKKEEEJJJKKKJJJIIIKKKVVVBBBAAAAAAEEE---,,,&&&((()))###%%% $$$&&&### !!!"""  222+++bbbIIIlll>>>TTTAAA777666444...000111+++444888111222???(((+++'''***---777OOOAAA888666FFFCCC555???aaaKKK@@@GGGQQQUUUcccYYY\\\hhhjjjOOOLLLQQQNNNbbb___hhh```nnnaaaSSSWWWaaaTTTQQQFFF@@@KKKYYYhhh^^^VVV```dddjjj|||gggppp{{{qqqnnneeefff^^^III\\\ggggggdddeeelllqqqssstttXXXTTTbbb vvvcccsssxxxwwwxxx|||uuummm -"&+19>BIMPUX\_adghfb`_ZVQLGA<71,'# yyywwwzzzyyy{{{{{{rrrhhhccciiissspppkkkhhhppp|||tttsss|||www~~~4zzznnnfffiiiccceeefff___UUUPPPVVVQQQMMMMMMCCC>>>===???>>>666444111444111:::555;;;CCCFFFSSS<<>>GGGFFFYYYXXX\\\YYYWWWeeevvv 7pppVVVZZZaaa\\\iii___JJJLLLVVVhhhpppfffqqqTTTJJJQQQMMMOOObbbaaaNNN]]]aaalll}}}hhhggg oooooohhhpppWWWQQQbbbjjjjjjkkknnnmmmlllrrrgggUUUbbbooovvvooowwwxxx{{{|||qqqxxxxxxyyy||| - %-17;BHMPSVY\_`ccb^\ZVSNIE@:4/*'! ~~~}}}~~~zzz|||yyyvvvpppkkk___ggghhhiiifffnnn|||yyytttxxxoooooouuunnnttttttooocccdddeeeZZZUUURRRVVVIIILLLKKKJJJ???KKK999@@@///222888555///444===JJJMMMHHH@@@KKKIIINNNSSSWWWUUUSSSCCCAAA>>>;;;AAA???EEE999===DDDOOOPPPjjjsssTTTWWW???>>>QQQAAA%%%%%%$$$((($$$"""### !!!###***''' &&&&&&666888***...PPP222...555???999666333666---111111BBB///222222,,,......'''888WWW???555<<>>AAAJJJBBB999===:::===```SSScccgggOOORRR```\\\ooo>>>$$$$$$!!!  !!!&&&%%%%%%"""666888---000***...---666222111111@@@111666444///222///222===......111(((555888...111rrrFFF???<<<:::AAAMMMHHHEEEJJJIIIXXX\\\bbb___hhhvvvrrrmmm[[[```XXXWWWTTTXXXjjjmmmhhhffffffgggJJJJJJIIIMMMMMMLLLPPPNNNVVVVVV\\\hhhQQQWWWRRRaaajjjhhhiiibbbnnnkkkccc```___iiijjjpppsssoooqqqeeefffiii```OOOmmmxxxzzzvvvxxx}}}vvvzzz~~~{{{ $*/5:@CFLNQTVXZ[[[TTSPLHD@;51,'$ |||}}}~~~tttuuurrrkkkaaa```fffuuu}}}|||ttt}}}rrraaa[[[ZZZbbbnnnkkknnnjjjjjjaaaaaaVVVdddOOOMMMFFF>>>;;;999888111666///111333999222///>>>DDDJJJIIIIIIMMMDDDFFF[[[WWW^^^dddNNNDDD===@@@>>>===999888999???mmmVVVPPPWWWSSSZZZQQQ^^^OOOCCC***"""!!! %%%$$$###$$$'''###""""""!!!333555,,,---,,,+++///000333000...111///333555888000222222333666///999******000111111888:::555222888:::IIIJJJGGGNNNJJJQQQLLLYYYmmm\\\TTTbbbqqqdddgggXXXOOOWWWVVVYYY___^^^ssshhhzzz\\\\\\FFFUUUIII@@@<<AFILORTTVVWTPPOMJEA=93.'% {{{{{{{{{}}}qqqwwwfffhhh }}}{{{tttggg\\\XXXZZZcccuuuooozzzcccZZZ]]]^^^RRRIIINNNSSSIII>>>BBB999111555,,,555888888---:::EEEIIIGGGGGGDDD]]]SSSLLLRRRRRRSSSWWWGGGDDDFFF;;;444<<>>DDDQQQVVVWWWHHHQQQxxx555555---CCC&&&$$$%%%"""###%%%"""$$$&&&$$$"""'''###$$$---### 444,,,000555???///---555///+++---+++&&&+++444<<<555///333444666///)))+++'''***,,,333---222555CCC@@@CCCRRR@@@@@@WWWeeePPPLLLTTT\\\YYYccceeeXXXWWWUUUSSSZZZXXXpppWWW]]]jjjjjjooozzzWWWSSS\\\hhhDDDIIIKKKUUUOOORRR```WWWaaaccc___]]]___sss(ddd```LLLRRRcccmmm\\\hhhhhheeeooorrrVVV{{{tttjjjvvvwwwzzzvvv{{{vvvzzzzzz}}}~~~ -')/7;72*$ -|||}}}~~~}}}|||uuuffflllssstttffflll (|||~~~}}}rrrzzzkkk___iiibbbrrr{{{#xxxfffcccfffZZZLLLGGGXXXZZZGGGAAA888OOO888444666999---+++111;;;GGGHHHJJJPPPPPPDDDQQQHHHLLLRRRRRRJJJFFFCCC<<<;;;<<<<<<777<<>>888444111222'''###'''"""!!!(((,,,&&&'''***&&&%%%!!!'''"""!!!!!! ???VVV555<<<444000,,,+++...,,,+++,,,(((,,,000+++...///...,,,///(((,,,,,,+++333222444***000777MMM===;;;HHHFFFYYYFFFQQQNNNNNNPPP^^^ccc```hhhkkkdddUUUSSSooo___]]]fffjjjhhhffffff bbbNNNSSSTTTSSSTTTIIIJJJTTTZZZXXXYYY___bbbmmm^^^VVVGGGRRRUUU^^^WWW^^^ddd]]]]]][[[YYYfffhhhfffjjjtttkkkqqqvvvyyywwwxxx}}}ssswww{{{||| ))-7;?AEHJLMMLLMNJIIEA=972/'  ~~~}}}vvveeeccciiikkkooommmwww|||xxxuuummm```bbbcccdddllldddcccqqqtttkkklllddd[[[XXXQQQKKKKKKGGGBBB;;;888888???888777000666LLL@@@999HHHQQQRRRRRROOO\\\TTTNNNHHHUUUUUUOOOQQQ;;;777888999999999:::GGG???;;;;;;JJJMMMMMM>>>III777000###'''---+++)))((('''$$$$$$$$$%%%$$$$$$444!!!!!!666AAA???===---///******---,,,777222...---000+++---222---%%%&&&000+++555---111111SSS::::::888???NNN@@@<<:74/*% |||kkkccccccdddffflllttt|||}}}wwwtttccchhh___mmmiiifffqqqooossskkkfff^^^pppTTTYYYhhheeeGGGDDD;;;GGGNNN>>>666666444<<<>>>FFFBBB>>>GGGSSSWWWZZZxxx [[[VVVMMMQQQKKKDDDBBB;;;555333888>>><<<@@@@@@:::<<>>;;;:::;;;555@@@===GGGTTTNNNTTTTTTTTTVVV[[[bbbyyy]]]ZZZVVVNNN@@@FFFPPP===555777999;;;;;;===JJJ888111)))(((CCC888888---***'''$$$$$$&&&&&&$$$$$$'''###"""######!!! &&&### 555;;;DDD444...222//////222222---///333...000>>>777%%%&&&%%%&&&+++---111222FFFbbbmmm000222333000666666???EEEOOOLLLPPPIIIPPPPPPYYYXXXZZZjjj|||iii^^^UUU___aaafffpppqqqfffUUU>>>???>>>FFFLLLYYYQQQPPPRRR[[[WWWUUUSSSFFFFFFMMM\\\ccc```LLLRRRSSSWWWXXX```gggfffuuuyyyrrreee^^^ssskkk\\\pppwwwuuu|||{{{{{{vvv}}} $*+.17:>?@BCEDCCB@<;874.)%&"~~~|||yyyrrrbbbYYYTTTYYYiiirrruuu}}}~~~xxxjjjfffhhhpppiiikkkpppeeehhhtttooofffbbbXXXMMMMMMWWWGGG???FFF;;;444666333444777<<>>AAAHHHCCCNNNPPPQQQUUU\\\XXX___\\\YYY]]]cccPPPXXXYYYYYYggg```fff|||LLLCCC000:::NNNqqqeeePPPWWW```YYYTTTYYYYYYZZZZZZQQQXXXaaa]]]ZZZgggWWW[[[XXXcccggg}}}ooovvvwwwuuunnn```jjj|||vvvzzzwwwyyyyyy~~~~~~||| !'),037;=>@@BA?>=;97431,&#  xxxssseee___dddddd[[[hhhsssrrrtttwwwrrrjjjxxxqqqsssqqqnnnnnnxxx}}}gggxxx{{{pppddd\\\]]]SSSPPPVVVQQQHHHHHH@@@999666333===;;;@@@CCC@@@GGGPPPTTTXXX```ccc\\\YYYSSSQQQVVVEEE;;;@@@<<>>JJJ444555000444555777===??????@@@XXXTTTUUUQQQRRRRRR___]]]WWWZZZTTTYYY```SSS______iiipppkkkSSSXXXCCC<<>>444111444))))))(((***'''''''''############'''###!!! !!! %%%&&&!!! :::>>>222111,,,*********+++555---...***000,,,'''///)))'''+++***+++333))))))333777:::555000222666::::::===@@@FFFRRRMMMSSSTTTUUU\\\dddfffRRRQQQMMMLLLSSSYYY]]]ddd```ddd^^^OOOIII@@@===HHHSSSDDDNNN[[[TTTZZZdddUUUQQQQQQQQQSSSOOOPPPRRRUUUFFFMMMXXXRRRUUUccciiigggkkk tttcccZZZqqqiii{{{|||yyyxxxyyy{{{yyyzzz "%(,.1779999887630/*(%$" }}}yyyvvvtttppplll]]]ZZZdddjjjiiimmmggglll~~~nnnqqquuuttt|||uuuttthhheeeeee[[[jjjsssbbbUUUKKKIII>>>@@@777;;;444DDDCCCBBBKKKPPPVVVbbbVVVSSSUUUQQQJJJUUULLLFFFAAAGGGIIIEEEGGGLLLQQQGGG???DDD;;;<<<>>>666666///++++++(((((((((,,,'''&&&&&&'''$$$%%%"""$$$)))666 """###<<<%%% )))777222111------111((()))&&&$$$(((+++''')))888<<<666)))&&&$$$###:::)))***)))333...999777555111888777===@@@RRRIIIMMM^^^UUUOOO[[[SSSVVVUUUMMMKKKGGGKKKUUUVVVZZZ^^^XXXTTTUUUPPPWWWSSSjjjvvvZZZHHHPPPRRRRRRWWWUUUSSSVVV^^^XXXPPPHHHKKKOOOvvvRRRQQQSSSQQQYYYccciiilllwww{{{~~~jjjyyyuuuwww{{{{{{wwwttttttxxx~~~}}}qqqzzz||| #%*.03357675421/,*'%" |||xxxssskkktttpppmmmaaa]]]iiimmmjjjjjjrrrwwwmmmnnniiizzz~~~sssllliiieeecccffffffWWWDDDCCCDDDGGG<<<::::::CCC???HHHEEESSSIIIkkkUUUUUUQQQNNNPPPTTTNNNJJJKKKHHHJJJIIIIIIHHHTTTIIIAAAAAA@@@BBBNNN===444222111...)))+++FFF((()))***'''$$$+++333%%%&&&###""""""%%%!!!  ###!!!!!! (((===AAA///,,,,,,+++---&&&&&&"""---,,,111,,,:::555444&&&&&&***((($$$"""%%%444//////---555???444??????;;;@@@@@@UUULLLiiihhh^^^PPP<<<@@@LLLIIIJJJ\\\WWWOOOSSS\\\aaaeee[[[```VVVPPPZZZ TTTOOOZZZVVVSSSOOOZZZ[[[WWW___PPPQQQHHH___VVVYYYTTTTTTWWWNNNKKK^^^dddjjj  {{{ttt~~~sss{{{|||qqqooonnnzzz~~~qqqnnn{{{~~~ !")-.0124442/--,*&%$ wwwlllkkkmmmvvvzzzzzzssskkkiiillljjjppprrrwww{{{yyypppppppppmmmqqq~~~zzzrrreeeeeemmm~~~ddd[[[NNNQQQ___FFFMMMDDD>>>AAABBBHHHLLLKKKSSSRRRUUUTTTTTTQQQRRRRRRQQQBBB:::AAAJJJ```KKKIIILLLNNNJJJFFFNNNKKKHHHGGG>>>666777444111***)))))))))%%%%%%''''''++++++###!!!######"""%%%!!!'''!!!""" ,,,%%%$$$!!!&&&,,,...000+++000***,,,...((('''$$$(((------,,,------******)))444&&&######$$$%%%///111...111;;;555OOO999999AAAHHHOOOdddXXXhhh^^^HHH>>>GGGXXXUUUYYYUUULLLXXX]]]WWWVVVYYYWWWTTT\\\___ssslllTTTNNNOOOVVVPPPnnnVVVZZZ___aaaTTTFFFBBB[[[MMM]]][[[XXXTTTRRR\\\jjjgggmmm'-" hhhxxxjjjzzzuuuqqqjjjnnnuuu~~~kkk{{{"%)+-./0100.,*+%$!  -ssslllmmmtttwwwttttttwwwwwwrrr{{{zzz}}}lllnnn}}}uuuyyy~~~mmmmmmkkkmmmvvvwwwoookkkhhhhhhxxxaaaPPPXXX``````NNNGGGDDDDDDIIIFFFRRRVVVVVVNNNKKKVVVSSSWWWZZZSSSJJJAAA;;;HHHFFFJJJHHH???GGGKKKJJJHHHBBBCCCFFF@@@AAA===:::???555000000---***''')))(((---###(((### """""""""###!!!%%% """!!!!!!''' """'''OOO ---...333///222111))))))(((---(((+++***)))+++111///+++,,,???&&&$$$%%%"""$$$+++777,,,000111000333666888<<>>===FFFFFFUUU[[[[[[OOOSSSdddYYYVVVQQQgggaaa}}}\\\ZZZRRRSSS[[[NNNrrrXXXHHHGGGMMMHHH444333666@@@@@@DDDyyycccZZZ[[[RRRYYYOOOOOOOOOOOOUUUmmmXXXYYY\\\eeelllmmmpppxxx4KnxX7&nnnnnnwwwvvvhhheeevvvwww{{{zzzuuuuuu|||  #""%!"   - -zzzwwwtttqqqpppnnnrrrssstttyyy}}}vvvvvv~~~sssppplllmmmqqqiiiaaammmrrr~~~zzzqqq !lllTTTZZZZZZLLLBBBAAA999999===AAAHHHWWWNNNOOOPPPSSSPPPWWW]]]OOONNNQQQRRRTTTQQQNNNNNNKKKIIIVVVZZZTTTYYYYYYggg]]]EEEOOONNNTTTAAA<<<666000CCC(((222&&&$$$&&&&&&###### !!!$$$!!!***111$$$111"""$$$$$$000JJJPPP:::+++'''111$$$)))333+++***&&&))))))(((EEE'''+++)))$$$&&&%%%!!!''''''"""...&&&(((000444)))+++---///333,,,***///999GGGFFFEEEUUUrrraaaRRR^^^aaaZZZRRRMMM\\\eeefff]]]fffgggQQQQQQQQQaaaZZZHHHJJJIIIEEE<<<:::333777BBBHHHBBBMMMVVVRRRWWWRRRRRRIIIIIILLLJJJHHHVVV]]]aaa]]]ccc```jjjppprrr,RU]Q2sssjjjwww|||{{{hhhZZZmmmrrr{{{xxxyyywww}}} ! ! !yyyrrrpppmmmxxxvvvwww{{{{{{{{{uuuxxx}}}zzznnnuuuaaallldddnnnvvviiiooosss~~~}}}sssccc^^^IIIBBBBBB@@@@@@CCCBBBGGGJJJEEEFFFVVVSSSPPPRRRQQQUUUVVVSSSSSSSSSZZZWWWXXXMMMVVVZZZ]]]ZZZooocccTTTCCCDDDAAA;;;888///777///,,,%%%$$$&&&$$$!!!"""$$$&&&'''###(((&&&###'''&&&&&&''')))---^^^111,,,///---+++***000555999///&&&###444+++'''(((&&&***)))&&&333$$$%%%$$$%%%''',,,)))''''''&&&,,,222......222>>>444111111CCC999???UUU]]]|||OOOxxx```QQQHHHRRReeeccc```RRRLLLMMMSSSVVVMMMKKKHHHFFFEEEEEE;;;888444777<<<@@@DDDOOOJJJLLLTTTYYYNNNMMM@@@>>>HHHDDDHHH\\\dddVVVKKK___jjjooo~~~/+2;4:oooeeepppmmmpppsssnnnZZZcccwwwzzz}}}|||zzz}}}  !!  ~~~|||yyysssrrrsssxxxyyyyyyyyyxxxzzzwww oooqqqmmmfffaaafffkkkmmmooonnnnnnwww jjj```ooo -XXXPPPIII===<<<@@@HHHCCCGGGMMMHHHKKKIIIIIIRRROOOLLL\\\UUUffffffVVVTTTooolllWWWVVVXXXWWWQQQiiiWWWDDDAAA===>>>;;;888111000///******(((!!!$$$$$$((((((&&&""""""%%%%%%&&&%%%&&&%%%^^^))))))333'''888111FFF444555EEEEEE888000'''%%%'''&&&'''### &&&%%%777$$$'''&&&((($$$$$$((('''(((///...333,,,///---...,,,777:::666BBB>>>;;;>>>TTTXXXJJJ0^^^BBBCCCXXX``````TTTLLLQQQOOOGGGNNNJJJJJJCCCCCC???BBB666999555:::===>>>BBBFFFMMMOOObbbTTTLLLGGGCCCEEEJJJIIINNN\\\___UUUMMMeeekkkiiippp ___iiinnnsss|||jjjlllwwwfffqqqwwwuuuzzzzzzrrruuuyyywww|||{{{yyyxxx{{{}}}}}}~~~vvv{{{tttpppdddffffffllldddmmmoooooollluuunnnZZZXXXSSSZZZLLLGGGBBB<<<>>>EEEQQQCCCMMMFFFQQQNNNHHHOOOPPPOOOKKKUUUYYY[[[___WWW[[[WWWYYY______jjjbbbHHH???TTTBBB???===;;;::::::GGG///,,,,,,000---%%%&&&%%%%%%***???DDD'''&&&$$$$$$&&&''',,,$$$'''###(((***'''(((***MMM,,,JJJIII,,,000,,,+++((('''((('''((((((///&&&""""""$$$&&&***,,,$$$%%%---"""///222///000+++...,,,000CCC222222SSS???===DDDJJJHHHOOOCCCkkkIIIFFFMMMTTT^^^```hhhIIIFFFLLLFFFFFFIIIIII>>>DDD>>>>>>===@@@;;;???>>>NNNBBBBBBEEEGGGIIIMMMPPPLLL???FFFQQQHHHEEEMMMRRRUUUUUUQQQcccYYYmmmcccsssrrr~~~{{{~~~kkk___ggg}}}cccZZZrrrhhhiiiuuummm{{{~~~~~~  ttteeetttqqqxxx|||zzz|||~~~}}}||||||}}}vvvllliiirrrfffaaafffjjjmmmiiitttmmmyyyaaaggglllhhh[[[MMMOOOHHHGGGBBBHHHDDD<<<>>>HHHOOOGGGEEEIIIEEEJJJPPPNNNNNNIIITTT]]]bbblllXXXSSS\\\^^^XXXWWWdddXXXNNNHHH>>>=========;;;888555333555111000---***&&&%%%&&&)))%%%###VVV333+++'''***000%%%$$$###!!!((($$$""""""!!!!!!###,,,,,,000---+++000)))&&&%%%$$$***(((###$$$!!!###'''666&&&((((((&&&###&&&######111---000***,,,,,,555222<<<777<<>>AAAFFFJJJGGGKKKMMMHHHAAA777MMMOOO666@@@cccVVVQQQcccfff[[[XXXiiitttjjj\\\hhhkkktttjjjUUUcccpppcccVVVrrrqqqgggooonnn|||  }}}   zzzpppoooqqq{{{xxx}}}~~~zzzzzz }}}yyy{{{vvv}}}xxxzzzzzzyyyssslllkkkttthhhlllrrriiihhhrrrqqqgggkkkppprrrXXXaaaPPPJJJFFFBBB>>>999666??????@@@DDD\\\GGGQQQJJJQQQMMMOOOKKKQQQLLLQQQTTTZZZYYY[[[WWWXXX[[[ZZZXXX```eeeRRRBBBGGG[[[CCC666666555444222555444000...***%%%###$$$&&&'''''')))QQQ333%%%%%%***%%%%%%'''###$$$&&&'''###''')))&&&+++===111''''''###...%%%$$$'''(((%%%'''$$$&&&"""###%%%---%%%### ===###+++333***'''***222,,,///,,,@@@999<<>><<>>---)))---333111555111DDD===EEE<<<666222AAAUUUYYYhhhaaa]]]kkkfffTTTTTTRRRLLLCCCEEEEEEEEECCC===;;;666;;;<<>>FFFBBBOOOGGGHHHGGGLLLGGG;;;------555FFFIII\\\[[[XXXDDDPPPhhhyyypppkkkvvvnnn```mmmfffccc\\\FFFVVV]]]AAANNNkkkssspppdddjjj}}}  }}} |||qqqttt{{{|||ooojjj}}}~~~zzz{{{zzzxxxxxx|||zzz||||||~~~zzzuuuvvv|||xxxuuussshhhkkkkkkkkkgggkkkmmmnnnvvvpppppptttcccaaaYYYcccEEE<<>>???:::666:::<<<======>>>GGG===@@@DDDLLLHHHHHHHHHGGG@@@:::444...999___ccc___WWWXXXZZZ```yyyxxxYYYiiipppccc|||sssUUUTTTSSSTTTLLLKKK```cccjjjbbbccczzz - - -zzzxxxtttrrr||||||zzzyyyvvvzzzxxxxxx{{{|||~~~uuuxxxxxx{{{~~~|||yyyyyy}}}zzzzzzxxxyyy{{{{{{qqqjjjqqqvvvnnnjjjlllgggnnnpppnnnlllvvvgggbbb^^^^^^^^^RRRDDDFFFFFFIIIEEEEEEFFFIIIKKKJJJKKK[[[PPPLLLLLLLLLLLLQQQLLLJJJHHHLLLPPPXXX\\\```___^^^XXXSSSRRRPPPOOOKKKNNN;;;@@@777999333333333333333111444999///&&&***"""$$$!!!%%%))))))'''!!!+++...'''+++111111###$$$(((%%%%%%666+++&&&%%%$$$(((###///111$$$(((,,,***+++***$$$...,,,***&&&'''$$$!!!!!! """&&&***)))---))))))'''$$$$$$***)))--->>>888666>>>GGG;;;999JJJNNNUUUhhhlll```___SSSMMMOOOOOODDDDDDFFFHHHAAAOOO888111;;;>>>@@@;;;???kkk===IIICCCMMMLLLTTTFFFBBB???NNN999777CCC===OOOiiiWWWVVVZZZfffrrrxxxhhhZZZ___llljjjvvvjjjgggeeejjjhhhRRRbbbQQQUUU[[[oooccc___sss  }}}uuu{{{zzz}}}|||yyywwwwww{{{~~~xxx|||zzz{{{{{{tttyyy{{{}}}||||||~~~zzz}}}{{{vvv|||vvvrrrqqqllljjjooozzzrrrlllvvvrrrsssnnntttsss{{{pppmmm```^^^VVVJJJPPPIIIKKKHHHLLLHHHFFFQQQLLLLLLMMMMMMIIIGGGJJJHHHLLLSSSOOOSSSOOOOOORRRUUUXXX[[[ZZZ]]]^^^VVVYYYRRRJJJDDD===999???<<<777444777EEE---222///444AAA,,,***%%%+++$$$(((%%%""""""%%%---((()))+++***)))%%%'''...CCC000(((&&&'''###&&&&&&###(((######(((///---'''222+++''',,,&&&''')))!!!!!!!!! ,,, %%%$$$++++++///'''&&&***---...///444444666<<<===NNNLLLGGG^^^aaaUUUeeehhhjjjfffbbbRRRNNNFFFFFFDDDFFFBBBCCCNNN777333777999@@@@@@===LLLAAAAAA??????FFF@@@CCCAAA>>>AAA<<<444///>>>666FFFWWWWWWWWWdddttteeeSSSTTTYYY___llliiippprrrnnnuuuooo[[[iiinnngggffflllmmmccckkk - www  -  xxxmmmwwwyyyzzzvvvzzzyyyzzz}}}|||{{{||| xxxxxxppplllqqqkkklllkkkqqqmmmrrrwwwqqqooommmmmmllltttooogggZZZJJJLLLRRRVVVJJJJJJGGGMMMJJJHHHJJJSSSOOOPPPIIIPPPMMMPPPYYYHHHAAALLLRRRTTTWWWUUUWWWXXX\\\[[[YYYXXXaaa~~~tttHHH<<<;;;<<<@@@;;;333555444888AAA///,,,222+++---)))&&&'''###''''''!!!""""""###$$$"""%%%)))999)))444555+++:::%%%((()))%%%'''%%%%%%000)))$$$###&&&111***///+++'''###"""$$$///###$$$!!!"""!!!!!! )))$$$"""******...***+++000333+++//////000111@@@777===QQQJJJKKKLLLQQQYYYZZZbbb```[[[^^^___IIIJJJXXXBBBFFFBBB<<<;;;<<<555666;;;;;;;;;AAADDDBBBDDDIII@@@@@@FFFCCC@@@HHHNNN666222111<<<,,,CCCTTTXXX\\\```qqqaaaWWWZZZccclllxxxpppmmmhhhqqqiiiggg kkkpppkkkmmmeeedddooo - }}}yyy{{{uuu - }}}pppnnn|||wwwwww{{{zzz{{{'~~~vvvzzz xxxuuuvvvqqqeeejjjiiijjjgggvvvrrrzzzppplllmmmiiillloooeeeWWWYYYRRROOObbbSSSFFFFFFUUUKKKGGGFFFSSSNNNOOOIIIKKKPPPRRRTTTKKKHHHIIIOOOSSSXXXXXX___VVV\\\[[[WWWSSSOOO```^^^CCC777888777666444555444333///;;;::::::+++)))***''''''$$$#########$$$"""###%%%&&&))))))'''%%%'''***+++444+++000QQQ(((***(((""""""000000&&&''''''''''''III***((($$$"""777iii***kkk%%%"""###""" !!!###///))),,,&&&)))...;;;,,,///000111555999666===JJJNNNGGGKKKTTTSSSfffkkkeee```WWWVVVJJJAAAAAA<<<>>>@@@FFFDDD:::999:::@@@<<<999<<>>CCCMMMFFF@@@<<<999;;;888:::AAAOOOQQQSSS\\\]]]fff^^^hhhnnnooonnntttxxxkkkkkkkkknnnttt)&vvvfffmmmmmmhhhkkkmmmxxx~~~uuuxxx}}}|||uuu~~~yyywww}}}   -~~~ vvv|||zzz~~~|||mmmuuuttttttuuuvvv uuurrrnnniiieeeiiihhhnnnnnnwwwqqqgggeeehhhpppjjjeeeXXXXXXRRRRRRSSSRRRUUUJJJFFFKKKMMMRRRMMMQQQOOOQQQQQQLLLPPPpppXXXnnnWWWSSSVVVRRRUUUeee^^^gggUUUWWW\\\NNNKKKDDDAAAAAA@@@>>>NNN111444222...333111>>>mmm;;;***---))))))'''((("""$$$%%%&&&&&&***+++---444&&&444(((---...OOO@@@...)))333777...(((###>>>###!!!%%%%%%!!!000"""&&&&&&$$$444???999'''###"""###(((444'''$$$)))&&&222&&&---///)))...444777666DDD666<<>>BBB???<<<<<<666555999EEEjjjLLLPPPWWWYYYfffZZZfffxxxjjjlllqqqjjjjjj___fffyyy !uuuaaaooohhhlllooorrr{{{{{{ -|||qqqrrrssssssvvvvvv~~~rrr |||wwwuuuzzz~~~zzzssstttqqquuuyyyzzzxxxyyy{{{|||xxxmmmiiijjjiiifffqqqpppsssqqq}}}iii___```eeecccXXX\\\PPP\\\TTTPPPJJJUUUJJJKKKMMMMMMOOOLLLQQQMMMRRRLLLMMMLLLWWWRRRKKKIIIKKKPPPNNNSSSYYYVVVUUURRRSSSNNNGGGCCC@@@::::::===:::FFF777555555444111888RRR```hhh000+++'''(((%%%&&&$$$)))---######+++***'''&&&(((555///---...555CCC&&&)))&&&555CCC%%%""""""$$$"""$$$$$$###!!!%%%***111###$$$"""&&&"""!!!&&&###&&&!!! (((""")))333...444888000111333;;;GGGDDDRRRGGGMMMcccnnn~~~jjj\\\ZZZ[[[PPP[[[QQQ;;;@@@GGG>>>IIIDDD===>>>999:::>>>>>>===>>>AAAKKK<<<@@@AAABBB>>>BBB:::;;;888999;;;<<<<<<===<<>>HHHSSSYYYZZZYYY[[[\\\VVVTTTOOOHHHBBB>>>;;;===666444888:::999:::888:::888GGGJJJ<<<:::444---***///(((+++###!!!$$$'''######%%%(((,,,888...333***///444333$$$)))***$$$ &&&!!! )))((((((!!!""" """$$$ """ &&&"""'''######(((GGG'''######!!!###000222+++---SSS000555@@@NNNCCCMMMNNNZZZYYYooonnnrrrnnn\\\OOODDDGGG777EEEJJJHHH>>>CCCNNN???:::;;;<<<<<<:::AAAHHH???<<>>AAABBB???>>>888:::999:::555666III___TTT^^^ooowww{{{kkkpppoookkkmmmooorrrmmm\\\ddddddaaaiiiggghhhiiixxx~~~yyy~~~{{{ -}}}~~~}}} qqqtttnnnxxxxxxxxxwww{{{~~~|||yyy||||||vvvsss|||rrrsssqqqsssiiilllnnnlllpppllluuunnneeeaaabbb\\\^^^ccc^^^YYYYYYUUULLLMMMOOOGGGFFFOOOSSSOOOZZZlllRRRFFFFFFDDDFFFBBBHHHRRRMMMTTT]]]```___\\\[[[ZZZRRRUUULLLIIICCC;;;999999555999@@@::::::888<<<777EEE888EEE444...222444111...$$$$$$$$$$$$!!!###%%%888(((&&&+++000???111***888===,,,(((%%%"""###!!!,,,***###!!!(((######+++%%%!!! $$$$$$)))"""000,,,###%%%)))666!!!$$$%%%###'''(((000AAA:::888EEEBBB999;;;AAAOOOjjjiii-yyyLLLHHHAAA000>>>^^^CCC>>>EEEFFFRRR:::DDD<<<<<<<<>>AAACCCEEE;;;@@@<<>>777999======HHHDDDEEE>>>999DDDDDD[[[LLLGGG222***---:::)))%%%%%%,,,$$$###"""%%%%%%&&&''')))111...555777...111&&&,,,######"""!!!###+++&&&%%%!!!((('''111$$$""""""$$$!!!"""&&&"""$$$###%%%AAAFFF###555'''(((,,,"""(((???+++555>>>===888;;;777666@@@@@@DDD666ddd!wwwPPPGGG???555>>>YYYQQQIIIJJJMMMFFF===;;;:::@@@;;;AAA===EEEBBB@@@GGGAAA<<<===<<<:::999??????999@@@<<<;;;EEEOOOHHHMMMooovvvhhhnnnuuuuuu]]]iii|||kkkaaaWWW^^^nnniii]]]fffjjjppp  zzzyyy }}}qqqttt}}} {{{wwwtttyyyvvv|||}}}zzz yyyrrrnnnmmmmmmllllllkkkxxxmmmjjjccc^^^]]]aaasss]]]\\\ZZZYYYNNN___LLLCCCLLLLLLKKKKKKMMMWWWYYYSSSHHHCCCKKKWWWVVVQQQGGGTTTSSSWWWTTTbbbaaabbb\\\VVVQQQ]]]PPPGGGEEE<<<>>>>>>FFF@@@>>>^^^WWWuuuppp\\\JJJeee[[[===222,,,444...)))&&&!!!###&&&***%%%&&&***)))---333***...---111000+++GGG+++(((%%%)))///###!!!)))+++'''###''' """ !!!###"""444+++;;; '''!!! $$$))))))```""""""""" %%%&&& &&&111:::```888999;;;666444PPP@@@EEEGGGDDDMMM jjjnnnlll\\\HHH;;;666<<>>===LLLLLLJJJ???===???BBB:::>>>AAA>>>??????:::DDDJJJMMMTTTNNNjjj|||bbbfffpppvvv  [[[```sssnnnxxx~~~}}}yyywwwzzzvvvyyy   ~~~  }}}yyy||||||xxx}}}yyyzzzyyywwwyyyrrrlllkkkqqqppppppooocccfff```eeerrr___XXXQQQSSSYYYTTTNNNGGGHHHIIIRRRMMMMMMMMMcccKKKIIIRRRTTTkkkQQQRRRPPPYYYWWWRRRWWW\\\ZZZYYYTTTvvvOOONNNCCCBBB???777:::@@@EEEOOO???WWWtttYYYaaalllHHH555555...---&&&%%%$$$"""&&&''''''%%%'''***)))******(((000+++&&&444,,,888'''$$$+++'''&&&&&&$$$%%%!!!%%%)))%%%!!!$$$%%% ###&&& """$$$"""######%%%'''$$$!!!$$$""""""$$$""" ***222OOO888222888888III>>>>>>333??????LLLQQQrrr``````UUUMMMLLL;;;???DDD???AAAOOO<<>>===>>>AAAJJJFFF>>><<>><<<<<<>>>MMMAAA<<<:::>>>LLLggg -VVVNNN777---+++(((''''''$$$'''((($$$###$$$000]]]333''''''+++)))((('''333111""",,,<<<(((++++++%%%$$$)))111""""""%%%%%%$$$555KKK'''#########333$$$###!!!!!!&&&"""000888222777111333;;;666CCC@@@;;;@@@777@@@DDDKKK\\\PPPCCCGGGCCC===CCC???===999EEEAAA>>>;;;888<<<<<>>;;;999:::777555<<<;;;KKKNNNYYYVVV]]]gggrrrfffaaa|||rrr~~~~~~ -lllOOOnnnsssnnnrrrrrrggggggqqqyyy zzzxxxjjjlllrrruuurrrvvvooollloooxxx  ~~~  {{{zzztttnnntttpppqqq$ pppccc___^^^\\\mmmWWWYYYYYYRRRUUUQQQPPPKKKHHHHHHGGGDDDPPPNNNJJJNNNRRRZZZTTTZZZXXXYYYYYYXXX[[[eee``````fffXXXSSSPPPttthhhEEEAAA>>>EEE<<>>555BBBIIIGGG]]]888<<>>@@@HHHDDDCCCHHHEEE@@@444===888===999:::777OOOSSS===OOO;;;===CCC999<<<;;;LLLEEECCC===999AAA;;;???<<<999PPPFFFOOOWWWZZZddd]]]iiinnn~~~{{{sssfffqqqggg``````MMMdddkkksssooo -vvvrrrxxx|||}}}ooobbb```vvvnnnpppuuuzzzttt|||yyy~~~     }}}~~~qqqyyykkkppplllmmmmmmrrrrrr iii{{{mmmggg^^^^^^]]]TTTPPPRRROOOMMMKKKJJJHHHFFFKKKGGGIIIMMMGGGLLLSSSPPPjjjkkk\\\YYY```\\\XXXVVVVVVcccSSSPPPNNNJJJUUUeeeCCC???BBBKKK:::===>>>FFFWWWAAALLL777MMM\\\<<<777;;;:::---///+++%%%***'''$$$'''((()))+++&&&&&&(((+++444&&&&&&'''+++%%%'''&&&***$$$&&&'''000///%%%$$$&&&$$$,,,333###%%%..."""$$$"""(((888;;;333"""///###))),,,MMM...''' !!!"""###)))...///...444333444888BBBGGGZZZIIIrrrVVVTTTNNNRRR???FFFKKKJJJDDDDDDHHHMMMEEEAAA111///333===AAA<<<<<<<<<:::======FFF<<<999>>>>>>GGGCCCDDD===:::@@@888AAA;;;777GGGFFF[[[QQQ```kkkssszzztttyyyqqqdddiiifffUUUIIITTTqqqNNNSSScccmmmzzz -wwwpppssspppppp}}}}}}mmmrrrooogggnnn}}}zzzyyy|||yyy }}}|||   zzz|||{{{zzzuuuxxx|||yyyqqqssspppmmmlllooouuutttfffkkkwwwfffeeegggggg[[[ZZZRRRVVVJJJPPPNNNLLLJJJNNNSSSLLLRRRNNNIIIJJJMMMHHHOOOYYY]]]___\\\aaaZZZ^^^pppYYYYYYZZZUUUNNNOOOIIIPPPCCCAAA===@@@>>>???NNNDDDKKKKKKEEECCC>>>???;;;///555WWW???(((&&&+++%%%$$$###'''(((///&&&((((((%%%+++'''''''''(((&&&((()))$$$444%%%>>>***&&&""",,,RRR999'''+++HHH///######///###!!!%%%&&&<<<&&&###555$$$,,,{{{%BBB  ...###333AAA111666111333>>>999===VVVSSSHHHTTTzzzXXXWWWYYYJJJQQQKKKLLLEEESSS[[[HHHEEEMMMVVV;;;;;;>>>666999???CCC===888999:::EEE>>><<<999CCC[[[FFFJJJ>>>999BBB:::999777999===EEEGGGYYYuuu~~~uuu{{{iiigggmmmrrr~~~hhhHHHMMMSSSZZZQQQEEEKKK^^^ |||[[[aaaeeemmmmmmtttxxx~~~sssvvvooo~~~|||}}}}}}zzz {{{}}}}}}~~~uuuvvvwwwmmmnnnpppqqquuu{{{~~~pppqqqmmm vvvjjjwwwhhhppphhhnnnhhhqqqqqqzzznnnfff]]]fffWWWXXXNNNLLLUUULLLLLLGGGFFFMMMRRRNNNmmmUUUSSSPPPJJJHHHKKKUUUSSS]]]___aaa\\\\\\\\\^^^^^^ccc___UUU```VVVJJJLLLAAABBB===999777:::;;;888<<>>@@@SSS>>>:::999888999>>>888999???DDDRRRDDD<<>>===999;;;@@@NNNhhh$xxxvvvzzzbbbXXXrrrlllSSSVVV\\\\\\KKK???IIIXXXggghhh~~~]]]gggjjjiiiccciiiuuu|||rrrnnnxxxwww -{{{|||{{{}}}}}}zzzwww|||uuuyyyrrrppplllgggjjjvvv}}}{{{lllpppwwwmmmmmmlllcccfff___ccc\\\WWW[[[\\\[[[______YYYYYYJJJDDDAAAOOOOOOOOODDDJJJMMMKKKNNNVVVTTTOOOMMMLLLIIIOOORRRYYY```[[[[[[WWW\\\XXXXXXVVVTTTZZZUUUTTTKKKGGGGGG@@@888@@@777999<<<<<<@@@???888333===DDDJJJkkk222+++(((***...'''(((&&&###'''&&&+++***''')))...(((((((((444$$$%%%&&&&&&&&&%%%"""$$$777>>>'''"""$$$777---***---'''###555*** $$$111((('''!!!!!! !!!###///$$$$$$***666---...RRR:::===:::AAAEEEHHHIIINNNDDDJJJFFFVVVRRRTTT___FFFAAA===;;;@@@BBB666---333888BBB???DDDUUUBBB666777;;;777<<<777<<>>:::===:::===JJJDDDAAAHHHNNN```tttoooqqqVVVgggtttqqqvvvvvvpppnnnccc\\\NNNaaa[[[[[[YYYXXXeeeqqqmmmppp^^^```PPPdddwwwuuu|||oooooo}}}rrrtttyyy|||{{{{{{  ~~~{{{yyyvvvyyy}}}rrrkkkkkkhhhiiigggkkkooohhhgggpppmmm{{{tttkkksssccc```aaa^^^ZZZWWWXXXXXXUUURRRWWWccc^^^RRRNNNIIIDDDIIILLLCCC@@@BBBHHHLLL\\\RRROOOUUURRRPPPUUUXXX[[[YYY\\\______ZZZ```[[[WWWUUUTTThhhPPPIIILLLFFFEEEKKK???<<>>;;;<<<===666:::===<<>><<<666555555:::888::::::===DDDHHHLLL???@@@NNNddd^^^QQQZZZxxxnnnlll{{{pppWWWAAANNNOOOZZZZZZ[[[WWWhhhlllbbbnnndddSSSGGGTTT^^^qqqqqqrrrvvvyyysss{{{||||||sss|||{{{ www|||~~~nnnmmmqqqggghhhjjjcccjjjmmmkkkssskkkdddkkkaaabbblllnnnfff]]]dddSSSZZZTTT[[[WWW]]]YYYaaaSSSOOONNNOOOTTTLLLMMMOOOJJJFFFDDDEEEPPP[[[UUUZZZPPPaaa___YYYYYY]]]ccc[[[dddaaa___bbbiiiXXXRRRPPPOOOKKKGGGEEE???===888???;;;:::===999ggg??????BBB111222666,,,)))000---***===---<<<,,,///222)))++++++''')))&&&***"""'''&&&&&&&&&(((%%%$$$777'''(((%%%!!!"""$$$$$$(((000%%%&&&)))111---///&&&'''..."""$$$""" !!!;;; !!!"""###&&&)))+++))),,,333222AAACCCVVVAAAIIICCCGGGOOOIIIIIIPPPQQQTTTNNNPPPZZZEEEIII666,,,---111:::444777:::DDD777777777999;;;@@@DDD999999555:::888;;;:::@@@>>>>>>===999;;;<<>>;;;AAA>>>===999???DDDAAAGGG555444777111111......***,,,,,,...+++)))+++)))(((---(((333...)))'''&&&777(((***&&&'''$$$''' $$$///&&&111"""!!!$$$######)))'''###((('''...;;;%%%222 !!!!!!!!!)))333444!!!&&&!!!$$$""")))(((===***666666777555444333888@@@AAAIII>>>DDDWWWQQQKKKiii```yyy~~~FFF))),,,CCC///000555FFF===333888999888666999===DDDEEE:::888999;;;777:::<<<===<<<:::444@@@@@@IIIgggJJJXXXttt[[[aaannnppptttkkkkkkWWWPPP___iiidddccc```llllll[[[HHHFFFHHHRRR[[[iii gggdddkkkmmmuuutttyyyuuuyyytttbbbhhhgggmmm}}}kkkccc___fffaaafff^^^```bbbhhh -zzz```jjjlll}}}bbb```kkkYYYoooZZZWWWQQQSSSSSSoooYYYQQQUUUMMMKKKTTTTTT^^^VVVTTTTTTOOORRRLLLPPPNNNbbbSSSPPP]]]ZZZ]]]aaa___```]]]^^^aaa]]]]]]VVVVVVTTTVVVQQQBBB@@@FFF777555===>>>:::>>>>>>;;;......///,,,000222***)))&&&)))***,,,,,,)))---))))))///'''***555***)))&&&$$$(((&&&...$$$###000$$$!!!"""((( """$$$!!!$$$***%%%((('''%%%!!!222$$$%%% (((MMM  !!!$$$(((---000FFFCCC555...111666???CCCBBBDDDGGGTTTppp~~~mmm^^^sssVVV333&&&)))...---666888===;;;666333777666999:::<<<>>>777333000666555444AAAGGG;;;CCC444;;;EEEGGGGGG^^^QQQTTT]]]dddfffrrrzzzmmmmmmbbb^^^^^^}}}zzzhhhffffffdddwwwgggwwwooo^^^ZZZIIIBBBMMM^^^___jjjZZZ[[[yyykkklllyyyqqqzzz|||mmmeeehhhmmmfffiiiiiifffggg]]][[[ppp___YYYXXXbbb^^^UUUPPPTTTcccbbb\\\YYYVVVVVVVVVXXXYYYTTTSSShhhiiieee```UUURRR[[[ZZZZZZTTTTTTSSSOOOUUUMMMJJJJJJNNNQQQmmm^^^```kkkiii^^^___^^^dddaaa]]]UUUTTTTTTOOOIII@@@>>>:::::::::888???:::::::::999999///,,,///111111333111,,,111111///+++555'''+++***,,,***,,,...nnnCCC***((($$$"""%%%###%%%"""%%%  $$$""" ###&&&(((DDD777QQQ444(((---"""######'''$$$  '''EEE"""###(((***999???444888777<<>>...888>>>DDD;;;888666666:::===@@@MMMQQQQQQSSShhh\\\```ppppppjjjiiillltttXXXUUU___[[[oooeee^^^zzzZZZ___jjjOOOiiilllgggjjj^^^YYYRRRTTTOOOSSSrrrfffkkknnnhhh]]]aaakkkmmmooofffjjjjjjjjj1jjjccckkkcccZZZVVVRRRLLLNNNQQQggghhhyyyYYYOOOOOONNNMMMIIIZZZRRRXXXTTTOOOUUUWWWUUUUUUTTTWWW```XXX```[[[SSSSSSMMMPPPIIIJJJEEEPPPRRRTTTSSSYYY___\\\\\\iiiaaa]]]ZZZWWWVVVNNNFFFAAABBB@@@[[[777:::666:::333444??????@@@CCCDDD777777444111///+++...444111555---&&&''')))))))))))))))%%%$$$'''$$$$$$FFF&&&$$$###''''''&&&%%%$$$"""""""""!!!+++'''***LLLNNN)))(((%%%666---555)))+++ """  ###+++000+++111:::<<>>???HHHYYYOOOGGGGGGTTTXXXfffYYYVVVHHHYYYPPP999---***)))---+++000WWW555;;;***(((000777999333:::666>>>777444888::::::AAA777888777>>>CCCJJJVVVUUUTTTHHHIIIZZZ[[[hhhjjjwwwtttaaa\\\WWWaaaYYY```hhhfff^^^kkkRRR[[[VVV^^^bbbccckkk\\\]]]dddIIIWWWWWWVVV{{{WWW]]]fff]]]bbbdddfffkkksssooogggjjjyyyuuuqqqaaabbbccc^^^YYYWWWQQQXXXTTTUUUXXXTTT]]]NNNLLLSSSLLLTTT[[[YYYZZZZZZXXXXXXeee]]]eee[[[^^^fff]]]YYYWWWSSSUUUVVVVVV```YYYQQQOOOTTT^^^___bbbeeetttjjjccc[[[SSSQQQLLLCCCBBBAAA???999AAA===666777666666:::@@@OOO999>>>;;;gggEEE555555333+++...///......+++)))(((---333,,,(((&&&((("""'''(((&&&'''%%%)))$$$'''###$$$###""""""!!! """""")))&&&+++***&&&&&&+++(((%%%)))==='''''' ######'''+++***444333@@@;;;IIIJJJGGGHHHLLLQQQEEEDDDQQQfffOOOGGGPPPBBBBBBIIIBBBDDD>>>:::555//////,,,>>>888222///333222<<<:::666444555555555666AAA>>>888333:::===???CCCIIILLLOOOGGGLLLGGGLLL___aaaeeeeeelllgggSSS]]]___aaa]]]dddcccaaafff```^^^___mmmnnnhhhWWWXXXUUULLLFFFXXXTTTLLLVVVVVV]]]cccYYYaaaZZZeee```]]]___ooozzzoooyyy}}}ccckkk[[[[[[[[[XXXUUULLLTTTYYYTTTRRRQQQQQQMMMNNN^^^UUUVVVWWWRRRTTTZZZ[[[WWW______cccbbbkkk[[[[[[\\\```gggUUUVVV___hhhaaa\\\RRRXXXiii[[[ZZZZZZggg^^^aaaQQQOOOIIIKKK@@@AAA===;;;:::MMM===666888222222555\\\AAA666FFFDDDDDD<<<444333666---)))'''***)))'''---(((&&&***)))((((((%%%###$$$###$$$&&&###***$$$(((%%%$$$###""""""$$$###......---+++***%%%'''000+++++++++)))HHH)))!!! $$$...###""")))!!!***((((((+++---666FFF;;;>>>TTTAAAOOORRRIIIGGGJJJNNNQQQWWW[[[OOOAAADDDHHHAAAAAA===999<<<333QQQ333444666777333444444666:::777666000111333666;;;;;;:::===666AAABBBAAAIIIJJJOOOIIILLLGGGTTTqqqiiicccdddfffbbbccc[[[^^^YYY```^^^YYYmmm{{{gggfffeee___}}}___JJJmmm___uuu;;;JJJKKKUUU[[[ZZZ\\\ggg^^^YYY^^^___aaa___dddiii}}}qqqsss{{{lllbbb]]]NNNQQQTTTVVVIIIWWWfffhhhVVVQQQJJJOOORRRZZZbbb```]]]XXXddd^^^___\\\aaa[[[bbbccc___]]]YYYgggrrrhhh[[[______gggiiilll[[[eeeeeeZZZ\\\ZZZTTTNNNKKKKKKHHHIIIHHHBBB:::222333555333888@@@777444444222111;;;444>>>>>>999AAA[[[333444...///---***)))+++&&&%%%&&&)))(((((('''&&&&&&$$$$$$!!!"""%%%%%%&&&&&&'''(((---*** ###&&&$$$+++999111???(((***,,,111000666444&&&""" $$$)))!!!'''!!!///*** !!!''')))!!!&&&(((...AAA...NNN999DDDHHHJJJNNNVVVCCCDDDVVVgggtttZZZTTTMMMJJJHHHJJJAAAFFF:::@@@GGG>>>%%%(((111111111///666///666...444111777444666666999666:::JJJGGG\\\FFFBBBVVVSSSFFFDDD???JJJbbblll___cccdddeeepppfff[[[KKKNNNQQQXXXdddmmmkkkiiinnnjjj^^^UUU]]]___iiiSSSLLLMMM@@@XXXnnnYYYMMMWWWiiiZZZWWW^^^eeebbbfffbbbrrrnnnyyyooobbbfffVVVHHHRRRSSSXXXNNN}}}WWWcccTTTUUUSSSWWWSSSYYYfffeee{{{ccceeegggggg^^^fff\\\iiibbbddd|||___lllpppfff\\\qqqeeepppccceee___cccaaa]]]VVVQQQIIIGGGDDDHHHKKKRRRNNNDDD666777666555///222===:::666444888<<<888:::444===888777000444///000***'''))))))''')))111******)))&&&&&&###"""###%%%!!!"""''')))$$$%%%(((%%%)))###"""&&&AAA;;;666+++777'''<<<555'''&&&!!!'''%%% ###"""333666444$$$ !!!,,,+++%%%''',,,333AAA___333>>>GGGIIIHHH???VVVFFFBBBDDDJJJ[[[VVVMMMHHHWWWOOOFFFLLLNNN???>>>;;;@@@777***$$$(((///555...000......---///555111333333000777888444555BBBNNNBBBIIIHHHSSSLLLQQQ@@@HHHSSS```bbbYYYiiidddkkkrrr___ZZZOOOUUUMMMmmmiiimmmkkkssszzzgggjjjUUUSSSQQQZZZ\\\\\\YYYgggIIIFFFXXXbbbTTTRRRSSSSSSRRRNNN^^^]]]aaajjj}}}~~~bbbYYYUUUYYYUUUXXXXXXTTTSSSOOOWWW___^^^^^^YYY[[[gggsss tttcccgggbbbdddaaaffffffggghhhaaabbbkkkbbbssseeeoooeeefffiiinnngggiiidddgggTTTEEEHHHHHHGGGHHHUUURRRNNNEEECCC555444111444DDDGGGBBB444222444666999<<<777222111333222333...---+++((()))'''&&&'''&&&'''&&&'''))))))&&&---&&&&&&$$$///"""&&&%%%"""###%%%!!!"""$$$###---$$$&&&&&&'''###---###bbb+++$$$ &&&'''!!!!!!(((NNN ,,,%%%(((+++///000???BBB===???DDD???GGGHHHCCCFFFzzzJJJDDDCCCJJJRRRSSSGGGYYYPPP<<<>>>999BBB555333(((&&&)))(((,,,---///666///222666111777;;;333333888666<<<333777;;;DDDFFFLLLMMMIII>>>GGGDDDQQQOOOUUU[[[gggiiifff\\\UUUUUUBBB;;;VVVddddddeee0___```UUUYYY]]]```VVVGGGHHHGGGFFFRRRZZZZZZXXXWWWYYYPPPKKKMMMSSSZZZUUU___eeefffcccWWWSSSYYYZZZ]]]UUU___WWWTTTYYY\\\YYY[[[[[[^^^\\\``````ddd^^^\\\^^^gggbbb```eeeeee^^^hhhooossspppkkkiiiiiioookkkmmmtttiiihhhbbbWWWYYYLLLMMMTTTMMMFFFGGGVVV[[[JJJCCC666666333::::::333<<<;;;555666---;;;;;;999777333000777---***+++---***666+++,,,$$$$$$%%%&&&((($$$%%%&&&''''''$$$)))(((''''''""""""### !!!"""""""""888&&&%%%(((&&&)))..."""***)))222%%%:::>>>!!!### $$$''')))%%%&&&$$$''',,,000666888<<<:::CCCDDDEEEEEENNNOOOLLLXXXRRRAAAGGGSSSNNNKKKFFFLLLBBB???888;;;999MMM111///***&&&***111000---000333444888555555666666333555555333666555:::BBBAAAKKKKKK^^^===<<<>>>MMMOOO^^^eeeYYYWWWWWWSSSJJJTTTRRRHHH666PPP___hhhrrr{{{vvv|||\\\aaabbbfffZZZRRRNNNNNNFFFMMMXXX]]]UUUWWWOOOGGGOOOOOOPPPSSSUUU[[[TTTcccfffYYYXXXYYYXXXXXXTTTYYYWWW```bbbbbb^^^```eee]]]\\\ZZZ```___XXXZZZ]]]aaabbb___aaajjjdddhhhhhhllljjjrrrnnnqqqooohhhfffjjjrrrddd]]]aaaYYYOOOKKKKKKHHHKKKFFFMMMHHHGGG<<<444555>>>;;;@@@444666888555222111666999::::::555000111111///222222,,,---111)))...)))((($$$***888...''''''### '''***%%%***###%%%$$$$$$$$$222))) %%%---111""",,,+++&&&$$$''''''!!!NNN???  000 &&&$$$&&&,,,888888;;;@@@@@@GGGAAANNNUUUKKKMMMOOOCCCaaaJJJCCCOOOIIIFFFRRRJJJ@@@;;;999;;;;;;@@@666555BBB***&&&'''))))))000333777444888444666777444444666444333222@@@BBB???@@@EEE888EEE777888AAACCCTTTYYYRRRPPPJJJSSS]]]VVVWWWPPPFFFVVVnnneee```bbbpppgggbbbYYYooosssgggZZZXXXWWWTTTQQQIIIHHH???PPPNNNUUUaaaYYYbbb___YYYPPPNNN```ZZZRRR___]]]\\\^^^]]]]]]YYY]]]ZZZbbbdddddd[[[XXXYYYYYY[[[ZZZ^^^ddd\\\[[[aaafffeeeZZZ___eeeeeebbbdddrrrfffjjjppplllkkk```[[[fff{{{ppplllWWWTTTQQQRRRPPPLLLJJJFFFLLLVVV@@@;;;666>>>999SSSAAA333555:::999444333CCC999999AAA777555000444CCCVVVooo666777JJJ+++...'''***%%%&&&)))***"""%%%((($$$(((..."""'''&&&$$$((($$$(((%%%&&&111&&&'''444000###&&&$$$###///"""...000""" '''!!!  !!!$$$"""###******555===BBB999DDDBBBMMMOOOPPPFFFHHHKKKJJJIIIIIIEEEOOOFFFHHHEEEAAA>>>??????:::888999bbbHHH)))%%%000))),,,000444///555333333888BBBMMM888:::===999666:::===AAAPPPEEE999:::000;;;888888CCC>>>IIIIIIKKKVVVjjjYYYWWWjjjIIIYYYQQQ[[[XXX\\\YYYVVVIIILLLNNN[[[]]][[[[[[WWWWWWWWWVVV```FFF@@@HHHSSSeeelllrrr^^^PPPaaa[[[ZZZZZZSSSSSSdddllljjjZZZcccdddcccbbb```aaa]]]\\\___[[[^^^UUUcccccc___```___^^^\\\qqqqqqgggbbb___hhhrrrqqqjjjaaa``````bbbcccaaa}}}```^^^VVVOOOLLLWWWwwwLLLRRRiii???::::::@@@;;;===>>>???666;;;999222999555888@@@@@@FFF;;;555999555000,,,000...,,,,,,***+++...(((%%%&&&111((('''%%%%%%%%%)))jjj###&&&'''&&&%%%"""$$$%%%'''111&&&)))%%%"""$$$###%%% %%%---.../// 333!!! !!!$$$###))))))(((111SSS888222HHH>>>GGGCCCIIIDDDGGGRRRQQQOOOIIIEEERRR===;;;AAA@@@EEE===666111888BBB[[[222111'''%%%(((000//////111///@@@555222555777::::::222888333>>>@@@DDD======999GGGHHHNNNGGG<<<===<<>>BBBOOO>>>999===>>>BBB<<>>@@@===EEEAAA888777<<<888:::>>>NNN===FFF:::,,,///111...000...333***---'''$$$''''''&&&&&&'''%%% """ """ %%%)))555+++$$$&&&((('''$$$%%%&&&'''###""" %%%""" $$$"""!!!!!! ### """''')))///444777AAA;;;444333333777EEEIIIJJJFFFJJJEEEGGGAAAAAA@@@===???AAA:::>>><<>>JJJJJJLLLLLLOOOXXXeeeZZZZZZZZZRRR\\\XXXVVVeee]]]XXXrrrsssoooddd[[[[[[YYYNNNQQQKKKMMMZZZNNNeee rrr ffffffXXXaaahhheee^^^ZZZ```cccddddddcccgggkkkjjj___```ZZZ]]]fffgggmmmfffvvvaaa]]]eee[[[``````\\\]]]___^^^VVVOOORRRNNNJJJLLLGGGPPPJJJKKKEEEEEEFFFIIIDDDEEEDDDllljjjZZZ[[[___hhhHHH___www999;;;>>>===:::999999CCC000111---)))222222......+++---,,,111&&&)))(((***%%%!!!!!!###!!!!!!!!!###%%%&&&(((,,,%%%&&&((()))&&&000'''&&&###!!!!!!""""""###$$$ +++"""!!!!!!"""  333!!!555444 $$$###%%%,,,+++000888555000444:::;;;@@@EEECCCMMMMMMEEE???QQQAAAFFF>>>???>>>===888;;;999===444000111222...$$$###((((((***+++)))))),,,///000222666222---///CCCGGG222,,,444AAA<<<555;;;JJJ<<>>777;;;RRRPPPJJJUUU]]]ZZZ]]]]]]YYYRRRSSSWWWRRRZZZSSSwwwqqqbbb[[[```eee]]]ddd```mmm___\\\```tttxxx |||sssXXXZZZ___bbbqqq]]]mmmiiidddhhhhhheee``````cccjjjzzziiiZZZdddvvvhhhbbbddd```wwwuuuppp^^^]]]SSS___VVVXXXTTTWWWOOONNNLLLPPPLLLJJJOOOGGGKKKDDDCCCDDDBBBDDDBBB@@@???>>>FFFDDDMMM[[[-\\\IIIBBB:::<<<666999333777555CCC;;;222000///000333......<<<---:::---((($$$######$$$ !!!%%%))))))***000)))555)))******(((:::(((&&&'''!!!***$$$&&&"""###!!!(((999""" $$$222###!!!&&&!!!%%%'''((()))000000888222JJJ???======KKKIIIFFFHHHHHHCCCCCC@@@III@@@>>>===@@@AAA999777>>>555333:::;;;SSS---)))((('''###)))(((+++---///@@@///333444***000222<<<333000888:::CCC888III>>><<>>777666:::???///777111+++///444III)))(((,,,!!!###$$$!!!###"""$$$,,,,,,***222...:::***&&&&&&'''((('''###(((!!!&&&$$$###"""### !!!(((999  !!!######+++---&&&222DDD@@@AAAIII<<>>FFFOOOEEERRRXXX```RRRSSSPPPLLLGGGQQQTTT]]]```bbb\\\```[[[QQQVVVSSSUUUbbbUUU^^^^^^aaajjjssslllbbbUUU\\\rrr}}}~~~jjjNNNWWWQQQEEE[[[NNNOOOUUU[[[```^^^\\\ZZZ]]]^^^VVVVVVVVVbbb___ZZZdddbbbZZZYYYYYYOOOQQQIIIGGGJJJGGGHHHJJJHHHPPPHHHJJJEEECCCCCC<<<===AAADDDEEEIIIUUUNNNJJJAAADDD@@@DDD:::NNNVVVJJJ???FFF<<<<<<:::<<<===;;;>>>iii666AAA555222WWWIII888++++++(((%%%%%%###&&&000%%%)))!!!$$$)))XXX///***(((---))))))$$$&&&(((***)))### %%%%%%###%%% $$$ $$$*** ***,,,&&&///222999===>>>OOOLLLFFFDDDDDDHHHAAAEEEQQQHHHJJJGGG???CCCEEECCC???:::999888:::;;;ggg333???HHH222???///---000***)))(((***)))...444333,,,222:::>>>777999>>>>>>:::<<>>>>>FFFAAA@@@>>>DDD444888999IIIFFFGGGJJJLLLFFFWWWWWWHHHGGGFFFXXXUUUSSSWWWSSSVVVUUUTTTNNNNNNRRRUUUQQQUUU```___WWWkkkfffVVV\\\dddyyy -tttqqqYYYIIIPPPDDDNNNQQQXXXLLLUUUTTTXXXXXXUUUVVViii\\\YYYVVV^^^aaaSSSUUURRROOOOOOHHHHHHBBBIIIJJJHHHDDDAAABBBEEEFFFSSSHHHAAAEEEJJJ777GGGMMMSSSppp```NNNFFFLLLAAAFFF>>>BBBAAAOOOBBBEEEDDDDDD@@@999@@@???:::777???rrr[[[HHH999444888000---,,,///+++$$$'''"""###""" ;;;+++ !!!"""!!!)))GGG+++111((()))'''$$$$$$######...777''''''---...[[[((($$$)))***((("""&&& !!!---!!!'''&&&)))111!!!!!!%%%&&&$$$:::===888GGGOOOGGG@@@999DDDKKKAAAIIIFFFBBB???GGGAAAGGGHHHFFF>>>999>>>:::777///@@@///555)))000---000,,,&&&((('''%%%"""***,,,333222,,,///222666555444===AAAAAA;;;;;;CCCDDDAAA@@@AAAXXXxxxYYY:::HHH===CCCHHHEEESSSJJJIIISSSQQQ\\\PPPPPP___EEERRROOORRRUUUSSSVVVWWWQQQPPPVVVXXX]]]^^^___[[[YYYPPPRRRdddmmmkkkooo___ZZZWWW[[[OOOUUUZZZOOOVVVKKKIII[[[\\\jjj\\\]]]```\\\UUUUUUNNNNNNNNNLLLLLLKKKHHHEEEAAACCCLLLDDDEEEBBBBBBEEESSS===FFFEEEDDD>>>:::MMMWWWpppjjjbbbLLLJJJFFF<<<>>>@@@BBBAAACCCCCCHHH666@@@DDD888===EEE222555PPPIII:::GGGEEE...,,,))))))---'''***(((&&&###888555111---!!!,,,(((!!!''')))---%%%&&&***---'''((((((,,,000'''%%%///'''+++MMMjjj(((%%%$$$***''' &&&::: !!!%%%&&&$$$ """!!!''',,,...111777<<>>TTT===:::AAADDD===>>>EEE>>>:::777OOOsssiiimmmoooaaaGGGXXXDDD;;;999<<>>:::@@@@@@IIIFFFCCCEEEGGGIIIPPPRRRFFFlllIII===888===777???:::///222---***------.........)))'''### %%%((('''000...///222???>>>999888;;;>>>@@@999444<<>><<<<<<@@@HHHGGGHHHGGGJJJLLLMMMNNNRRRNNNQQQZZZRRRRRReeeGGGAAAIIIQQQKKKHHHMMMSSSQQQUUU[[[YYYMMMRRRNNNRRRPPPKKKIIICCCMMMMMMSSSPPPRRR]]]KKKDDDDDDBBB>>>EEE===EEE;;;:::<<<@@@===DDD===FFF@@@<<<<<>>999CCCLLL===@@@PPPAAAJJJDDDCCCEEEDDDBBBEEELLLKKKCCCFFF;;;???@@@;;;444333///333,,,///444555777222111,,,((((((...000///555CCC:::CCC;;;<<<>>>>>>???<<>>777@@@BBB???III>>>:::777999;;;<<>>FFFFFFCCC333444000///++++++///222999111HHH222,,,333000---???+++(((///$$$"""###"""$$$(((### """)))%%%'''$$$%%%$$$%%%"""&&&%%%&&&""")))(((000999...+++(((666888AAA<<<'''((($$$ 666%%%...!!!""""""$$$ $$$'''"""&&&((((((###%%%***(((555<<>>LLLIIICCC;;;777333000333555;;;IIIiii888+++)))(((%%%%%%---222777OOOQQQ@@@JJJOOO>>>:::888@@@999;;;999333RRR}}}HHHMMMKKK???===555,,,444???BBBCCCHHHDDDLLLFFFOOOdddDDD>>>CCC<<>>888>>>DDDAAA@@@DDDGGG@@@>>>EEESSSGGGCCC???999??????@@@;;;777888;;;::::::>>>:::GGG===TTT>>>HHH===<<<===;;;===HHHHHHXXXDDDKKK:::======ooo===777444888444777...111000000///***---++++++)))<<<,,,DDD111>>>111&&&&&&$$$"""&&&"""&&&$$$ """%%%&&&###(((&&&!!!$$$&&&222)))***''''''+++222@@@...))))))444...//////,,,%%%(((%%%FFFSSS)))!!! !!!333 ''' """+++"""$$$"""***((()))AAA888777BBB<<<<<>>999CCCKKKPPPOOO===444111222222222===@@@:::333000000111&&&&&&...:::OOO???:::QQQeeeJJJ555888CCCAAA<<>>444'''...444<<>>DDDIIIFFF===FFFUUUqqqbbbGGG444...:::@@@BBB???AAAHHH@@@999CCCJJJGGG@@@@@@<<>>999>>>CCCAAACCC???BBBEEE@@@HHHDDDAAABBBHHH>>>999===;;;DDD999999888777777???:::===JJJJJJ??????;;;<<<===@@@;;;CCCAAARRR___TTTLLLYYYMMM<<<:::888888;;;<<>>===333...((('''...)))$$$$$$+++"""!!! $$$!!!!!!---!!! $$$"""""" !!!***+++222MMM444444@@@CCC@@@777777BBB>>>BBB===BBB@@@BBBBBB???>>>BBB???FFFTTT\\\===:::GGG666444999AAA999333===888999555)))###+++<<>>BBBAAAAAA>>>JJJDDD))),,,999999DDDHHHFFFEEE@@@HHHSSSDDD>>>999\\\EEETTTOOOPPP???IIIDDDDDD;;;555555888@@@???>>>???@@@>>>@@@LLL@@@<<<::::::888999<<<::::::888;;;===BBB:::::::::AAAAAABBBAAAAAA???<<<;;;<<<<<<===888999:::777555777888888:::III@@@LLL>>>;;;CCC;;;FFF???CCC<<>>+++ ''''''###""" :::666@@@((((((!!!***### !!!!!!!!!---+++222666***000666WWWIII:::HHH222:::===@@@<<<:::@@@>>>@@@KKKIIIXXX<<>>>>>???EEE@@@;;;<<>>:::999888999999666555444888555888;;;888888===;;;???===;;;EEE@@@CCC@@@:::999:::999<<<666666333AAA>>>;;;555888888;;;CCC```LLLPPP@@@888@@@>>>DDD@@@???===;;;JJJKKKFFF===@@@<<<777<<<999333111999;;;888///RRR999---222...000---,,,+++&&&JJJ///111222+++'''&&&###""""""!!!%%%&&&%%%'''((((((&&&...,,,***)))444,,,,,,333+++000,,,)))222...WWW777000***;;;---&&&***555222'''---!!!$$$)))%%% '''&&&!!!""""""###%%%######'''000333666999:::>>>ccc222888;;;CCC======;;;999CCCUUUFFF___JJJNNNMMMLLL;;;DDD888FFFVVVaaa777444111000333111111---%%%777---555555777888999888444111999===777777MMM>>><<>>QQQggg???CCC>>>===>>>XXXCCCBBBCCCHHH@@@;;;AAA888:::@@@777999222888999333777000...+++***///HHH///,,,***&&&((((((000,,,333111)))&&&''')))'''%%%;;;---///)))+++777***...222111===NNN666111444///333***,,,,,,;;;OOO...333***)))&&&((()))"""...%%%///((( &&&%%%!!!"""!!! ###777,,,%%%333666:::///555999GGG888999;;;:::888999===888BBBNNN|||HHHKKKBBB===HHH<<<666CCC@@@EEEJJJ777333444;;;666:::222)))(((&&&///111111666BBB===;;;===???777;;;<<<===BBBGGG999;;;JJJKKKeee>>>444///...000444<<>>::::::222333:::CCCrrrggg===@@@444555666666555666444::::::777999555666<<<:::888<<<<<<999:::888:::===555333666666666666;;;III444888:::;;;444333888666???EEEEEE<<<<<<<<<555:::<<<===---222:::AAA555333888999444333666444:::222444///---+++000111***///******))))))+++)))---RRR==='''''',,,444333```JJJVVV111333555444333222444///:::---+++,,,000444;;;///???<<<===111...'''$$$"""***"""""" ((($$$ !!!333"""... ###---444(((''')))888???111333555777<<<<<<222555111;;;444???888@@@VVVvvvpppvvvJJJ;;;888BBB;;;??????@@@CCCBBBEEE>>>BBB;;;777333===333(((,,,(((+++444555888999999AAABBB888:::;;;CCC???333777666333;;;BBBEEE444@@@444///444111===<<<@@@:::CCCHHHMMMCCCIII@@@444222///888777<<<666444666888:::777555;;;CCCJJJ@@@;;;888<<<888<<<:::555888222555555555555111666@@@777>>>===777:::>>>555;;;777444666555222000444222666333777999222555888555<<<;;;???HHH888:::<<>>>>>999<<<;;;777???DDDSSSGGG666>>>XXX666111333((()))$$$%%%***222777===999666777GGGMMM>>>:::<<<666;;;===:::JJJ222DDD666777333555......CCC??????::::::AAA@@@MMMEEE;;;999555222999888;;;555555999888555::::::@@@^^^[[[HHH777444:::777333333222///222000000222999888222777888:::999:::666555777444AAA666;;;444777222444111444666:::RRRFFF:::999111333111???AAA:::888444777888777777666777444222666777///777???III...000111SSS555555999999666@@@222444>>>___;;;,,,222///222===>>>222>>>333333;;;111KKK:::___777888CCC///---111555===<<<...///111000+++)))000YYYSSS111...***&&&$$$ %%%&&&&&&###'''$$$### """JJJ###...###)))777>>>======***%%%000)))***222...888777999///222222333000000444RRRGGGPPPBBBAAAIIIGGGJJJ===:::<<<999999VVVQQQFFF777111***...444777444///+++,,,(((444777222777222666===BBB@@@???===777999>>>333444444444>>>:::000111222???BBB777MMM;;;;;;;;;FFF[[[BBB<<<777666999444777111999999222333666333666:::FFF999DDDUUU333222444000444III444333111555333===444CCC999===333222444777;;;888999999666888777666777222777===777888???>>>555555444888666:::>>>===555===666===999888444///000999555666BBBSSS444000222666:::TTT<<<<<>>EEE666<<<777@@@HHH???>>>444JJJCCC555...///222999>>>EEEVVV???444<<>>333555000111222555222555333666777444888999999999666333999DDDOOO@@@:::666666555444555555444555666IIIEEE999888777666444666333999===777===666666222555>>>///000---111111555SSS666555111FFF888555???ccc555;;;///---333zzzTTT000AAAXXX888000LLLBBB777777222555888222666444666222000GGGOOO444///+++%%%((('''///111555))),,,***333,,,(((---***&&&,,,)))&&&999***,,,???::: &&& )))###%%%:::'''  222BBB+++...***$$$$$$$$$)))))))))+++...***---///000000...333//////222@@@BBBBBBIIIIII___???AAAaaa@@@???AAAyyyTTT===888>>>...000555333???;;;555111,,,(((---000666444222888666999NNNBBBLLL???AAACCC777999888999888???666666ggg???CCC+++111555===???MMMIII333666QQQ888333AAA666777999GGG777;;;222:::999888:::AAAAAA<<>>>>>555AAA999GGG;;;===999EEE888;;;NNN888333222888***999444999555;;;111<<<===777777,,,111888666222///NNN>>>777444>>>666666```KKK===777222111555777777000xxx|||999888888777666///444333///999000111333555777===333222...jjj###''')))...000)))444)))000...&&&???777+++'''******999444---+++$$$///+++:::444KKK+++ $$$222"""!!!$$$!!!$$$###$$$,,,'''(((,,,,,,111000+++000111555***(((///>>>AAA>>>???AAA>>>???<<<<<<@@@DDDEEE:::AAAEEE:::888888;;;...:::444BBB:::777555000+++...222;;;222FFF444777HHH@@@FFFAAA<<<===AAA<<>>;;;MMM999999888888999999444888999:::999???@@@AAA333999777444;;;555444:::777777AAA:::AAA:::111222111222444;;;[[[GGG777<<<>>>:::888666888///222333---111777000EEE777AAA000;;;777888444FFF777))),,,AAA---///444111999---...333///222;;;///222111(((222444000777444GGG//////111...)))EEE888333+++(((***'''%%%%%%'''%%%(((&&&000+++***,,,000666;;;)))((((((@@@%%%&&&(((...,,,%%%,,,111444---dddGGG### 444%%%&&&"""!!!222'''///000---++++++,,,///444///...,,,)))))),,,///666FFF:::999CCCgggIII???AAA:::555666===>>>III===MMM:::000333FFF666444222------''''''111444555HHH===;;;>>>:::@@@FFFMMMDDDEEE>>>888NNNCCC>>>===...+++***---999BBB444:::444???888999000<<>>:::???:::;;;;;;;;;???BBB===;;;@@@BBBBBB???EEE;;;>>>NNN:::888555;;;===SSS;;;:::===555777<<<777999999666777999AAA777;;;444666444444>>>AAA@@@:::222```SSS999999:::;;;555333MMM^^^MMM===333AAA333:::222777666>>>222555444555444222000,,,000(((((((((%%%,,,444///<<<===;;;444///,,,...+++333CCCAAA999555CCC???444,,,------///)))+++%%%''')))&&&***,,,(((///)))...,,,:::---///DDD+++&&&,,,''''''%%%)))333)))222******666CCC444"""$$$333 $$$!!!###$$$(((???***(((...222555...///...---111///...???555AAA===;;;@@@FFFEEEKKKBBB[[[BBBEEEDDDuuurrrKKKBBBEEE,,,000555666666555+++***&&&###111000333333666777888XXX:::;;;CCCDDD<<<777555GGG===@@@HHH111,,,444///444777---...666111666999666666AAA===999GGG666888999999999FFF999:::UUUCCC>>>>>>>>>FFF???;;;<<<AAA===999;;;BBB???@@@888???GGG:::;;;CCCDDD;;;999444>>>@@@<<<:::444@@@222444555777666888AAACCC888UUU333777333;;;999WWWLLLSSS>>>CCC===888???888888...999666999555222---333+++***///***$$$'''+++---444***111444///:::***+++)))GGG000000+++999777000;;;<<<555...222+++(((&&&***,,,EEE>>>***,,,))))))<<<111+++666444---555///***$$$+++((((((555---'''%%%999)))!!!<<<$$$###:::!!!,,,!!!$$$&&&((((((888(((222222999+++///111111***,,,000111888888:::AAA<<>>:::FFF444@@@555777AAALLL@@@555777000//////444666777888DDDTTTLLL]]]ZZZ@@@<<<444<<<;;;666555666///666333===444111***555+++---222111444555666555888222777999>>>EEE>>>???@@@@@@BBB888;;;BBB@@@EEE:::777777>>>???>>>444:::;;;HHHKKKSSSYYY<<<===888999???DDD999888<<<888999888JJJ666///888GGGDDDAAAAAA<<<555777555<<<...222444888444777EEEgggGGG777555:::222333111111111///222333---+++---...---------------000+++000111666&&&---555--->>>000...---000...///111000...222---(((+++:::000,,,)))((()))))))))&&&111***%%%$$$999'''***&&&)))''':::VVVXXX&&&***&&&&&&!!!!!!!!!"""!!!###$$$$$$$$$###!!!&&&---,,,...>>>666,,,///222,,,***444222666;;;DDDDDDFFFJJJQQQEEE<<<===CCCIII\\\DDD===???DDD@@@PPP===---///222555aaaFFFJJJkkk777777;;;,,,,,,;;;;;;AAAGGGaaaxxxqqq???555111333------666>>>777444333;;;PPP555,,,444<<>>888===444999999999888===333///999888777333666777TTT[[[KKK<<<111777222222111+++000777+++,,,***///333111///111...777///222))),,,,,,***+++))))))...///888000,,,+++666---(((333***+++)))(((444///+++%%%######$$$***""")))---)))%%%&&&///'''%%%,,,###***000...999---&&&"""---(((###  ...***%%%+++...+++===+++222444222888000,,,---///222333777NNNDDDWWWLLLqqqNNNsssKKKLLLDDDTTT@@@JJJMMM```bbbIII444***---111OOODDDBBB666000777>>>EEE555111///<<>>GGG@@@XXX```888666999999555555222666888<<>>333@@@CCCYYYAAA//////000555444111,,,***000++++++&&&------******---888555DDD555+++)))666&&&(((&&&...***,,,...///+++444+++((()))+++***(((///+++***)))---&&&$$$)))###%%%###+++---$$$+++'''&&&)))&&&%%%$$$###)))(((%%%%%%***'''"""""" %%%$$$!!!&&& !!!###)))'''((($$$///+++***...,,,111...111555EEE---+++///222:::HHHKKK]]]GGGGGGQQQCCCBBB<<<777WWWCCCFFFnnnRRRVVVMMM>>>333777???555444BBB===???>>>???^^^WWW@@@222666AAARRRWWWpppLLL>>>555666222222...000OOO999999EEE<<<;;;;;;>>>555......999;;;444444...333777222...000444777666444666444333666444:::333777:::DDD===???<<>><<<444<<<:::AAA>>>BBB444333===444LLL444;;;------'''222))),,,)))111...111,,,444///RRR///===+++))))))111---111,,,,,,...---,,,555999,,,%%%%%%+++((((((---(((((((((%%%***...$$$)))))))))"""######,,,&&&***&&&888"""""")))%%%%%%###///***###!!!!!!!!!333###%%%%%%)))&&&&&&$$$///999...///)))444......777000888///111222555NNNSSSAAABBB>>>DDD===777;;;:::SSSJJJGGGSSSHHH>>>222RRR444444111444BBB???EEEBBB<<>>===777lllLLL777...000222...444555555777444666;;;<<<<<<888999---,,,111222000000555333444333///555555222111333111666666888111000000...JJJKKK666AAA;;;>>>:::555---......,,,000222222000333111...000+++***444BBB```>>>???XXXxxxYYY444>>>FFF666888444555777333000111777555VVVRRRBBBBBB666===AAA:::000***;;;///777***))),,,------***)))---222)))555---+++***000555555111444111///......444***&&&'''$$$###$$$(((&&&&&&((($$$(((%%%///$$$'''555,,,SSS,,,***(((---+++WWWAAA,,,&&&+++444((('''$$$+++444***%%%###!!!111111***$$$###$$$&&&333222###---...(((***+++,,,000@@@...---222...<<<555GGGFFFIIIAAA:::OOO555EEE<<>>444555222555444555666666222444555111666666999<<>>999TTTEEE:::BBBHHH000...555444JJJSSSsss777...:::222???***$$$******......***///@@@+++'''''')))<<<---'''%%%,,,>>>NNN:::333---111444555000(((---%%%%%%'''%%%((((((111222''':::...)))&&&)))///555444WWWvvvAAA+++:::UUU+++...999,,,''')))MMM,,,111'''''''''$$$'''###"""888999///222%%%(((!!!"""$$$'''(((---888888111444...------444///000///666:::ZZZLLLDDD???@@@>>>XXX???AAAMMMOOOTTT@@@888555999444===777555999???>>>777@@@DDDJJJOOOIIIIII777111222TTTFFF777TTT555444444...000444+++***...CCCGGGVVVCCC///222///...---AAA+++(((888***000777111...000666999KKK111444777222333444333///444;;;???555555555000,,,...111,,,---,,,,,,333+++333...111,,,---,,,333<<<444111===JJJ;;;:::888DDDBBBFFF@@@BBB;;;111...444222111...???PPP000...,,,......&&&+++%%%)))...+++***,,,444...111+++'''***...+++)))999BBB;;;<<<555***444333---((())),,,***(((&&&'''***&&&***((((((+++???---'''%%%&&&)))111jjj7LLL//////111???>>>(((---******###$$$(((***%%%FFF,,,)))'''"""######MMM)))$$$&&&&&&%%%###(((%%%"""###(((,,,JJJ--->>>555,,,...111333666///333888@@@BBB@@@777AAA;;;@@@JJJCCCFFFAAAHHHBBB===,,,333444>>>DDDFFF>>>>>>DDDHHHZZZQQQGGGDDD]]],,,222...444(((***,,,,,,222222;;;///111111---333666@@@LLLZZZ===...+++222:::111+++%%%"""+++---///222<<<777555222III333000555111---444777000555???777444555666555888111666///,,,***......+++...555---000222444...555333:::111@@@VVVCCC999BBBFFFDDD???AAAEEE@@@666000///(((///000000222---,,,...***)))'''###$$$'''222///***)))222QQQ---888&&&---'''---000999III:::666444---+++...@@@---&&&%%%((('''...'''###&&&!!!$$$"""&&&)))(((%%%$$$+++$$$+++PPPggg000555***,,,jjjRRR(((DDD666111$$$'''+++%%%''' //////*** $$$$$$%%%&&&AAA///&&&???TTT333(((%%%***))))))***+++,,,111333...111777222666???>>>@@@AAA>>>DDDDDDUUU???>>>LLLSSS>>>555GGGBBBBBBWWWLLL@@@???GGG\\\NNNkkkDDDrrrBBB===;;;666..."""######---///444555111111555///:::555<<>>;;;VVV111---000,,,,,,***)))---,,,,,,+++...000333---,,,///999111+++...777555444???888<<<;;;888000333///---...000,,,...222,,,...000)))%%%"""%%%---'''+++,,,'''+++)))222---555222///+++---+++111...,,,777444222;;;)))???444%%%"""###$$$+++'''&&&$$$"""888$$$!!!&&&))):::''' &&&LLL```///...---///%%%...,,,@@@;;;000333TTT(((+++222###***(((111:::!!!######:::(((+++:::555'''(((000)))+++(((%%%)))CCC&&&(((,,,KKK222222111333888222OOO>>>555;;;SSSIIIAAAHHH:::@@@FFFWWWIII:::DDDOOOKKKggg<<<>>>HHH888BBBBBB444KKK^^^VVVrrrAAA666BBB&&&###'''111444666555444999222666999777>>>>>>===222333666000111,,,:::___:::111***+++444333444///333222777GGG888111,,,---,,,...---444444777;;;000111222555BBB555333---***+++))))))))))))---888...222///...///333------333777999111888BBB@@@333333777000///)))111......***...***&&&&&&(((&&&+++***---++++++///...444000---:::///***000+++((((((...333///***---666222'''777$$$!!!###%%%$$$###%%%'''""""""!!!%%%%%%'''%%%&&&(((;;;,,,(((***222---+++,,,...000222((((((???444///...***&&&$$$''''''&&&"""###!!!$$$"""&&&000111000III---$$$###///%%%///(((---555MMM)))((((((333111000111222666:::yyy888000BBBYYYDDDHHH^^^KKKBBBFFFGGGBBB======HHHHHHkkk999;;;666:::>>>@@@DDDsssnnn```eeeNNN@@@>>>---)))...000111<<<444444777===555111;;;FFF888222222111000444222---@@@:::555>>>&&&'''...111111---222CCC555666000]]]111555......000---,,,000000222111CCC555111+++---000...,,,)))(((******000111---......(((+++,,,---000555LLL111+++BBBNNN999999222999,,,(((///,,,---???+++333FFF---,,,...///(((+++...***000+++444999999222333***)))+++******///,,,,,,+++,,,555+++'''$$$!!!''')))%%%&&&&&&$$$!!!!!!### """&&&$$$(((111777666222+++===666:::+++...444......444---555%%%###"""((((((***AAAQQQ###""""""QQQ:::===222$$$###%%%'''(((%%%&&&;;;666DDD***'''$$$***???:::000,,,444<<>>444111...///,,,,,,+++555%%%)))***---(((***666))))));;;666222111///+++---:::---'''((('''---000(((&&&###444888%%%"""'''%%%%%%###---888(((///---KKK333***(((###---...666666EEE===000222'''&&& )))"""$$$$$$%%% &&&$$$)))111!!!###&&&+++"""&&&###&&&&&&%%%(((000@@@###&&&$$$+++000///222444AAA:::OOO...777<<>>+++)))...+++///,,,+++$$$NNNPPP444((((((555000000000:::555888444//////333333777555222222000000+++*********))))))+++...UUU///&&&+++((('''---,,,(((((('''...+++---000000...<<<,,,000---000...&&&---)))222555777555[[[PPPcccfff444888;;;,,,***,,,+++000222)))---)))///***111...(((///,,,$$$***KKK///BBB000,,,***444...&&&:::)))'''&&&###%%%)))---+++...---***DDD777000:::)))###222///666222@@@EEE333,,,...666000GGG***!!! 555&&&(((###---,,,$$$!!!%%%)))((($$$$$$&&&'''PPP222,,,$$$$$$$$$###777++++++***777444666333444888:::888===;;;IIIJJJMMM@@@>>>QQQEEECCC;;;???@@@;;;,,,***444EEE555999BBBLLL???WWWFFF===TTT666333999&&&//////---555666???<<<000777111>>>)))+++***,,,---444000---000,,,+++++++++555;;;999555<<<999666777666DDD555222555///222MMMFFF///---)))666444...000111111222,,,---000555111)))+++'''++++++///000<<<444111000444,,,***)))%%%!!!"""---///111222@@@III===777;;;;;;---000,,,++++++******'''...000+++---???+++***:::,,,666((((((---***///000222***///,,,&&&$$$&&&$$$'''''')))(((...---***QQQJJJLLL444+++444GGGUUU444+++)))""":::III444---""")))FFF///)))***"""000 !!!)))'''((())) &&&$$$###'''))) !!!######""")))***)))***JJJPPP===---444:::666FFF:::;;;777:::DDDGGGAAA>>><<<:::JJJ===III:::???888999000KKK***999???LLLSSSDDDHHHFFFIII>>>JJJ***///???'''...000III888333000///DDD***+++***///222777888++++++...:::+++&&&000ZZZIII???MMMAAA:::444;;;BBB:::111---111...OOOPPP666888111>>>111555888888666666666555555:::777...(((***+++000---111222000111111CCC111---$$$$$$222333777111CCC666@@@555555555222222333888---'''((((((******111---ooo//////999///+++(((***---'''///111999///777000---*********...'''''',,,555IIIGGGPPP{{{XXX444,,,GGGCCC,,,***;;;)))///%%%&&&...---,,,$$$JJJ$$$***BBB$$$!!!&&&  $$$"""%%%JJJ ***%%%)))((('''$$$&&&"""%%%&&&$$$$$$"""&&&***'''***GGG333777222...333666111111333<<>>???:::DDD===777AAA@@@DDDPPPBBB///222666555@@@CCCAAAJJJqqq___:::<<>>@@@...000,,,...---444......+++,,,///......CCC"""...444111000///222444HHH555222333???000555888///)))///,,,)))666---+++,,,'''+++,,,------,,,...666......---+++000444,,,'''%%%%%%&&&,,,&&&...+++***444666>>>PPP dddHHHlllyyy""""""&&&'''(((>>>%%%$$$GGGWWWUUU:::"""%%%)))+++###!!!!!!&&& ###$$$ $$$&&&---///""""""###$$$'''***777'''///(((((('''(((000777333---222777111222444<<<:::222333<<<666AAA;;;;;;111<<<444@@@BBBTTTiiiWWWaaa===888444999,,,:::HHHmmm;;;222'''((('''+++666+++222VVV///)))555111222111111999111...///000,,,******$$$...555555333666555111BBB???111000***---::::::666444@@@RRR???===@@@OOOvvvCCCWWW;;;:::444111222555???555000...---+++222000---000---111<<<333ccc@@@,,,...444000555666888222hhh333,,,666:::777222222+++444,,,,,,222777666000)))((()))111111---===EEE222---,,,+++///+++:::)))******'''---999111000DDDkkkKKK===???SSS222999999---666***111'''+++)))@@@111<<>>111SSS,,,---///222...111---+++000---***888TTT...+++@@@222555000999333///LLL111&&&&&&%%%---ZZZLLL@@@HHH000555&&&'''111'''000>>>///###&&&'''...222CCC222444777222,,,,,,&&&...(((***,,,%%%(((***SSS444666+++777GGG::::::...(((*** """ !!!""""""===CCC...+++!!! ###!!!$$$ """$$$'''(((...***%%%)))///---333000333,,,///111222111:::888111000222222222666???666>>>BBB>>>IIIhhhZZZUUUkkkPPPQQQ888,,,111///444444>>>+++LLL111+++***(((222???999RRR888777222222...;;;333777???CCC444111000000///333,,,000444111999???CCC<<<444222777333fff:::777;;;>>>CCCLLLQQQddd^^^VVVmmm<<>>+++***$$$+++HHH---666%%%%%%***###$$$+++###$$$%%%(((>>>FFF(((444]]]AAATTT@@@:::###+++ ###888)))***"""000--- ###$$$!!!'''JJJ###$$$333***))))))000,,,***&&&(((,,,---555CCCEEE+++///222888222:::...444<<<>>>777<<>>FFF999000333222GGG===999///:::......,,,***///:::...---666333---......+++111:::CCC***'''222$$$###444+++333555***111888)))+++!!!###!!!""")))&&&'''111FFFGGG### RRR!!!$$$###((($$$@@@---)))---SSSLLLMMM???QQQccc:::222 ,,,*** JJJ"""))) %%% $$$###"""%%%""""""BBB!!!$$$+++&&&%%%)))---000,,,...)))(((---444333bbb444000000444...999222999777999666<<>>)))CCC<<<(((!!! """$$$!!!555000"""%%%***!!!"""###""""""###"""%%%###,,,(((&&&&&&HHH777,,,///)))...111111555444333,,,,,,333...OOO555000///222999111555;;;CCCgggPPP\\\RRRMMMEEE666111777 """***---,,,***333)))+++---888444999AAAAAABBB888777333444111444222333444444666777444999AAA@@@<<>>SSSAAA;;;666999@@@jjjCCC999111LLL444111GGGGGG333222...------///;;;///AAAFFF222888AAA222000111(((***)))999,,,;;;,,,(((000---+++$$$)))### ######""" ---+++ ((($$$&&&///---&&&)))%%%)))555---)))###&&&&&& ###%%%000,,,***999 !!!""""""$$$((( &&& ***(((///$$$%%%$$$///(((***+++///111777***777111444111,,,000777555555222555333111FFF555BBBddd$eeeFFF<<>>777444555;;;777666777777666>>>:::777666<<>>888===333888///---(((000(((,,,......+++)))$$$'''"""###"""''',,,"""###))) '''!!!&&&%%%###+++...---***GGG444+++111"""  --- (((!!!!!!;;;NNN555=== 111 &&&"""$$$"""!!!!!!***!!!///$$$"""'''%%%(((***+++---000111...---***...+++000***333777,,,MMM>>>666555555666??????LLL>>>CCCFFF555BBB999111000111222333999===///---+++...---222444000---888555666333000PPP555>>>777===^^^999777666555::::::555222111<<<@@@;;;666===LLL888222555444555DDDEEE<<<999OOODDDxxxIII777222===333222666555<<<000333666888AAAIIIHHH;;;<<<555:::888555777...666///222888555111---111OOO;;;666999OOO444AAA000777888;;;999333888===999...333111,,,///------***...+++)))'''((("""""""""''' $$$***%%% ###"""%%%)))$$$"""444111'''///((('''!!! %%%(((SSS???###888 !!!)))&&&###(((%%%$$$"""+++&&&'''111!!! ###(((///999BBB,,,000555222GGG111---///...(((***---000AAAEEE>>>333555555888999@@@BBBIIIRRR@@@777LLL;;;:::444BBB888???JJJYYY---&&&...,,,***111333//////***777///111...:::777;;;666>>>JJJDDD666888OOODDD<<<@@@444777888888888888000EEE,,,(((222333UUU@@@>>>444;;;<<>>---CCC444666777DDD555<<<888555===888???AAA444===333000666///333222)))CCC...------444$$$'''***%%%(((!!!!!!!!!%%%+++!!!,,,111,,,!!!$$$$$$$$$%%% !!! !!!"""&&&&&&)))'''""")))###555""" 000 EEE""" %%%$$$***)))111333AAA)))111ZZZDDD111+++...,,,)))((((((---111111333888444WWWBBBBBB999CCC@@@???999999===<<<777:::;;;>>>@@@??????---)))222---444///333,,,'''222(((:::000***000...///...,,,BBBWWW\\\888777UUU???888111555<<<666DDD666000555%%%,,,...---111888>>>666222999000444999:::===999666MMMXXX---///111444666222???DDDAAA888888MMM222888@@@333333---...;;;EEE666///222:::888;;;666555000rrrAAAEEEGGG[[[MMMAAA888,,,///555......'''(((???444)))000$$$$$$(((###$$$"""!!!######%%%''''''JJJ%%%$$$)))!!!!!!***!!!333(((BBB444 ###"""  ---###!!!%%%'''!!!(((***+++???:::666444'''000666WWWQQQ)))'''***$$$***,,,///666:::III;;;RRRBBB???999666>>>888GGGIIIFFF===???555BBB]]]}}}HHH777000---///333222---:::///333AAA---,,,,,,'''777---+++,,,111:::;;;BBBFFF:::BBB<<<333000555555777IIINNNTTT@@@,,,+++,,,333;;;444777666...000---===GGGTTT777:::333III???***(((///333:::BBB::::::AAA???333111666MMM777666222777777999JJJGGGVVVEEE===666@@@555444222ZZZ@@@FFFdddkkkVVV<<<@@@111111999+++,,,'''&&&...+++@@@<<<(((%%%$$$######'''''' )))$$$BBB"""!!!'''""":::%%%***  """%%%###@@@TTT---"""!!!!!!$$$ """ &&&!!! !!!###'''"""%%%(((@@@MMM???MMM;;;///222333((()))))),,,%%%%%%+++***222222555>>>===GGGTTT777111555222555fffAAAIIITTTEEESSS======<<<444222---555666...,,,555>>>III444---(((,,,,,,:::///...------555555999JJJ;;;;;;888555666666111555777222MMMBBBAAA000///444555999>>>000333000...222:::???777222777===CCC***+++)))...444555888222333111111333111555444333888444...444111===999222:::???***666000///777===KKK{{{HHH;;;111333,,,---...,,,$$$))))))***888(((@@@888***ggg((( !!!!!!###$$$!!!$$$###&&&""""""### 222+++###"""$$$###!!!!!! ###,,,YYY+++"""'''$$$###%%%### '''$$$888QQQ:::,,,ZZZVVV;;;OOO,,,333,,,***+++...+++>>>999(((###666######444222WWW777GGGmmm555;;;<<<<<>>555YYY999///555333FFFDDD666888///,,,444222OOO111<<>>,,, !!!$$$888111"""222,,,555######!!!%%%DDD***%%%'''(((###""" &&& """ 999GGGKKK''')))333&&&666\\\(((&&&...000PPP888000++++++,,,AAA...222000...444###%%%$$$"""333...777+++666888222///AAAGGGmmmFFFKKK\\\hhhddd666444333555...---,,,EEE:::,,,+++@@@999999555666111...)))***...,,,---///...???KKK888222222@@@AAA222555333,,,)))111000222333,,,+++---111)))000666111,,,,,,...+++...999222000***...,,,111333333@@@111///222222///===<<<<<<222666222DDD???333333???OOODDD???111222,,,000JJJ666;;;:::333;;;,,,555(((333***---&&&)))+++RRR333222777@@@CCC///000ppp===+++((($$$((("""%%%BBBWWW!!!&&&...))) !!!%%%000%%%&&&%%%+++'''FFF ###%%%DDD---<<<)))&&&,,,###'''$$$ ))) ((('''===111&&&&&&###bbbjjj&&&'''222%%%111===///&&&+++///000...,,,000222,,,///"""'''!!!***111000---444+++++++++<<>>;;;;;;999888III///333777777???333***---)))999333UUU111555222333(((111'''==="""""""""%%%EEE111'''TTTIII???111>>>fffIII)))((( '''666mmm+++'''%%%+++!!!>>>!!!!!!$$$,,,%%%$$$&&&!!!''''''BBB===///)))$$$&&&&&&444PPP777DDDBBB%%%###!!!""",,,(((OOO &&&&&&&&&)))&&&:::'''000...%%%%%%+++>>>```DDD999...111,,,---'''###))),,,,,,>>>>>>...:::EEECCC111???333VVVPPPBBB===222'''###&&&)))666>>>888,,,;;;((()))+++///'''***+++===+++***+++111111777,,,......000333iiiCCC<<<***$$$&&&$$$%%%DDD666111666666,,,***,,,'''&&&+++111)))111222000444+++...000000333555555///333???111444888777888FFF888999777:::???555...000111;;;,,,...***777---((()))---***333...%%%###'''<<<&&&(((666+++%%%''')))333&&&+++@@@@@@666DDDccc000&&&"""((($$$'''''''''(((999''';;;***######111&&& 111###""",,,---+++JJJ,,,+++DDDNNN666RRR!ddd777(((''' ###%%%///:::!!!  """'''HHH$$$&&&666888AAA333AAA(qqq666999999888)))$$$%%%((()))***000)))>>>FFF,,,///HHH222000777...'''&&&###...---(((111......%%%)))&&&)))...((())))))&&&///666+++---///...HHH+++000,,,))),,,???oooKKK111...'''%%%'''%%%)))444555))))))(((&&&+++111,,,999///...000,,,///111///000---,,,000111555,,,555;;;444UUU:::CCC555fff555666444777777333***111@@@000///444------$$$!!!222444'''&&&''')))%%%)))>>>(((%%%###'''&&&"""%%%"""&&&!!!(((>>>555888)))444...)))!!!$$$!!!'''%%%$$$ """///(((!!!)))###111"""***+++"""222888BBB======AAARRR999JJJ}}}5TTT///'''HHH111HHH&&&!!!%%% '''$$$ &&&%%%""""""333(((222???CCCIIILLLAAA111***&&&"""&&& !!!######)))%%%***%%%(((&&&999111IIINNN///111<<<222++++++)))((())))))333///,,,(((%%%"""$$$'''(((---(((&&&...///333))),,,+++&&&))))))---,,,333555&&&'''&&&$$$'''%%%$$$((()))---///++++++---***))))))***......000666888///222000,,,,,,---000+++777555===888888444AAADDD@@@:::777222111444YYY777000555555333:::@@@222111''''''$$$:::###"""...;;;%%%'''(((***&&&%%%!!!""""""!!!""""""$$$YYY---$$$666)))...OOO$$$(((&&&"""'''!!!!!!***+++"""###(((???$$$SSS&&&&&&;;;...222888``````RRROOOPPPIII kkk777RRRPPP$$$ ###...JJJ###SSS333!!!!!!$$$******,,,"""&&&+++333RRR~~~VVVJJJIIIeee444AAA)))222***!!!&&&$$$&&&%%%&&&''')))...***)))111999333+++))))))'''...999'''&&&!!!"""---***...,,,)))'''"""&&&'''+++((($$$+++)))ZZZ***///+++///)))...000222"""%%% """$$$((('''%%%&&&+++;;;$$$'''CCC***---)))&&&,,,+++222'''(((&&&***111+++...---HHH111000111888NNN<<<444;;;555TTT666///SSSRRR>>>OOO===222111,,,IIIaaa???///,,,---%%%)))+++---...666CCC(((%%%'''***,,,222###%%%###!!!"""$$$!!!$$$000'''"""%%%%%%(((222AAAPPP***%%%+++444888///---!!! '''333!!!%%%###!!!%%%ooo...EEEjjj rrrGGGMMM<<>>'''&&&%%%&&&%%%$$$$$$"""###***,,,+++)))(((...'''(((&&&,,,$$$%%%333)))'''###)))***!!!)))$$$)))###$$$+++'''&&&111111&&&***+++%%%***JJJ'''$$$000111444:::---///777222:::111000777555777999999SSSOOOVVV>>>444<<<000///:::888AAA333---...RRR000&&&,,,///DDDEEE666%%% ###+++VVV%%%%%%%%%$$$%%%###***&&&,,,+++((( ###%%%666XXX---***...""""""444AAATTT'''///------### ###'''%%%GGG+++]]]CCCCCCMMM///fffhhhXXX<<>>:::,,,MMM&&&<<<;;;===###### %%%###$$$%%%###%%%%%%$$$######&&&"""!!!%%%$$$)))''''''&&&###...&&&'''$$$%%%///,,,""""""******(((###"""###!!!,,,+++'''!!!"""!!!$$$,,,!!!&&& %%%&&&&&&###&&&)))+++AAA+++%%%222,,,***&&&%%%***111;;;777TTTDDDRRRooodddEEE000))))))---***555FFF^^^BBBHHH000CCC222000(((%%%'''///!!!"""######!!!""" $$$"""!!!"""###'''"""%%%"""FFF"""***>>>111999$$$;;;)))######+++&&& ```###999///,,,(((:::"""$$$$$$"""@@@$$$%%%---222%%%)))333$$$ ---}}}]]] !!!###!!!%%%>>>,,,(((%%%###%%%zzz555>>>&&&---+++*** """!!!$$$,,,"""!!!,,,$$$(((###,,,!!!%%%"""%%%$$$###'''&&&"""&&&+++''')))&&&111LLL"""######///'''"""""""""### !!!  !!!<<<$$$!!!$$$   !!! ###%%%%%%'''&&&---777>>>:::((('''555(((***111222444cccnnnvvvggg[[[///---...$$$)))555&&&+++///)))000///888%%%&&&&&&###%%%$$$,,,******'''###!!! 666555)))###<<>>333%%% ...$$$!!!)))"""###"""(((...###'''###$$$&&&((('''$$$$$$!!!###!!!$$$###!!!)))%%%===&&&333^^^"""###+++'''!!! ((( """ $$$*** ///$$$ +++%%%!!! """$$$333<<<;;;mmmMMM***...,,,222///111......uuuaaaeeeDDD333***))))))%%%666)))"""!!!"""'''222%%%,,,666%%%+++'''&&&&&&&&&$$$### """!!!$$$...!!!666JJJ888555@@@III*** &&&!!!!!!!!!(((!!!"""...'''))))))(((%%%&&&"""&&&)))...,,,###"""111###222***;;;000/// !!!###*** $$$222(((%%%000$$$$$$''',,,(((&&&%%%!!! ,,,(((!!!&&&"""""" '''%%%(((%%%%%%###)))&&& $$$!!!&&&***%%%!!!!!!"""!!!AAA""""""### """!!!"""!!!<<<'''555&&&)))###,,,000%%%&&&'''333///WWWIIIWWW...%%%$$$$$$&&&...'''666&&&'''%%%000111---OOO@@@333&&& %%%"""((("""""" )))###...&&&%%%$$$###MMM---,,,***!!!444!!! )))!!!!!!"""!!!,,,###---sss000YYYCCC '''+++$$$---TTT~~~qqq???$$$ """!!!%%%#########)))'''###+++***###'''(((""""""((( !!!%%%&&&"""###888###$$$!!! 222 """"""  ###"""$$$---"""$$$!!!$$$!!!"""!!!;;;$$$!!!...>>>AAA222NNNDDDooo'''&&&###%%%&&&)))''',,,### ###+++///---888777eee""" ,,,###"""---,,,)))%%%777###888%%%&&&333EEE"""'''%%%&&&***""""""222***!!!111iii111555555+++!!!'''///FFF...QQQHHH555***&&&%%%### ###%%%)))***$$$"""$$$,,,((("""###///)))%%%!!!&&&###$$$&&&&&&***%%% !!!%%%!!!%%% !!!!!!$$$'''!!!!!! ---!!!!!!EEE&&&)))%%%***)))...JJJ000PPPNNNQQQ777"""""""""000111===&&&"""...((($$$EEE%%%&&&'''444 )))!!!'''555$$$"""###(((""""""$$$333---###!!!"""///???'''((($$$&&&jjj&&&222GGG+++""" :::!!!'''%%%!!!"""$$$888000---CCC111666999...$$$)))###&&&""" $$$ $$$ '''%%% """%%%###!!!!!!!!!'''###%%%!!!&&& ###)))%%% &&&---:::,,,666###"""...CCCZZZWWWVVV###... 666HHH111888+++ ,,,888...!!!!!!111 $$$  %%%###*** )))###  ..."""###&&&    NNNCCC***###!!!)))(((YYY(((222777==="""'''"""222!!!$$$ +++$$$%%%""")))***%%%$$$111@@@NNN???BBB+++!!! """###%%%%%%!!!***!!!$$$222!!!$$$""""""###!!!%%%!!!!!! ,,,  )))!!!222"""$$$###!!! xxx;;;"""###*** """%%% ***888&&&"""LLL """+++###555$$$!!!000   QQQ 444???)))!!!###&&& 666)))!!!###<<<$$$%%%/// !!!###""" 333###$$$$$$###///UUU???222HHH !!!$$$!!!"""%%%!!!###!!!)))///////// '''### %%%!!!!!!"""%%% !!!!!!,,,###!!!"""222 """ 888%%%***___(((000 $$$$$$!!!&&&,,,!!!$$$ ///&&&!!!(((""" ((((((;;;FFF000;;;###""",,,)))+++'''$$$!!!!!! %%%!!! ###&&&'''%%%$$$"""&&&@@@222,,,---FFF###### ###""""""%%%!!!### ((("""###!!!!!!'''!!!  ((( """"""***EEE!!!'''!!!&&&%%%(((!!!///  &&&###"""!!!$$$""""""***!!! ### $$$%%%!!!"""!!!&&&%%%######%%%%%%&&&"""$$$&&&%%%%%%!!! $$$###!!!!!!---!!!###$$$$$$###((('''888(((###***$$$---...''')))...///+++(((///111TTT(((%%%,,,111---;;;AAADDDUUUyyy\\\;;;999>>>333FFFoooAAA+++++++++---(((---,,,///((((((%%%222 666===))))))&&&'''&&&$$$###((((((&&&///+++***(((''',,,"""'''(((***((($$$$$$%%%,,,///&&&)))'''&&&+++&&&((()))///111555///222111---<<<&&&---...111///...)))000///444...888AAA777444))),,,$$$%%%"""###''';;;LLL///111777CCC===999<<<222:::>>>222444999666'''...000222000:::===***,,,222333///111***'''///'''''''''333444%%%'''""" !!!!!!$$$+++###""")))%%%!!! """$$$""" !!! &&&!!!%%% 000%%%###%%%&&&### ###"""$$$--- ###,,,"""!!!!!!###((("""%%%###$$$&&&"""&&&)))+++)))555---000"""(((???,,,)))'''++++++###---))))))###///)))444---<<>>111,,,111...---888222444,,,)))000+++***)))555+++...///555000111...,,,)))///(((&&&***$$$!!!+++333222&&&222333NNN888444III444MMMNNNIII===III???>>>;;;;;;///<<>>777444***,,,///555777444...###$$$555,,,***...---UUUDDDAAAIIIIIIEEE===GGGGGGEEELLLSSSBBBDDD???CCCPPP999@@@444+++...---111111***,,,111'''///)))***,,,(((&&&%%%!!! """ """ ***EEE""""""(((%%%!!!!!! %%%###!!!"""!!!***&&&$$$$$$&&&!!!!!! $$$'''&&&)))!!!!!!'''&&&&&&222...)))'''%%%###$$$((((((%%%+++***%%%///---(((---...(((555777///333///555---+++%%%>>>???,,,,,,000***"""'''(((,,,...444LLL[[[444000888UUUlllJJJMMM222000//////---777444(((++++++,,,'''***&&&$$$###$$$"""+++%%%+++---+++'''$$$&&&000$$$(((***%%%+++'''++++++''''''(((+++333555000---333///+++000)))(((%%%$$$+++,,,---777888777333777AAA999888888:::222:::888333999555CCC:::333111...///,,,,,,111555)))%%%###111777CCC000333888===666999<<>>CCC222;;;IIIFFF888...,,,***...!!!%%%&&&((("""###111)))...333 !!!###444  555+++'''---  111%%%!!! '''%%% """!!! ###!!! ###***---!!!$$$))) ''''''''')))%%%...,,,///@@@--- ---***''''''&&&!!!///222///<<<@@@,,,'''111###""" +++???---,,,333333+++666222(((,,,///000444???DDD000***+++111***'''###%%%***(((+++---,,,---,,,###///...### """***EEE&&&"""###!!!"""###"""$$$'''%%%!!!###'''***+++>>>000000000000,,,,,,555(((,,,###"""'''(((+++,,,...(((,,,333888QQQ:::[[[:::777777>>>EEE???<<<222999EEE555999+++666[[[???KKK999,,,@@@---***(((///,,,???>>>MMMRRRQQQRRRIIIEEELLLZZZJJJSSSBBBDDDUUU===DDDRRR```444333...(((+++(((---$$$+++$$$***%%%%%% """!!!!!! ---  !!!###%%%%%%!!!%%%'''"""&&&!!!"""""" """***!!!)))---!!!(((...'''%%%///"""+++%%%+++)))***---999444***&&&%%%---222***)))%%%&&&@@@???EEEgggLLL---$$$!!!!!!$$$!!!&&&222>>>&&&---(((---)))000(((///+++---333555000,,,---)))...---,,,,,,''')))***------+++AAA222...%%%###$$$""" !!!!!!$$$***"""!!!$$$$$$$$$&&&)))"""&&&&&&&&&$$$,,,***$$$(((,,,)))(((***+++000'''!!!,,,...444,,,111000***(((---000PPPFFFEEEHHHFFF???III;;;===<<<:::FFF@@@+++(((+++GGGIII===666GGG[[[222"""(((555000)))000<<>>666,,,---444JJJFFFFFFSSSQQQSSSZZZJJJNNNKKKJJJRRR```kkk[[[RRR@@@:::000...+++---&&&'''111***###&&&(((%%%######%%%$$$$$$###&&&!!!///+++%%%;;;### 000;;;MMM%%%%%%&&&))) 111!!!$$$$$$&&& ((()))!!!###  """!!!$$$$$$$$$>>>###$$$''',,,"""###)))BBB333:::BBB333---RRR111...(((...111000333BBB***++++++000'''333>>>///---)))$$$!!!$$$&&&(((///444***++++++222888---***,,,---///444HHHSSSMMMfff<<<111...+++)))(((((()))$$$&&&)))((()))%%% )))!!!777***::: ###"""$$$%%%""" $$$&&&"""'''+++%%%###&&&&&&******(((&&&***&&&%%%$$$$$$###&&&888,,,---000999777***000333++++++###***+++HHHBBBWWWKKK@@@BBB???@@@888:::???>>>AAA...333|||BBB<<>>===@@@222222FFFFFFAAAIIIHHHLLL\\\RRRFFFDDDjjjJJJXXXYYY[[[NNNAAA@@@CCCCCC///...777KKK:::111***$$$###(((''',,,BBB  !!! $$$"""###'''"""$$$+++)))'''!!! 555:::,,,QQQ444%%%### ???111 """!!!999---%%%###%%%!!!&&&"""'''"""$$$---///'''***'''...;;;MMM((()))'''BBB555:::+++000+++111333+++///BBB...111333888...111GGG999555))),,,///000///+++((('''###&&&///111+++...///...000,,,***$$$ ,,,===///999zzzFFF(((+++***"""++++++ >>>JJJ''')))***666...555%%%###%%%000)))$$$$$$&&&'''%%%###%%%$$$"""%%%((()))%%%"""$$$###,,,###$$$$$$%%%$$$&&&***WWWfff***LLL{{{000******///444333111---000***333777888<<<777???>>>TTTPPP@@@CCCLLLQQQ888TTT333///111VVVJJJHHH;;;LLL{{{666...@@@JJJRRRFFFhhh\\\ZZZVVVJJJEEEKKKJJJNNNffflllbbbiiiGGG<<<777777...666888000999888)))###'''999555@@@/// ###!!!!!!!!!!!!%%%... $$$"""$$$!!!"""""" !!!!!!%%%---666555###&&&######***"""888!!!$$$'''&&&---)))%%%### !!!$$$$$$'''###%%%)))+++***CCCNNN<<>>???OOO===AAA;;;DDDDDDAAA222///>>>fff999@@@PPP^^^666***,,,DDD???;;;hhh{{{JJJ EEE???DDDFFFRRRdddYYY|||rrrCCC999III>>>@@@>>>444666@@@999,,,+++,,,000---000%%%###"""!!!"""""" $$$$$$$$$%%%"""!!!!!!"""###)))""" """!!!!!!777+++111%%%''',,,333,,,///'''(((&&&)))***"""---'''### ***###"""000***%%%,,,&&&$$$888,,,111,,,;;;DDD---BBB999:::>>>TTTEEE///&&&######&&&222uuu111((((((000(((''')))'''(((666OOO(((###&&&((('''***666***+++***((((((..."""""" !!!###!!! !!!&&&???&&&"""&&&$$$%%%000//////000555###000...???'''&&&%%%###111((()))***%%%$$$%%%%%%&&&'''$$$)))%%%&&&(((&&&&&&'''(((%%%$$$!!!!!!$$$+++'''...---333---111777///888///111111000///---(((///000JJJ:::;;;===999GGG999???BBBCCCAAA>>>777555666999888:::PPPNNNMMM>>>---444333===@@@JJJeeeSSSeeeHHHAAABBBVVVUUU```~~~qqqLLL>>>222222<<<===LLL:::888888///---888000333333,,,&&&### ###'''%%%<<< !!!"""&&&,,,%%%"""   """$$$ ))) &&&### !!!$$$%%%,,, """ """$$$%%%&&&&&&***((($$$ """### ######(((%%%***...DDD'''(((777###!!!((('''+++***+++333......777111999OOONNNYYY(((FFF(((&&&"""!!!''''''&&&,,,$$$&&&''' ***!!!$$$'''(((%%%DDD(((,,,333CCC***---(((;;;444(((***))) )))&&&%%%$$$$$$%%%###!!!!!!;;; !!!+++'''111***.........,,,,,,&&&777***===((()))&&&!!!%%%...+++((((((""")))000---%%%%%%&&&)))'''"""(((&&&***'''+++%%%###""" ((($$$)))GGG111LLLEEEHHH111222333444000111......+++,,,+++)))444777444:::BBB<<<>>>QQQNNNHHH;;;:::333///444999BBBAAAEEE@@@777888000444:::888888LLLJJJYYYpppLLLVVV[[[\\\MMMTTTMMMJJJCCC444444::::::===777111222---((((((...000777///"""%%%###$$$)))""",,,+++"""%%%%%%!!!###%%%###%%%###"""$$$$$$%%%%%%!!!***222 %%%$$$))) &&&***%%%### """!!!!!!$$$&&&)))'''(((444,,,$$$///+++(((000---***...333555777///000222888GGGTTT***777444...(((---'''$$$  !!!$$$$$$###"""$$$!!!$$$%%%(((+++''',,,---(((***///@@@XXX((()))---EEE'''%%%$$$(((###!!!+++###$$$%%%%%%'''&&&"""%%%$$$((((((333'''((()))999...%%%,,,<<<((('''""""""&&&***&&&+++000'''---&&&)))(((&&&&&&'''''')))111***000,,,+++...(((&&&"""$$$)))---,,,(((///555555AAA666555444222111222(((+++*********:::>>>===::::::777???GGGDDDDDDfff333000...>>>KKKGGG555<<<777444...888:::666222+++...DDD^^^ZZZeeewww aaa[[[MMMIIIAAA:::222999999222...222,,,///------)))+++333444((($$$%%%"""&&&$$$######$$$"""$$$!!! ###!!!&&&!!! ###%%%"""***...GGG(((###""""""'''### """ $$$&&&999%%%$$$$$$""""""&&&"""$$$###&&&!!!:::...<<<,,,444777///222555444777333000$$$---OOO444777...666000***'''%%%###!!!"""######""""""!!!###---///000)))+++222&&&%%%,,,---000******...EEE)))"""$$$AAA!!!"""$$$%%%BBB!!!%%%""" ###$$$ '''###'''###(((***(((+++***'''888777666$$$333)))&&&***&&&+++---,,,,,,***++++++''',,,---///...555,,,333***))),,,+++%%%!!!###"""""",,,+++***$$$%%%;;;aaa222000000555444///000... (((...:::CCC@@@777AAATTTAAA999BBBAAA999666222111777^^^KKKVVVGGG777888000222999;;;000333%%%'''NNNNNNXXX\\\ SSSMMMUUULLL999777333888777,,,,,,***333999,,,&&&(((,,,***???===666$$$!!!#########$$$ ######%%%(((!!!!!!!!!"""!!!!!!$$$000///%%%222$$$$$$,,,'''###!!!!!!''' ***###$$$$$$999###!!!222$$$(((III;;;(((((( """))),,,)));;;''',,,******333777555@@@===666JJJ444@@@)))888777------///***+++000---111$$$!!!(((,,,---"""%%%"""((()))'''(((###&&&***'''%%%%%%))),,,%%%)))(((,,,((()))***$$$"""!!!%%%222""""""&&&&&&%%%###(((&&&%%%(((OOO&&&000)))%%%@@@***''' """'''%%%000mmm222***+++---+++000(((...???((()))888***+++***---...333......111+++"""(((:::%%%***)))&&&,,,222,,,***(((%%%///222))))))+++333111---111---***'''------000999555NNN;;;@@@CCC999:::CCC999666111444666666===:::???777111000333555555---"""FFFKKKRRRhhhPPPSSSPPPXXX<<<>>>>>>666???333***+++>>>111///(((===222,,,%%%&&&///,,,&&&&&&$$$"""'''!!!(((<<<&&&+++'''###'''"""### $$$555$$$<<<>>>///---&&&"""###  !!!### $$$%%%$$$%%%###>>>222...###$$$)))***)))$$$QQQ((((((!!!$$$$$$!!!$$$***'''***---(((,,,***+++222@@@888444888222'''$$$---eeelll666555555333---//////222(((!!!)))+++,,,000'''%%%...+++((($$$"""!!!""")))''''''+++,,,************%%%$$$(((%%% %%%000444%%%$$$***'''"""&&&""""""%%%&&&&&&111(((""")))***'''$$$###'''$$$,,,***+++------(((***------******///++++++))))))---111000///111111000+++//////******,,,)))''',,,------)))---((('''>>>''',,,***+++333444222---...+++(((,,,)))---;;;GGGHHH>>>@@@===999777EEE>>>???333444---222JJJ666^^^EEE222111111111222111...%%%###***CCCPPPMMMXXXTTTQQQVVVMMMEEEKKKGGG:::HHH777>>>000+++***,,,******000---///)))((($$$$$$&&&%%%'''!!!((("""""",,,%%%%%%"""!!!""" """&&&&&&444111(((...---333:::!!!  %%%!!! !!!$$$!!!$$$$$$444...nnn333222"""(((""""""%%%&&&$$$"""###"""$$$***!!!'''&&&)))///,,,444,,,222222888???===------000+++JJJaaa333---JJJ000------!!!***&&&---111+++***(((***,,,***>>>%%%###$$$+++'''((()))ddd))))))&&&$$$'''"""###"""###"""###&&&---)))%%%$$$)))$$$%%%$$$###%%%###"""&&&%%%((()))%%%"""""")))(((...222+++111+++)))'''((((((***(((''')))444***---///******///---///333(((111555...111222,,,+++333:::@@@444,,,///+++:::111+++)))%%%333777<<<444333///...000&&&***///555MMM:::@@@SSS999111555@@@???777555555555LLL444???;;;666...333333444444555,,,,,,+++444pppwwwwwwbbbYYYQQQVVVMMMGGGEEE;;;333000555555666000333888......@@@+++%%%%%%$$$'''&&&$$$###$$$ """"""###!!!%%%###''',,,&&&%%% ......&&&###...###""" '''"""!!!###+++(((***)))...***,,,>>>...$$$######)))"""$$$'''###!!!(((&&&,,,%%%$$$''''''%%%&&&(((,,,000000...)))111222///666333NNN<<<222aaa`9]]],,,###,,,222'''&&&***111))),,,,,,......+++******+++(((,,,$$$%%%###...+++%%%''''''(((%%%$$$###&&&((($$$$$$%%%######!!!!!!$$$((($$$$$$%%%###!!!###&&&((((((''''''%%%###%%%333+++&&&(((***((()))***'''&&&,,,222...***...000...000333000)))000------,,,000000:::KKK...222555555555444333...333333888555...///---222000777222777888111777===333333222...222777<<<<<<444111===???888444777888333444555:::CCC:::888999666222111...)))000111```{{{___RRRPPP]]][[[VVVUUUMMMCCC;;;NNN555222<<<444CCCjjjHHH...444___***---***222...)))###""""""+++FFF,,,%%%""",,,!!!$$$###((("""$$$'''%%%)))%%%### !!!(((%%%### """%%%***WWW$$$:::555%%%$$$,,,,,,WWW000111'''"""%%%&&&"""&&&$$$"""###666---&&&NNN&&&)))###((((((,,,333,,,555555---***,,,&&&888EEE...[[[mmm>ppp999&&&$$$///***&&&###'''000***,,,...888444***+++)))''''''%%%---%%%###***666(((&&&###&&&'''&&&%%%&&&!!!%%%$$$%%%&&&&&&###$$$###---''' """'''&&&,,,%%% """""")))+++%%%,,,555***)))777******+++&&&(((,,,(((&&&---777000444111///444...,,,666///......***---...,,,***111555333===333111777000666777777444444///000222111---000555111222;;;111;;;===666333444666///888:::999444333666BBB<<>>222>>>///000222...///222000...111666...111777777666777888000???///222;;;:::666999HHH===LLL888;;;666666???666444333111111555444444000)))"""###)))666KKKPPPqqq___MMMQQQSSSPPPJJJ\\\888;;;BBB:::777666///---***(((###---000++++++000444,,,&&&&&&,,,%%%***(((+++$$$###$$$### ###))),,,000$$$$$$'''+++000!!!$$$###'''>>>$$$...333((($$$&&&...+++,,,***'''+++!!!$$$"""%%%""",,,,,,)))&&&((()))%%%'''%%%'''333(((&&&''')))***+++***'''&&&+++ &&&111///666///''',,,666((())),,,******000+++333111222000999//////***$$$"""&&&###***%%%%%%+++***''')))***///+++''''''---///&&&(((******)))&&&'''+++'''(((***%%%((($$$&&&---''''''&&&''''''+++111,,,...---))),,,'''(((,,,+++---//////444///000111777666===222---555EEE444///---((((((///333HHH666::::::UUU@@@000///222666000000444111444---///...///333LLL444333BBB@@@222555666888///+++555888:::333DDDEEE@@@===<<<===;;;333:::999777666444666<<<999...,,,///&&&...888LLLCCC???JJJfffKKKcccEEE@@@///999888===;;;222...***)))(((&&&((()))))),,,///<<<777///)))---'''))))))'''---'''***)))>>>$$$###%%% 999&&&&&&))) !!!!!! ...---!!! ???]]](((...&&&&&&---000(((///"""''''''$$$ ///)))***!!!$$$'''&&&$$$ """&&&)))(((&&&,,,+++...'''$$$$$$'''%%%$$$###'''''''''...***444FFF:::111(((333,,,+++///...000***000333111BBB---$$$)))$$$!!!!!!---((((((***+++111///***,,,000EEE...,,,))))))222333888,,,'''---...---...***%%%$$$&&&++++++***++++++)))***---,,,---***++++++000++++++)))***'''000...)))+++,,,999666333333AAA888///000111,,,///444000***///222:::SSSGGG===333---///111---666666777555???111000333333111333,,,///222;;;666888444333***333+++444222444888===999FFF>>><<<999666888777555888888888???@@@555000111---444===666DDD===III\\\[[[NNN@@@777BBB888GGGCCCBBB;;;444333>>>+++(((+++444,,,&&&---CCC111$$$AAA@@@,,,***)))(((---,,,&&&%%%###%%%&&&!!!###...444###&&&!!!$$$&&&"""333 !!!!!!///999222'''''')))(((555111+++!!!'''"""''''''!!!&&&222''''''%%%"""%%%""" '''######&&&444)))(((&&&***%%%"""(((,,,)))'''$$$)))***%%%"""333222:::WWW>>>888DDD444%%%333777//////...---000222777...((()))+++"""'''$$$)))'''&&&***+++(((+++000+++222555---)))---,,,111---///000111,,,...)))&&&666,,,---,,,(((***---+++...)))(((((('''+++,,,,,,,,,&&&+++&&&)))(((222+++,,,000000333ddd===666555@@@AAA444...000,,,444///))))))@@@:::222222<<<999BBB333+++......///333999<<<777;;;333444333...---,,,---000??????999777:::---'''+++(((111444888<<>>888,,,---,,,(((,,,///...)))---+++,,,(((444CCCHHH///...###%%%"""***'''(((""""""(((,,,***(((000111###&&&,,,/// """!!!$$$"""'''((($$$SSSRRR888%%%***<<<---)))000///&&&""")))""" !!!$$$###'''###&&& """!!!'''(((&&&%%%&&&$$$,,,(((&&&)))''''''%%%222444666333YYYttt888333999+++$$$---000+++''',,,,,,888666AAA///***%%%&&&$$$((($$$))))))...)))***---...(((---///777///111000///444===;;;...222+++,,,///444@@@555///222111///000666,,,***111111,,,***,,,******...111///---)))@@@***+++===333111444@@@CCCMMM:::666...444000222------+++,,,999===:::AAA444333111555EEE111///555000222GGG888666000<<<>>>///+++///---...GGGXXX555333000---''''''///222000333:::???FFF@@@777<<<999333666888666======888:::;;;===555333:::???FFFGGG>>>KKKIIICCCNNNCCC>>>DDDDDD___BBBOOO222000222,,,,,,222//////***,,,666+++###333...444---&&&###$$$$$$%%%###!!! ###%%%IIIDDD000HHH:::000'''+++...%%%###"""!!!!!!""" !!!***&&&JJJMMMAAA'''+++HHH,,,///TTT,,,""" !!!!!!!!!!!!&&&)))"""&&&###&&&,,,)))+++&&&$$$)))&&&(((******...***&&&///444555^^^1 LLL555///333...CCC333###%%%,,,111---===---333))),,,&&&)))$$$)))555000)))***(((,,,///AAA333333000000111000---...333222333444555333>>>777333555GGG<<<444EEE>>>888;;;999444000000222...***(((***...)))000...222:::777555:::111---BBB[[[MMM888000+++---999......---***---333///:::222444000...;;;444666...333999///@@@888<<<111111666444444000222...000:::333111111333'''***+++))),,,333333???BBB===BBB777999222888888999CCC???>>><<>>///111,,,>>>qqq***000%%% """&&&)))###### ###"""""")))%%%$$$222***$$$&&&***)))'''---&&&(((***+++---444...444444BBBwww_]lll???===<<<333666111333...///222---333,,,&&&(((...((((((111000000...+++,,,+++222///333EEE---//////;;;;;;;;;555CCC000///111666555111???>>>BBB:::???<<<===DDD222777:::999666333333777111===---+++,,,+++******//////111666666666FFF111;;;BBB000...///111(((***(((...***&&&***,,,999,,,000...CCCFFF333777555<<<000<<<555;;;FFF333666777@@@333555666444000888555444444+++***///+++------<<<888888<<>>***%%%'''(((((($$$&&&###"""'''---&&&###CCC###444222(((...###$$$%%% ***%%% '''%%%"""+++%%%%%%'''%%%$$$***111999***+++%%%'''+++'''######111...666???mmmI1```WWW000000<<<222666444666<<<333...+++))))))111;;;++++++333,,,222111222///---///+++)))***000000111@@@CCC<<<444888777444222666222666555<<<===444XXX888444999333000222555222...+++***222...---***(((---...---,,,---,,,---///+++***(((333666444---SSSAAA777......((()))(((***$$$,,,))),,,777FFF===333222AAA999333777EEEWWWPPP777555CCC888222>>><<<333222\\\===333222...+++((('''000111<<<777YYY777777888::::::;;;;;;>>>888666333888::::::DDD888888666QQQBBB666===NNN222:::@@@fff&hhhVVVKKK333222000888;;;777///...000+++$$$(((SSSSSS>>>AAA%%%(((&&&%%%&&&$$$"""'''###!!! 000***)))%%%***"""(((&&&+++......&&&###444###!!! !!!$$$$$$***(((000,,,===%%%###((()))$$$$$$###""" %%%'''"""$$$&&&### """%%%&&&'''((((((999ZZZ...)))&&&'''''''''===+++HHHWWW===:::QQQ___WWWJJJ999222000111......===BBB@@@999777,,,...000BBB222******---&&&***777222000111000666222111111333333222888999444:::<<<:::555111666999777666KKKIII777...222000+++,,,000///---+++------]]]111///...111000******111DDD///+++(((***111$$$$$$111===@@@999,,,,,,888888***,,,%%%...&&&+++OOOEEE888>>>HHH***%%%333000111333222999FFFAAA:::333999333///222333333AAA222---000---///%%%---------444===999:::EEE999999:::666::::::999555,,,444::::::>>>999555333444///...000EEE888888IIIfff&wwwwwwSSS<<<444000222333...111%%%,,,***&&&((((((###)))&&&***%%%&&&(((&&&&&&'''$$$''''''###'''&&&&&&"""'''$$$+++"""%%%+++222***666)))...""""""""",,,...$$$'''...(((!!!%%%"""((( #########'''### %%%%%% $$$!!!###"""((('''(((&&&$$$)))'''///888,,,******&&&***+++333LLL888<<<666jjjTTT===???444333......000+++///444???CCC[[[NNNEEE222555111...888++++++***%%%///333000333---///333...---555;;;888666999SSS;;;:::666777777888888:::666999>>>333---///000...,,,NNN---//////---111555///111555111444...000000111.........(((''''''&&&***444YYYQQQ333222&&&''')))***###***&&&&&&(((,,,333;;;444!!!!!!&&&+++555777???888:::BBB777///)))444000000...111666***'''+++EEE+++###%%%)))>>><<>>%%%***)))...111)))$$$999888333000222333444;;;777777<<>>===444555:::444<<<;;;444222111666555333...,,,,,,333666777888777666/////////222222666222333555000......---000...,,,)))&&&%%%111555@@@:::<<>>///333111888000((($$$&&&%%%***333$$$%%%999444CCCIII<<<@@@EEE===:::999444666111333888555666666333888>>>888???;;;888,,,%%%$$$333```~~~$jjjYYYBBBCCCCCC666---555000999...&&&###&&&&&&!!!'''((('''+++((("""%%%(((###!!!%%%(((%%%(((!!!"""%%%)))***)))+++333III***'''&&&!!!!!!'''***&&&###!!!!!!$$$&&&(((777'''(((&&&&&&%%%999$$$--- ###333(((111&&&+++***'''###!!!&&&(((%%%)))(((+++,,,***'''%%%444;;;***666333CCCKKK///AAA///CCC;;;AAAHHHBBB<<<000...333444000111((()))))),,,'''555+++***000000333444:::;;;UUUAAA888999666666999SSS888666444666999:::555;;;<<<===<<<>>>999111***333999888333333333555222555111000------333222000...111111...---...222...)))///000...666===444666222//////)))++++++666JJJ222555777888@@@HHH999777---222:::444111444222444>>>YYY111***---KKK999III/// """---000+++///BBB'''...WWW<<<>>>:::;;;888555999888<<<555///444777:::777666999CCC\\\AAAXXX///"""###!!!%%%\\\tttgggNNNAAA888BBB333...///---///'''333&&&'''&&&---$$$%%%+++((()))"""+++&&&(((((((((###"""###"""!!!%%%)))111---333]]]===&&&###$$$$$$%%%######"""444)))""""""###!!!)))''')))999888III---'''***'''---!!!$$$### GGG$$$!!!%%%***111%%%###"""111((()))777...&&&(((((("""%%%***$$$'''222CCCVVV:::333777555UUUGGG???]]]777555;;;333444777111222222000,,,222111666333333999===;;;<<>>KKK>>>WWWAAA111111///---222---,,,......,,,+++777111111%%%000888===111444555777111000888555444+++111000OOO666,,,###!!!(((,,,///...(((+++&&&)))CCC@@@:::999999===777777777555555555888777888;;;>>>???BBB@@@;;;---'''OOO111!!!999KKKSSSUUUSSSJJJGGGJJJ222<<<000***///333222---)))%%%***###***222$$$###)))'''000''')))***(((&&&&&&""" $$$%%%***$$$'''&&&%%%***///%%%333---111---%%%'''---!!!"""!!!!!!$$$###%%%'''---+++%%%111OOODDD%%%!!!((((((###!!!&&&!!!((($$$+++%%%%%%...111+++%%%###!!!!!!!!!'''+++444...+++'''***$$$ %%%%%%)))888HHHJJJLLL\\\999888;;;;;;FFF>>>RRR999444===AAA000---000111000:::333222333<<<===>>>;;;;;;CCCAAACCCFFF===DDDBBBCCC999666===:::888777<<<>>>BBBBBBPPPHHH???DDD<<<===CCC:::222555999CCC999333777666111333000...000+++)))...***+++,,,...000000111111555444BBBCCCFFF444FFF///......444;;;***...///------)))///222***666???'''+++444777---FFF///444333---...000444222:::666'''$$$&&&+++000---......***''':::;;;333666888333DDD777444777===444<<<:::999===@@@???DDD999222+++'''222PPPIII333TTT666AAAVVVPPPHHH]]]===777///---...***===000111---&&&)))---)))HHH((((((,,,***++++++&&&###(((+++,,,&&&)))%%%$$$&&&&&&'''&&&$$$$$$---QQQxxx777+++)))$$$&&&"""!!!&&&!!!)))'''&&&)))...)))%%%)))+++;;;888 """%%%'''###111 """&&&GGG???000......+++777$$$'''%%%!!!"""""")))+++...///&&&"""---'''&&&(((......---999CCC???:::======EEE666111444:::333999EEE999,,,,,,222999222;;;999000:::?????????<<<@@@CCCDDDEEE:::@@@MMM>>>CCC;;;;;;===<<>>@@@AAALLLIIIGGGRRRLLL===999;;;@@@EEE777III???:::AAA;;;444000111...+++...******+++//////111111...111///+++222000OOOOOOHHHAAA222222:::???;;;===111---***---///FFF---$$$%%%///---)))---555EEE444+++)))***>>>---222555000222222...===222......000+++000000&&&)))111666999777222666222888===555888777AAA999@@@<<<<<<@@@222%%%,,,111$$$555666:::XXXBBB???NNNfffJJJMMM@@@777222666777***111///+++KKK((((((000***)))'''((('''+++)))'''''''''000((('''(((222333---%%%&&&&&&%%%$$$%%%DDD|||+++''',,,&&&### %%% ###000&&&111111???000@@@***000((((((!!!!!!!!!"""'''"""###''''''999FFF:::111333+++(((######(((&&&%%%...(((---,,,...+++%%%******,,,---(((---///000111777888HHHPPPQQQ999BBB<<<888555222444...222222666999;;;III333666BBB:::```ddd???<<>>))),,,'''444'''&&&(((444000111///---222:::333444555666555555<<<***(((===555777555333777>>>333888000AAA<<>>:::::::::999222666)))***"""&&&,,,===@@@RRRSSSRRRTTT===:::000333555111&&&...000---222+++***((((((+++(((///(((***"""''''''###%%%,,,***&&&***NNNhhh)))***)))!!!'''(((,,,@@@)))%%%###### !!! ---...%%%###KKKEEE&&&%%%%%%)))###%%%###"""%%%%%%%%%!!!"""$$$&&&===@@@:::...000LLL&&&!!!%%%$$$%%%"""&&&'''$$$%%%555""""""000###((())),,,...111555111666333===;;;DDD:::999888<<>><<<<<<999;;;CCC>>>AAAEEEBBBEEE@@@>>>HHHGGGNNNKKKPPPIIIMMMAAADDDIII>>>aaaSSS@@@LLLHHHNNNSSSJJJMMMDDDOOOJJJMMMGGGPPPHHHOOOPPP@@@555777;;;>>>===444<<<777999555777888111111111111111222222000))),,,&&&)))222===555555...---333888555888...222111111111BBB\\\888333111...333555///111,,,,,,444,,,///---000111+++///444000555000444===RRRGGG888,,,)))222///666000444777999;;;444222333===>>>>>>888888:::777666111...)))"""''',,,+++999GGGLLLQQQLLLFFF999;;;111222333+++,,,444///...'''+++%%%(((((($$$***+++###&&&%%%###%%%&&&$$$%%%$$$...---///000,,,'''((((((,,,***$$$%%%###!!! 333"""&&&000444888&&&...***...***$$$!!!!!!###&&&###%%%"""'''(((AAAJJJ,,,,,,***)))%%%((((((+++===)))'''((($$$%%%###,,,!!!###(((,,,555888888RRR999```AAANNNAAA555???===777???888888:::<<>>999???CCC:::888CCC===>>>CCCEEEJJJJJJCCCHHHUUUGGG???PPPJJJhhhaaaJJJHHHPPPIIIPPPJJJKKKNNNNNNJJJRRRMMM>>>CCCFFF@@@@@@IIICCC@@@:::<<>>EEE444222555)))222000AAA+++777***:::///000===555CCCJJJ666QQQddd888555<<<666;;;DDDDDD...+++333777...444777///333666333<<<777444:::@@@<<<777999;;;:::///+++222'''""")))...+++WWWIII===KKKTTTDDD;;;333888444111555---111&&&+++444***&&&&&&%%%,,,(((%%%%%%"""###$$$###%%%&&&)))>>>,,,|||>>>###!!!&&&///555&&&%%%%%%### $$$!!! $$$+++===&&&%%%###"""###$$$...)))%%%&&&&&&%%%&&&$$$$$$$$$######'''???LLL+++;;;***///,,,111'''%%%...,,,'''&&&%%%&&&###!!!'''###---+++333:::666777@@@CCCWWWNNNGGG===999@@@BBB<<>>:::>>>ZZZ@@@>>>JJJ777888333??????AAAAAACCCBBBHHHHHHHHHMMMAAANNN -^^^BBB>>>@@@OOOJJJMMMHHHQQQNNNGGGJJJ___@@@@@@GGGBBB999999MMM999333222;;;LLLIIIEEE???>>>;;;;;;:::666777999BBB999444333???@@@:::000333...---777;;;999999888888777555999333///333777:::<<>>999666666000111444:::KKKBBBLLL<<>>======555777000***...///"""***,,,))),,,999<<>>:::333666<<<<<>>FFFBBB>>>@@@===666333<<<<<>>;;;>>>===dddQQQiiiFFFOOO???EEEGGGGGGJJJFFFGGGIIIJJJUUUSSSNNNQQQQQQPPPPPPIIIMMMAAA;;;222777EEE@@@JJJ777???MMMOOORRRUUUDDDYYYFFF===FFF;;;<<<;;;666:::===<<<@@@FFF888666444888666999999999999===<<<===888999;;;:::===???JJJ<<<;;;666777<<<>>>111111---000,,,,,,(((444888///666888111///777BBBAAA===888<<>>777666555888...,,,111///......777&&&%%%(((333'''''''''###### """ %%%$$$%%%111:::RRR,,,'''***!!!$$$######000"""%%% )))(((!!!"""&&&&&&!!!AAA---(((###!!!,,,;;;***)))$$$&&&%%%""" '''???%%%###!!!)))222///***...XXX000+++)))...&&&######'''***&&&!!!222;;;BBBeee333444<<>>;;;>>>SSSJJJEEEJJJWWWCCCHHHEEEKKKKKKIIIDDDNNNRRRQQQRRROOOfffVVVRRRFFFIIIJJJMMMDDD333111???PPPddd>>><<>>KKKJJJQQQEEE===<<<888FFFBBB@@@777===>>>;;;>>>>>>999===<<>>888777222666555888GGGCCC888666>>>???;;;::::::999333444111""")))222777...///222111@@@III666DDD999+++(((...444111,,,;;;""" !!!%%%$$$&&&(((!!!###"""&&&111###%%%###///444000***333&&&***&&&###!!!###'''  %%%###---###&&&$$$$$$777((($$$)))...888$$$%%%$$$$$$%%%######!!!!!! ###!!!$$$***...444,,,...000---...(((***)))(((555(((%%%,,,777999DDD@@@===<<<888EEELLL]]]YYYEEEGGG>>>333888666999777<<<888>>>===???YYYLLLBBBAAACCCNNNnnnyyy???===999???BBBEEEFFFLLLVVVmmmbbbLLLOOOaaaOOOJJJeee______XXXZZZNNNKKKLLLHHHMMMRRRHHHDDDOOOWWWMMMZZZUUUQQQOOONNNZZZ```QQQ[[[VVVJJJZZZSSSKKKIIICCCAAA:::BBBCCC@@@NNN???;;;BBB777;;;GGG???>>>>>>DDD???EEEFFFEEECCCAAA:::DDD333444SSSBBB111555===DDD999///000444333333333333555111222444333000111000444222000888666555222KKK777666666<<<>>>;;;AAA:::JJJMMM>>>444---000888<<<;;;??????777000+++000''' ,,,//////999888<<>>777999666...***++++++777///<<<***'''%%%''''''&&&!!!!!!%%%"""&&&---"""%%%'''...)))000''''''%%%%%%""" ###$$$$$$!!!!!!$$$###### (((------+++'''///&&&%%%&&&&&&(((###%%%%%%(((!!!###$$$666)))######$$$%%%)))&&&333...&&&,,,&&&(((///222666000888<<>>555:::<<<:::;;;>>>:::999NNNMMMggg@@@AAALLLCCCDDDQQQLLLMMMZZZ___dddVVVMMMJJJWWW___ZZZbbbWWW___\\\PPPNNNJJJPPPOOOYYYPPPoooKKKQQQZZZ___\\\{{{}}}RRRfffccc```WWWUUUUUU^^^QQQLLLSSSHHHAAAHHHAAA===@@@EEELLLDDDEEE666333888AAAGGG<<>>999===@@@444777:::888888:::@@@===>>>===;;;444666???***###%%%333...888KKKCCCBBBSSS===999;;;333++++++...+++...)))***---,,,###&&&$$$###(((%%%%%%!!!!!!###&&&'''$$$))))))))))))''''''"""$$$"""""" !!!!!!!!! """'''(((%%%&&&(((CCC...(((!!!***((($$$)))'''''')))***))) ###### ((('''"""$$$$$$ (((222,,,???555,,,+++555222:::AAAEEEAAAGGGFFFEEEGGGKKKaaadddBBB888>>>@@@AAA<<>>888999BBB<<<:::;;;;;;>>>;;;???111///!!!&&&000???666,,,111:::555888;;;333---...111777333444555...555222444000---///***222888PPP???555AAA>>>===---000333666888:::;;;FFF>>>@@@FFFqqq:::555DDD555!!!)))333;;;KKKFFFEEE===;;;444---$$$)))***------///NNN------###%%%%%%&&&$$$%%%###&&&%%%***'''"""&&&AAA&&&,,,---)))---!!!***(((""""""###,,,###%%%!!!"""(((555###&&&///,,,,,,%%%&&&,,,$$$,,,$$$'''000'''%%%%%%###!!!"""$$$!!!$$$%%%'''&&&"""&&&$$$(((---888777...333///222---555999QQQLLL>>>999;;;<<<>>>LLLsssaaa===<<>>999666333000:::999<<<222000222333555333888444:::777>>>222000222---???444FFFCCC444---(((000++++++333444777;;;===;;;<<>>HHHCCCFFFTTTmmmLLLDDD\\\AAACCCFFFMMMZZZHHHIIIJJJQQQJJJaaaD>|||yyywwwttt ZZZTTT^^^dddmmmccc```PPP___gggfff(qqqTTTVVVVVVMMMIIIjjjrrrvvv```JJJaaaiiiyyy{{{___WWWUUUVVV```]]][[[RRRMMMLLLLLLLLLWWWKKKKKKLLLXXXNNNJJJGGGCCCBBBCCCDDD888999EEE444(((###&&&000777888===555777999000???KKKAAA:::666222,,,888888<<<;;;:::666777;;;222333444999777:::444444777999@@@666888<<<:::333---333888%%%///222555888666???<<>>>>>\\\JJJJJJRRRCCCBBBKKKJJJKKKFFFGGGEEEMMMVVVkkk%ooovvvhhhpppIddduuunnnllliiiOOONNNaaaOOOSSSUUUhhh[[[dddrrrddd___UUU@@@DDD\\\dddjjjXXXXXXUUUoookkkeeeuuuhhhggg}}}aaa]]]UUUUUUTTT^^^QQQLLLLLLOOOQQQRRRPPPSSSQQQLLLFFFAAACCC@@@:::BBB<<<)))""" 222<<>>555&&&"""222***888???YYYFFF:::888999666555...888999::::::888***###***222<<>>FFFHHHAAA<<>>IIIVVVOOOjjjhhhqqqtttccccccnnneeebbb -rrr___```YYYUUUQQQZZZYYYTTTTTTHHHRRRZZZWWW]]][[[KKKQQQUUUaaa___ggg|||xxxrrr^^^SSS___ZZZlllpppeeennnddd```___ooocccNNNUUU```ggg___kkkWWWQQQPPPOOOKKKGGGDDDCCCDDDGGGCCCAAA,,,+++///666:::BBBAAAEEE===DDDHHHMMMAAA666777'''999SSS'''444QQQ SSSAAA<<<>>>>>>888555AAA<<<<<<<<<555---)))$$$333GGG@@@DDD999???222,,,666222,,,---333555888======GGG@@@BBB>>>:::))) (((***AAA555;;;???AAAAAA===///666666222333---///111******'''((("""''''''(((&&&"""&&&$$$$$$+++"""(((&&&&&& &&&""""""$$$'''***'''&&&"""$$$$$$***000&&&777&&&888OOO%%%"""###''')))###%%%###''''''%%%...###)))$$$'''...222//////(((###'''444222KKKOOO333+++000000000///222777666777:::777333666666999777???888DDD]]]GGG999@@@777???>>>@@@BBB777FFFFFF>>><<>>GGG===???777:::(((''')))000999AAA>>>999;;;999333555777@@@;;;444///444***)))(((///)))&&&"""&&&$$$###$$$))))))%%%$$$'''$$$---"""!!!######!!!$$$!!! !!!###""" %%%///###'''DDD[[[%%%###'''---666///;;;555;;;))))))///***&&&&&&(((%%%&&&$$$111...+++000...+++'''&&&+++222000,,,+++444)))111222888777>>>:::555GGG666333444<<<;;;AAAMMMCCCBBB???===CCC:::///444888111DDDTTT___===>>>@@@EEELLLFFFDDDFFFFFFDDDIIIaaaYYYYYYXXXYYYYYYbbbeeeaaa\\\PPPHHHTTTLLLQQQMMMLLLSSSQQQSSSGGG[[[]]]ooo\\\^^^llliii[[[WWW___iiicccXXXSSS[[[ccc[[[VVV```fff^^^mmmZZZ]]]pppmmmSSSNNNGGGHHHRRRPPPSSSQQQPPPOOOIIISSSFFFOOOSSSOOOVVVLLL??????999:::===AAALLLMMMLLLKKK[[[FFF:::AAACCCccc999///777CCCEEEBBB???:::333<<>>000111***HHHCCC)))111DDDBBB:::???AAA777111555777444999777BBB>>>===>>>AAAHHHCCC???999fff$$$///---333777EEEBBB999444444666@@@888666666@@@000///000///111'''$$$)))'''"""$$$'''&&&'''((((((''')))---(((###333!!!"""!!!###%%%***)))!!!''',,, $$$****** (((&&&888<<<===DDDxxxrrrUUU000,,,///)))%%%>>>CCCFFF%%%,,,???...+++000%%%+++===&&&---555+++222111111:::999\\\JJJ888444888222<<>>===??????EEEFFFPPPAAA@@@LLLSSSdddWWWSSSWWWUUU^^^aaa\\\WWWKKKOOO]]]WWWTTTSSSPPPMMMOOOTTTDDDVVV\\\VVVRRRWWW___qqq```JJJ[[[\\\bbbkkk^^^]]]bbb___^^^SSS^^^\\\VVVXXXOOO\\\aaa[[[[[[QQQJJJOOONNNTTTPPPNNNTTTNNNQQQNNNTTTTTTTTTXXXKKKMMMFFFBBB???BBBEEEJJJMMM___NNNJJJMMMdddBBB@@@???>>>::::::@@@DDD======555,,,666<<<777EEECCC===(((000KKK((($$$333:::JJJNNN???LLLHHH///...555777666999:::>>>;;;>>>>>>BBB???777999,,, ///777@@@EEE999888555999444:::888;;;999III777,,,000%%%%%%'''%%% """###(((,,,***...&&&(((...)))$$$$$$$$$""" """ """###%%%888***&&&333'''%%%%%%''')))""""""444MMM999///===oooMMM---((($$$ &&&111222ZZZ(((...222---+++555111999'''666///...LLL,,,...111AAA:::KKKQQQMMM888===EEEDDDGGGMMM???LLL666BBB@@@;;;777444222000111111***...&&&"""@@@BBBFFFQQQQQQGGGPPPFFFpppYYYHHHRRRHHHKKKPPPaaaZZZcccbbbfffSSSWWWOOOMMMWWW]]]___]]]UUUJJJMMMVVVLLLLLLLLLUUUXXXPPPPPP```[[[UUUNNN[[[dddfff___aaahhhfff```RRRYYYWWW]]]``````PPPfff]]]YYY[[[WWWPPPSSSPPPNNNFFFMMM[[[HHHLLLOOO[[[OOOWWWUUU___QQQJJJQQQGGGIIIGGGPPPSSS^^^rrrJJJNNNRRRLLLKKK>>>>>>>>>???CCCBBB???AAA<<<666333:::999???LLLBBB???>>>,,,***---000888rrr6===PPPyyy@@@333444///444:::777@@@@@@AAAAAA@@@BBB777444### """###000777<<<;;;333666666333<<<;;;333777999ccc===333(((###$$$###%%%&&&$$$%%%)))&&&$$$***666***+++'''%%%$$$%%%"""$$$$$$ ###&&&###%%%555!!! $$$$$$222''')))%%%###OOO;;;222HHH@@@---'''***+++)))%%%%%%''''''???...111111444888+++222111666333***+++,,,>>>222PPP555111444888JJJQQQ??????>>>???OOOOOOWWWJJJCCC???===888777444555666111AAA:::...666444:::111333FFFYYYLLL```kkkYYYRRROOOQQQRRROOOLLLOOOOOORRRXXXeeeVVVUUUVVVXXXZZZFFFPPP[[[mmm}}}HHHFFFDDDLLLLLLWWWIIILLLTTTRRRVVVVVV[[[ZZZZZZ^^^eeeiii|||mmmeee```___[[[```fffYYY^^^bbb]]]\\\XXX[[[WWWPPPSSSOOOKKKKKKJJJIIIKKKLLLMMMHHHHHHMMM___WWWLLLMMMJJJGGGJJJKKKMMMIIIOOOYYYUUUIIIMMMKKKOOOMMM[[[NNN;;;@@@BBBDDDBBBAAACCC666888666<<<;;;@@@???555BBB444///***///999LLLnnn>>>AAACCC@@@:::444555666999:::;;;999???EEE???DDD;;;666999%%% 000333666333999AAA888999===KKK888888:::;;;666---)))'''(((%%%"""$$$111$$$%%%!!!+++(((111'''&&&'''"""###'''$$$%%%!!!!!!$$$))) !!! !!!&&&$$$&&&JJJ---(((!!!'''GGG:::000)))222---%%%%%%$$$###(((000@@@...000))))))000///111111///000777222---///...999EEECCC555666NNNLLLIIICCC===777888LLLYYYTTTDDD@@@BBB:::999888000555AAAQQQ888CCC666...444888<<>>===444111777111222111:::444BBB<<>>>>>@@@666000;;;<<<888:::<<<===AAA;;;<<<777CCC888--- (((...666:::<<<888888888999AAA???<<<999555999444999111---'''&&&%%%)))$$$...(((...(((;;;'''$$$!!!!!!%%%!!!""" %%%$$$ ###$$$&&&###$$$###""" %%%&&&&&&$$$%%%)))###......111111---***++++++((((((///111444+++111333,,,222...***)))+++)))------888AAAIII>>>:::BBBAAA;;;:::@@@777999888999666333:::<<>>FFFEEEQQQIIIAAADDDGGGHHHAAAFFFTTTXXXPPPfffTTTRRRHHHAAAHHHKKKDDD\\\TTTaaa]]]PPPRRROOOPPPMMMHHHEEEIIIGGGFFFJJJJJJ111BBBEEECCCFFF\\\[[[VVVZZZUUUUUUSSSUUUVVVnnnYYYeeetttuuufff___ZZZ\\\]]]lllZZZ]]]eeeccckkkjjjZZZTTTNNNSSSVVVTTTRRRMMMDDDEEEBBB@@@AAABBBEEEFFFGGGJJJHHHGGGOOOKKKNNNUUUOOOPPPPPPKKKGGGGGGNNNKKKIII@@@HHH===<<>>>>><<>>...+++222333(((,,,---888,,,))))))((()))+++000555777>>>BBB;;;;;;333777;;;===666777777;;;;;;<<<777AAA@@@===777333333000333444888444>>><<>>EEEMMMKKKNNNEEEaaaHHHEEEFFFRRR@@@AAAGGGAAAAAABBB;;;777???RRROOOHHH^^^^^^XXXXXXXXXNNNRRRUUUVVV[[[___\\\```___^^^^^^ZZZYYY]]]XXXaaa```hhhjjjeeexxxuuulll^^^___]]]\\\UUUSSSJJJLLLHHHDDDDDDFFFCCCHHHHHHPPPPPPPPPMMMHHHKKKPPPVVVOOOLLLSSSKKKTTTRRRNNNKKKHHH???LLLCCC??????===<<<>>>555<<<<<<;;;:::>>>DDDDDDAAA<<<:::444777111---222555AAA>>>:::...(((***555===JJJ<<>>555DDD;;;888777555999:::555666333000((($$$$$$%%%)))---(((&&&)))&&&&&&$$$,,,,,,"""!!!"""+++""" !!!%%%CCC%%% """''''''"""$$$'''+++ """((("""###'''$$$222(((------...***)))---***+++$$$HHH...111)))...***+++555444999555777888:::GGG666999EEE999666777<<>>IIIKKKVVVRRRNNNBBB???BBBBBBGGGUUUwww```WWWXXXVVVDDDHHH???NNNRRRNNNYYYLLL<<>>DDD:::333777444<<>>444+++///777999GGG222222333+++...666<<>>???@@@:::>>>666444111---111000666<<<>>>OOO:::;;;888777777222444333333,,,+++)))""")))((($$$###...,,,"""%%%$$$###$$$'''***(((!!!$$$!!!###,,, """!!!%%%'''---&&&$$$$$$ !!!""")))///''';;;"""!!!)))(((OOO'''***+++---***///((()));;;'''***111+++'''+++222555333???888???;;;OOOSSSUUUGGGIII???JJJAAA<<<999@@@>>>@@@===>>>999===888000999555111222>>>EEEBBBXXXTTTAAAPPPLLL\\\JJJ???@@@BBBFFF[[[pppZZZRRRKKKYYY[[[PPPLLLWWWQQQRRR[[[RRRAAAIIIBBB222...000333///777EEE===333444;;;CCCMMM___]]]WWWVVVZZZ```[[[VVV[[[\\\QQQWWWWWW^^^jjjpppmmmgggjjjWWWWWWYYY\\\___dddaaaffflllpppuuuhhhdddfffWWW\\\```[[[XXXQQQNNNFFFHHHJJJHHHIIILLLOOOKKKFFFJJJNNNQQQUUUUUUQQQQQQZZZMMMLLLIIIJJJCCCHHHFFFCCCBBBGGG@@@???555777777222999;;;===:::<<<@@@AAAIIIRRR000+++,,,;;;666333...---***)))111222HHH>>>???@@@??????BBB<<<444777%%%)))!!!,,,666888:::444777888888:::777000,,,444444((($$$&&&,,,%%%)))((()))$$$&&&%%%&&&$$$&&&---+++$$$...333&&&###""" """%%%###"""''',,,&&&$$$######&&&&&&000&&&&&&&&&''')))***)))GGG+++,,,...???---000%%%$$$)))+++((((((///000///888999555BBBMMMTTToooxxxfffGGG:::>>>???BBBKKK>>>@@@CCC;;;===777<<<<<<888///111111666===DDDAAATTTMMMQQQRRRFFFTTTcccQQQJJJGGGJJJJJJKKKYYYQQQKKKAAALLL\\\dddZZZWWWmmm^^^OOOBBBGGGGGG;;;000***,,,+++222777777555999BBBCCCHHHIIISSSTTT[[[VVVZZZ```ccc\\\UUUYYYVVVRRR[[[___bbblllfffeeeaaaccc```VVVSSSRRRUUU\\\ggg```]]]ooogggjjjaaadddiiijjjiiihhhfff^^^SSSSSSOOOTTTQQQLLLJJJNNNRRRJJJKKKNNNNNNOOOTTTVVVRRROOOOOOMMMOOOMMMJJJNNNKKKJJJGGGJJJGGGDDD999999;;;999@@@CCC>>>BBBAAABBBDDD???CCC>>>///***111666000...,,,###!!!111555???CCC@@@@@@CCCCCC???;;;666...&&&!!!###111,,,---:::999666AAAOOO:::;;;333666111000888&&&&&&$$$+++((()))$$$!!!$$$((($$$!!!%%%$$$&&&$$$ $$$&&&###!!!!!!###***...---***///AAA!!!###&&&"""111'''???444###'''***+++---***111+++222+++888...)))"""$$$'''(((******///777HHH888666666;;;;;;kkkoooMMM___GGGAAA<<>>GGGLLLUUUbbbmmmrrr~~~LLLFFFFFFRRRCCC555///,,,444666444999:::CCCNNNJJJMMMKKKYYYPPPPPPTTTeeefffdddooo]]]\\\eeeggg```hhhqqqoooooogggiiicccccc```[[[TTTVVVbbbnnnrrrpppeeejjjlllcccdddjjjlllooowwwwwwkkk```[[[aaaYYYVVVPPPQQQOOORRRQQQLLLMMMOOOMMMUUUXXXRRRQQQRRRQQQKKKKKKMMMLLLOOOKKKJJJRRRQQQGGG888---999IIIIIIGGGGGGCCCGGG???DDDGGG???>>>888---...555555)))''' ((('''555;;;<<<;;;;;;AAAFFFGGG333222000333---111===///+++000777777666EEE===;;;444222...+++)))))))))$$$&&&)))&&&+++""" $$$!!! """### &&&###$$$"""&&&!!!'''%%%%%%&&&,,,))))))%%%"""***###!!!&&&000&&&###***++++++)))$$$+++222GGG'''%%%+++$$$%%%###!!!,,,///+++<<>>HHHFFFAAA===777222???LLL>>>;;;AAABBBGGGTTTWWWLLLSSSVVV[[[[[[QQQTTTdddrrrdddrrrZZZdddwww]]]aaafffooojjjeeeaaaddd______XXXXXXXXXhhh9 qqqkkkccceeeeeeaaaeeelllmmmiiihhhllliiilllqqqaaa[[[NNNUUUQQQWWWQQQNNNQQQRRROOOKKKRRRVVVZZZiiiQQQMMMLLLRRRNNNVVVNNNLLLFFF<<<000///:::JJJDDDHHHFFF???FFFIIIAAA@@@BBB>>>===999222888222((("""'''000888;;;<<<===DDDQQQAAA>>>;;;666>>>EEE222111;;;555$$$FFF555555:::777666555:::111***''')))***(((...(((...&&&$$$!!! &&&"""!!!###'''(((>>>333""""""&&&)))######"""$$$---222---&&&(((&&&III###'''***###...(((((()))888)))+++,,,...***%%%###  ,,,333......///444444999:::???EEEBBBJJJJJJLLLfff]]]KKKQQQ>>><<>>===+++333777ccccccWWWOOOLLLJJJBBB===???BBB@@@999CCCFFFEEENNNSSSPPPNNNVVVPPPQQQSSSTTTRRRPPPXXXXXX{{{~~~uuuhhh^^^bbb]]]]]]aaaggggggeee[[[VVVYYY\\\___nnnqqq}}}Bnnneeefff```^^^___eeejjjpppkkkqqqhhhgggkkkppptttdddXXXRRRQQQWWWTTTMMMNNNYYYTTTQQQUUUZZZ```WWWbbbNNNOOOHHHQQQVVVRRROOOHHHGGG777---666AAADDDDDD>>>???AAAHHHFFFBBB@@@777777999999:::<<<---!!!)))...999>>>>>>>>>===???@@@999999777<<>>???<<>>@@@DDDCCCEEEKKKKKKQQQSSSPPPRRRRRR]]]UUUNNNRRRUUU]]]```cccrrr lllccc___ZZZ^^^___]]]XXXQQQNNNVVVSSSWWWlllrrrmmmhhhxxxtttooo}}}ooonnnddddddgggnnnpppyyyxxxwwwnnngggfffsssoooTTTRRRPPPPPPPPPNNNYYYOOONNNSSSZZZaaabbbZZZfff\\\RRRQQQRRR\\\VVV^^^LLLBBB666999???@@@DDD>>>GGGCCCGGGJJJEEEDDD<<<;;;??????AAAFFF444:::%%%)))---<<>>===MMM===BBBNNN}}}cccNNNHHHMMM===BBBAAAQQQ===<<<444777:::666333>>>888666===III===DDDAAA@@@CCC@@@@@@SSSLLLBBB;;;AAAAAA^^^ZZZCCCKKKEEENNNBBBHHHHHH@@@>>>GGGIIIGGGFFFSSSJJJKKKDDD@@@>>>BBBCCCSSSMMMEEENNNMMM]]]VVVOOOTTTaaaaaaffflll\\\bbbgggbbbtttxxxfffXXXmmm{{{ooocccKKKDDDIIIGGGJJJSSS\\\fffaaahhh\\\UUUVVV\\\ooojjjxxxzzzrrrjjjVVVfffqqq|||xxxsssaaagggtttvvveee___YYYfffQQQKKKMMM^^^MMMQQQMMMTTTYYY___```xxxssshhh]]]___YYYMMMFFF>>>MMM===888???<<>>888&&&+++888GGG===??????;;;>>>@@@555---,,,777>>>;;;777888>>>???JJJ===AAA;;;BBBBBB999:::888---333...666555'''"""%%%'''+++)))+++***$$$)))///,,,,,,'''+++)))%%%&&&+++)))+++%%%,,,)))(((&&&+++((($$$000111***+++---,,,)))---)))000(((...------&&&'''++++++---222)))222AAA999999333KKKFFFNNNlllXXXBBBPPPHHHKKKPPPGGGCCCOOOEEEAAAOOOBBBNNN999666777>>>555444>>>???<<<333666HHHUUUIIIEEEDDD@@@NNNEEEYYY888<<<@@@FFF___\\\UUUGGG\\\aaaWWWQQQEEEJJJ^^^SSSDDDCCCDDDCCCFFF<<<999777FFFJJJSSSJJJEEEDDDLLLPPPVVVWWWPPPWWWccc\\\]]]```fff______jjjhhhmmmuuu||| www]]]@@@;;;CCCVVVdddeeehhhqqqxxxtttaaa[[[```\\\fffkkkssspppoooeeejjjmmmqqqnnnrrrffflll~~~~~~hhhddd___aaaYYYSSSFFFddd```dddPPPRRRPPPYYY^^^uuussszzztttYYY]]]XXXLLLGGGEEEEEE:::>>>LLLBBBJJJIIIMMMJJJFFFFFFGGGBBBCCC777:::BBB000000(((444>>>777222888:::???<<<>>>===555000+++999AAA999CCCKKKNNNIIINNNNNN===;;;IIILLL:::???CCCBBB:::888333///)))&&&((())))))%%%'''%%%$$$'''...---&&&)))(((+++FFF>>>DDD******)))(((,,,'''%%%(((&&&999JJJ(((+++&&&(((''',,,333111&&&,,,'''''''''###'''&&&+++//////666PPP777???===```IIIVVVaaaHHHKKKDDD???BBBHHHCCC;;;888>>>@@@KKKFFFGGG999777KKK@@@444>>>:::888666:::===???CCCCCCAAAFFFIIIHHHTTTAAACCCFFFTTTYYYgggPPPUUULLLIII^^^TTTCCCGGGGGGOOOSSS===888555777:::DDD;;;GGGMMMLLLBBBIIIOOOJJJTTTVVVRRRNNNLLLppptttgggWWWhhhTTTOOOTTTSSSSSSXXXaaajjjbbb^^^ZZZLLLNNNYYYdddeee~~~zzz- ppp```YYY^^^eeejjjuuuxxxqqqwwwuuuzzzyyypppxxx -vvv{{{kkkccc\\\WWWUUUTTTkkkzzz|||TTTLLLQQQVVVQQQaaarrrxxx\\\bbb```VVVLLLGGGAAAEEE@@@999AAAWWWHHHDDDGGGFFFHHHFFFEEEBBB666333777111999;;;sssNNN888666???===BBB===<<<@@@BBB---&&&(((---@@@GGGBBB444RRRMMMJJJAAA===555222666999???BBB===<<<666FFF???444///<<<222)))'''$$$###+++%%%&&&---...111///...///PPP555)))&&&...+++,,,+++***###%%%))),,,***$$$(((''''''333:::222***$$$"""!!!'''$$$'''(((,,,@@@///111999777666CCCFFFTTT pppTTTIIINNN@@@EEEAAA:::666444777888PPPIIIDDD>>>GGGAAAMMMKKKFFF<<<<<<<<>>@@@:::===@@@BBBDDDNNNFFFKKKSSSRRRKKKPPPsssXXX^^^XXXcccTTTVVVGGGNNNVVVaaa\\\cccbbb]]]\\\^^^iiicccpppmmm|||(uuutttcccssspppffflll|||}}}wwwqqqlllppp~~~yyysss{{{wwwqqqgggcccXXXccc___cccZZZeee```WWWUUUWWW[[[______fffaaaiiilllgggXXXPPPLLLGGGAAAHHH111666aaaNNNHHHHHHOOOLLLNNNWWWFFF666///AAA888TTTIII]]]:::>>><<<;;;@@@BBBLLL>>>>>>,,,***'''###CCCRRRRRRNNN777JJJZZZOOOJJJ???999555999<<>>999555:::((()))((($$$,,,---,,,((((((,,,(((***//////555@@@cccAAA///+++&&&###)))MMM666)))(((000%%%555))))))(((''',,,===RRR222)))%%%%%%)))%%%'''%%%'''222,,,444888@@@fff;;;aaafffOcccUUU___GGG@@@AAA???:::888666111555222VVVFFFEEEVVVooolllcccJJJ<<>>DDDEEEPPPEEE;;;BBBBBBAAAGGGBBBXXXGGGBBB777,,,+++000666<<<:::999LLL999<<>>===;;;;;;666222///+++JJJlllTTTCCCHHHGGGQQQSSSEEE>>>>>>555<<<444===IIIQQQ>>>444222//////...---+++222,,,+++,,,---&&&$$$%%%,,,444//////111000;;;333((()))''')))000SSSMMM222&&&000&&&)))(((((('''+++...;;;000,,,&&&&&&''',,,$$$"""$$$+++444555===:::AAAHHH^^^fffppp -#H|||VVVKKK???888???>>>>>>@@@222000===:::eeeYYYnnnvvvwww{{{iiiNNNRRRPPPWWW^^^WWWUUUSSSTTTOOO```^^^IIIDDDPPPZZZYYYKKKOOODDD@@@EEE@@@;;;BBB@@@777***)))---444888===999AAABBBFFFFFFFFFOOO]]]VVVRRRSSSQQQNNNWWWVVVTTT^^^SSSZZZ\\\^^^ZZZ\\\XXXaaa[[[YYY]]]kkkwwwrrrqqqgggrrruuuppprrr  ~~~) eeevvvwwwvvvsssooobbb```lllhhhmmmhhhbbbhhhbbbhhhcccaaafffWWWWWW^^^fffrrrhhhdddnnn}}}pppaaaXXXNNNGGG===,,,666JJJDDDGGGMMMHHHLLLCCCAAA<<<===CCCgggjjj===888@@@AAA???AAA666555444:::888888FFFBBBCCCZZZNNNKKKIIIAAAOOOQQQLLL===>>>===999<<+$eee\\\KKKEEEGGGGGG:::;;;///333888<<>>000&&&333666999222AAAHHHIIILLLPPPJJJEEE999BBB???CCC>>>===BBB@@@???BBBBBBFFF111...333111111>>>>>>444222---))),,,---...000(((,,,222///III:::666---...555333MMM>>>333999BBB///***(((&&&###+++***---------,,,***///,,,)))###(((666(((...,,,444HHHJJJHHHzzzvvvssswww```xxx5? -lllKKKEEECCC>>><<<>>>III999000>>>???EEEvvv $&ooosssssscccrrrgggmmmwwwbbbXXXRRR[[[KKKAAAMMMMMMHHHFFFCCC<<<888666888''')))...<<>>@@@GGGGGGFFFJJJTTTRRR```^^^ZZZRRRYYYfffPPPTTT___}}}eeessskkkfffmmmllllllqqqhhhnnneeecccfffjjjpppqqqiiifffqqq{{{yyy{{{vvvppp}}}/.7   zzz~~~ xxx]]]^^^]]]dddqqqooohhhlllvvv|||hhhmmmoooaaa```eeennnmmmppphhhjjjkkkbbbdddGGG777000:::CCCBBBHHHOOOLLLCCC777+++--->>>EEEaaaCCC222444777...+++222444888===<<<>>>@@@BBBMMMFFFLLLFFF>>>111!!!,,,555888AAAAAAIII>>>CCC???666000...AAAKKK---222///000///---+++,,,...,,,,,,,,,333222111+++000888///333888000FFFPPP000&&&[[[111---+++###+++"""(((555EEE------)))111***+++"""%%%---///***///333FFFDDDHHHdddgggtttuuu SSSRRREEEDDD:::===PPP<<<;;;888AAA<<>>FFFBBBRRRFFFGGGOOOIII@@@???>>>...>>>AAAeeeHHH???888,,,444333:::666888888<<>>DDD>>>===GGGPPPGGGUUU) $&$"'~~~nnn\\\\\\XXXMMMGGGIIIHHHIIIDDDGGGDDDGGGPPPaaa}}}...KKK666>>><<>>EEEBBBFFF???===...555222FFFuuu===777888<<<444///555444<<<@@@FFFWWWLLLLLLHHHFFFQQQ<<<<<>>FFFPPPVVVaaa|||+119FC641qqqfffgggdddYYYQQQIIIDDDHHHGGGEEEAAAHHHDDDBBBjjjXXX---444444999;;;BBB<<<666CCCVVVQQQTTTYYYRRR]]]\\\dddPPPkkk|||sssxxx~~~wwweee<"$!/   -||||||~~~{{{qqqsss nnnoooxxx}}}~~~xxxyyyooovvvkkkccciiikkkuuuuuuxxxyyy -vvvrrrlll llldddkkkeee]]]dddkkk\\\IIIFFF???<<<<<<@@@JJJGGG===<<>>CCC000)))+++)))+++???555...)))333,,,((((((---&&&222GGGCCCDDD666///(((111111555888777+++111TTT333222222---222777222666//////......+++===---333777HHHIII@@@@@@HHHsssZZZOOOJJJFFFOOODDDKKKRRRUUUOOODDDJJJBBB============@@@LLLZZZppp|||FT\dbST(vvvjjjUUUZZZPPPJJJEEEDDDIII<<<;;;CCCIIIDDDuuuNNN;;;@@@BBBDDD<<>>HHHYYYeeePPPLLLJJJJJJVVVYYYGGGMMM===>>>FFFAAA@@@===777444???222444666777777:::,,,***,,,(((FFF999...222******++++++...555CCCCCCAAACCC111$$$!!!...DDD;;;444000,,,---000666333444111...444666666///...///---,,,///111???>>>HHHRRROOOLLL``` -YYYQQQGGGHHHIIIFFFVVVPPP___WWWOOODDD>>>KKK@@@999999===DDDLLLZZZnnn{{{'PklliqU2 -zzzeeeTTTPPPOOOKKKGGGGGG@@@555999;;;GGGIII;;;EEE^^^GGGIIIGGGLLLLLLTTTMMMQQQ```YYYWWWZZZTTTVVV[[[^^^gggeeexxx}}}{{{uuupppxxxrrrqqq}}} mmm#-,#A8!|||uuuxxxeeerrrxxxppphhhiiiqqqzzzxxxnnn tttkkkqqq WWWxxxyyyvvvnnnhhhuuuooovvvxxxyyycccggghhhnnnaaa]]]cccZZZ]]]VVVXXXUUUFFFDDDFFFEEEIIILLLLLLFFF<<<@@@000###///@@@CCC999:::...******%%%+++000666AAAJJJLLLXXXRRRIIIIII]]]hhhbbbZZZ===EEE======EEE@@@666222:::@@@<<<999777555444===---222///000999777333111***+++...---999777QQQNNNUUUwww:::$$$###'''XXX444,,,111111//////222999555...---444666222***,,,---000===...,,,222666GGGKKKIIIKKKGGGHHHGGGTTTJJJAAATTTaaa]]]ZZZ]]]CCC<<<===WWW888555:::<<>>777***------,,,---666<<>>444666222@@@III888;;;111222///555LLL444;;;---999888:::;;;111555***...666<<>>>>>HHHVVV```ttt 7bq~uk]># xxxeeeWWWRRRVVVLLLDDD333444444111+++!!!HHH===JJJNNN[[[UUUWWWhhhkkkmmmgggnnn]]]dddaaa___gggddd]]]YYYbbbtttfffttt|||!~~~  uuunnn}}}mmmoooooohhhfffkkknnn___OOOLLLMMMOOOQQQIIIggggggiii pppiiitttlllWWWjjjeeelllhhhpppzzzsssbbbnnnzzzrrrwwwvvvvvvyyyhhhlllZZZXXXWWW\\\nnnppp```VVVPPPKKKEEEIIIGGGGGGFFFHHH@@@SSSAAALLLPPPQQQSSSKKK>>>???///444222222444;;;666<<>>>>>FFFFFFIIIPPPVVVUUUGGG???AAAZZZ333333000000444888???@@@CCCIIIXXXlll1^s{|seW4 uuu^^^[[[NNNIII===777777777555000===wwwQQQVVVVVVfffmmmvvvkkkrrrsssfffllljjjggg```kkkpppkkknnniiizzzqqqqqqxxx-" - -|||tttsssvvvccc[[[aaarrrlllmmm\\\MMMOOORRRYYY^^^ccc___ZZZ\\\\\\rrrxxx}}}zzzfff___nnn{{{kkkhhhXXXTTTppplllnnn}}}zzzgggfff{{{xxx{{{~~~ tttUUUWWWcccbbbkkkiii[[[WWWRRRNNNQQQLLLCCCJJJLLLOOOIIIPPPKKKHHHFFFFFFHHHCCCAAA======666888111555AAA555>>>lllKKKSSSRRRTTTaaa^^^UUUGGGQQQppp<<>>AAA@@@444000111111AAA)))(((444;;;999SSS;;;999000///222AAA111EEE...CCC)))///---444---???111))))))"""%%%&&&+++...,,,///(((///222+++000000000333;;;===```888EEE>>>EEEAAAFFFLLL>>>CCC>>>===999???888666000///111///444666<<<;;;BBBAAAKKKWWW]]]fffqqq]ilrpaK& jjjdddfffUUUKKK<<<666???@@@>>>666000===DDDHHHRRRWWW[[[eee|||wwwkkkmmmrrrggg___mmmpppcccwww~~~{{{tttttt 0,. -~~~jjjooonnn]]]QQQIIIMMM___ggggggaaa]]]TTTSSSaaaeeefffeeegggccc^^^^^^qqqtttwwwyyy\\\aaacccoootttcccaaadddVVVsssqqqqqq qqqKKK}}}~~~||| {{{ttt}}}xxxtttlllZZZaaahhhjjjbbbWWWLLLLLLQQQTTTCCCHHHLLLOOOFFFXXXSSSFFFEEECCCSSSOOOIIILLL@@@000555666888444<<>>333EEE111555666JJJ999:::+++)))---;;;777;;;CCC:::111@@@&&&%%%(((''',,,...***,,,)))111777///+++...+++333555;;;AAA444<<>>888>>>@@@111...111EEE777666888999===FFFQQQOOOOOOYYYiii1@R_txaE) zzz^^^[[[ZZZLLLCCC>>>>>>PPPSSSBBB???EEEJJJBBBHHHQQQ\\\```gggtttwwwjjjccc``` vvvvvvpppwwwwwwqqqzzz$  52$~~~nnnuuu}}} yyy]]]XXXSSSMMMZZZdddeeejjjeeedddccc[[[WWW]]]iiiiiijjjuuuooonnnjjjnnnlllnnnbbbiiilllbbbfff___aaavvvjjjeeettt~~~|||~~~qqqWWWlll}}}{{{ wwwtttfffbbbggg5,nnnfffnnnYYYJJJRRRbbbQQQ:::OOOKKKAAAGGGJJJLLLHHHJJJHHHSSShhhGGGHHHAAA,,,999<<<666<<>>AAACCC]]]===444000---666...+++555222///444PPP555222111333***'''111>>>999@@@BBB555999???==='''+++)))(((+++,,,)))(((999.........000...;;;:::@@@AAA555999666FFFHHHEEEAAACCCMMMEEE999<<<>>>NNN,,,******555<<<333333111666777DDDBBBHHHMMMOOOyyy|||6NjlFBfff]]]^^^KKKFFF???@@@IIIKKKFFFOOOIIIMMMMMMRRRUUUUUUVVVeeessskkkooolll^^^\\\uuu ~~~}}}ooolllqqqnnndddvvv  ~~~kkkRRRPPPYYYaaafffZZZgggcccccckkklllooorrruuuhhhjjjdddkkklllxxx{{{oooqqqqqqyyytttlllllluuukkkttttttvvvnnnfffjjjssssssfffTTTjjjpppwww|||kkkkkk^^^QQQXXXkkkwwwvvv#;7$xxx^^^cccgggiii>dddnnnhhhYYYLLLRRRNNNBBB>>>FFFNNNNNN^^^OOOJJJNNNQQQWWWNNNKKKMMMJJJLLL777<<<>>>444666>>>EEEFFFKKKRRR______pppnnngggdddGGG(((###(((///555------777AAAEEEPPP@@@AAACCC@@@<<>>CCC&&&'''###(((...&&&(((,,,***///111111777,,,444<<<@@@===EEE<<>>999666111111444111444GGG***)))***)))777666333,,,333:::HHHDDDFFFPPPhhhZZZccc{{{#EHL>&^^^^^^YYYTTTYYYLLLHHH@@@AAAKKKEEEIIIEEELLLPPPKKKWWWooo}}}vvvnnntttuuu{{{{{{{{{ pppnnniiixxxzzztttlllbbbiii```YYYfffbbbgggiiigggkkklllooommmnnnqqqqqqwwwwwwoooqqq}}}zzzssssssmmmjjjdddwww|||sssssskkkoooUUUqqqyyyqqqfffqqqSSSLLLYYYSSSnnn|||:\qqqccciiinnn|||zzzllleeejjjjjjaaaTTTGGGSSS^^^sssDDDIIITTTYYY\\\LLLKKKTTTVVVRRRTTT___JJJ```777555555555888>>>DDDAAAVVVSSShhhpppiiimmmooojjjOOOKKK333'''(((555999666---,,,;;;KKK@@@:::888555666999---...$$$000+++******...///+++...***111999000)))///UUU===@@@:::888444222111KKK((()))(((!!!###&&&(((''')))...111555444000222<<<>>>888666555AAA>>>>>>666444333666,,,++++++000444000+++,,,+++:::CCC222222000777FFFDDDOOO -PPP???NNNppp!#%jjjmmmYYYEEEFFFEEEAAABBBIIIJJJNNNKKK[[[VVV```aaa___nnn 2yyyyyyqqq~~~}}} -zzztttxxx}}} }}}rrrlllgggiiimmmjjjyyy{{{rrrppprrrwww{{{ ssseeefffiiiqqqxxxtttrrrrrruuuvvvwww{{{zzz|||qqqnnneeerrruuuzzzyyyvvvwww```|||ooowwwxxxjjjSSSKKKRRR,4pppcccnnnccceeedddeeedddwwwcccgggjjjRRR===OOO===PPPOOORRRSSSJJJKKKPPPMMMIIIIIIIIIFFFHHH===//////HHHKKK>>>???GGGOOONNNiiimmm]]]WWWrrrnnn444...///333111---...777:::999:::<<<...111222222,,,(((,,,+++***000222'''''')))111HHHfff555444111NNNFFFVVV999===000---@@@ccc***$$$%%%$$$'''---((()))---222444222...000666BBB;;;999777666444DDDFFF555000444777///,,,444000///000---//////000,,,333+++...<<<>>>XXXOOOLLL888NNNkkkjjj}}}{{{hhh\\\jjjlll hhhVVVMMMCCC<<<>>>MMMKKKRRRiiijjjkkkmmmnnnZZZmmmpppuuuttt{{{ uuu |||nnnfffbbbaaabbb~~~ -vvv gggbbb|||iiilll~~~zzzwww~~~|||qqqkkkjjjeeelllqqqqqqlllppppppoooccclllvvvtttxxxxxx{{{zzzzzzyyyzzzwww{{{uuuvvvZZZiiiyyy}}}tttGGGAAAcccjjj|||vvvkkkhhhppphhhaaaUUU[[[ffflllhhh^^^RRRHHH111DDDOOOZZZaaaEEEAAAMMMMMMRRRXXXSSSMMMDDD999222222...>>>OOOAAA@@@<<>>ooojjj777>>>}}}WWWAAA333,,,,,,222>>>)))&&&(((***000******------666222000,,,+++---000555;;;666:::333===666888444333<<<222333@@@\\\///+++,,,111///\\\222......///888OOOlllBBB???>>>888GGGHHHRRR^^^YYYPPPKKKDDDYYYTTTzzzdddMMMHHH???999<<>>GGG:::222...///222444///333,,,...,,,)))...,,,444/////////EEEYYY;;;999666@@@;;;AAACCCEEEMMMLLLHHHIIIJJJCCCPPPLLLkkkSSS:::;;;999YYYRRRMMMQQQjjjkkk\\\YYYWWWccc```qqqtttvvvxxx|||xxxiiijjjppphhhiiijjjccclll{{{ zzzzzzkkkaaaiiivvvmmmbbbfffqqqxxx|||}}}{{{{{{qqqmmmnnnlllnnnllljjjfffaaa]]]^^^bbbfffpppsssooooooooowwwxxx|||wwwxxxzzz|||wwwlllhhhnnn[[[PPPWWWhhhmmmnnn}}}~~~mmmYYYDDDggg}}}wwwmmmNNNYYYkkk```UUU```aaahhhxxxhhhOOOQQQ888666ZZZiiidddiiibbbOOOOOOHHHggglllUUUQQQAAA>>>>>>///;;;AAA@@@EEEEEE;;;OOOUUUOOOSSSccc___]]]PPPWWWaaa777;;;>>>---...555***---)))222AAAHHH;;;===444777444///+++---+++(((''',,,---...;;;OOO```MMMnnn>>>CCCwww&^^^999)))++++++000777$$$%%%'''222111,,,+++,,,+++...555...///666111...222444888===555999666>>>333555333222,,,******+++///333///111,,,)))000+++@@@NNN111666444@@@BBB;;;;;;BBBAAAHHHIIIFFFSSS\\\VVVaaaSSSOOOmmmJJJHHHMMMdddWWW\\\gggqqqpppdddlll\\\gggiiivvv|||zzzzzzuuurrrnnnhhhhhhbbbkkkooooooooo{{{ -}}}zzzyyyzzzbbbrrrhhhkkkssskkkcccssstttrrrvvv{{{sssoooqqqpppmmmiiiiiifffjjjfff```\\\gggggglllkkkfffmmmxxx{{{tttooosssuuuxxxyyyzzz{{{|||}}}vvvfffYYYWWW\\\```nnn|||yyypppqqq___???\\\zzzsssRRRFFFXXXaaaeeegggcccwwwdddTTTVVVPPPCCCCCCPPP^^^iiinnniiiTTTKKKRRRIIITTTOOOMMMFFF;;;888999BBB]]]444AAAooo<<>>:::999AAABBBDDDDDDMMMJJJKKKOOOZZZaaaggg[[[^^^ZZZkkkmmmeeeYYYUUUdddnnnxxx|||ttthhhlllwwwyyyuuuqqqyyyeeeZZZMMMKKKOOO^^^bbbeeeuuu{{{ssswwwzzzyyyrrrpppuuuvvvuuu -pppXXX~~~sssoooyyywww{{{qqqiiiooommmeeeWWW]]]wwwdddjjjiiiiii___jjjtttrrrvvvvvvttt{{{~~~zzzyyyyyy|||wwwwww|||{{{xxxeee^^^YYYYYYaaa^^^vvvyyytttmmm```[[[eeeyyy4~~~{{{ \\\rrrhhhccceeehhheeebbbddd]]]QQQRRRJJJMMM^^^bbbdddbbbWWW\\\RRRUUUUUULLLKKKJJJ444999AAAIIIbbb\\\222>>>>>>IIIIII```zzznnn\\\dddppp\\\SSS;;;777666222111:::555555888///444@@@666444333222///***...$$$$$$""",,,DDD///+++333???^^^ooo HHH222:::EEEOOO:::999;;;777666222$$$$$$******,,,)))---///...000@@@NNNBBB@@@???666777777666111???<<<888444666222+++))),,,+++&&&***,,,***,,,---(((***@@@:::111000+++:::666///666222;;;NNNTTTSSSQQQSSSbbbzzzuuu___TTTXXX^^^___www^^^dddcccrrrlllooottt}}}pppmmmsss{{{qqq|||ZZZUUUHHHOOOQQQddd^^^ooo~~~}}}qqqyyyxxxlllgggcccfffpppwwwoooTTTfffqqqwwweeexxxiiiqqqiiibbbfffaaa___ZZZYYYZZZYYY\\\fffrrrvvvpppuuuyyy}}}}}}}}}|||}}}xxxzzz~~~{{{wwwoookkkcccVVVccckkkhhhttttttqqqgggdddqqqxxx iiiaaajjjuuuvvveee```aaaoooZZZQQQ[[[PPPPPPZZZ^^^gggUUU\\\```aaaUUURRRBBBLLLGGGAAABBB>>>TTTyyyeeeBBBTTT888@@@JJJXXXiiiggg^^^XXXWWW<<<===(((>>>FFF<<<111000......111***...000444111333???)))+++'''&&&%%%&&&;;;:::111<<<:::III[[[iiiKKK999+++///UUU???<<<...666888---+++***))),,,***---)))...,,,$$$444111666999III???ZZZ<<<777777666888111FFF333000555666---...,,,)))))),,,&&&)))///)))EEE<<<...***,,,222---------)))222@@@RRRYYYRRRQQQMMMEEE```fffYYYhhhfff^^^aaadddaaaddd~~~(' qqqssstttjjjnnnkkkzzzyyysss___XXXccctttvvvyyyzzzzzzvvvvvvpppgggaaalll%lllcccnnnzzz{{{aaahhhwwwLLLLLLPPP]]]]]]qqqmmmfffqqqjjjkkkllljjjpppnnnlll||| - }}}{{{{{{xxxttt~~~|||{{{rrrrrrwwwrrrmmmcccYYYkkkeeeeeennnkkkpppoootttuuu fffUUUPPPaaarrrsssaaaRRR```bbbQQQVVVPPPZZZUUU^^^\\\___LLLVVVTTT```^^^AAA777XXXWWWGGGHHHooo~~~___444>>>444???RRRCCCKKKNNNnnn\\\[[[PPP000,,,NNNJJJIIICCC888444000,,,+++333***,,,444,,,000,,,***(((***111+++222...))),,,>>>@@@IIIZZZ>>>)))$$$...222111888???)))------)))+++222***)))(((((())),,,+++)))777111777NNN^^^KKKDDD???<<>>GGGGGGGGGVVVyyynnnLLLOOO444999666:::444444RRR```hhhLLL&&&888ddd```FFF@@@777666...///(((//////000:::666---...)))+++))),,,000000000***555===GGG]]]EEE333%%%&&&'''---+++///777((('''222)))******'''&&&***'''%%%)))DDDKKK>>>OOO^^^~~~HHH???777EEEFFF444000111111666000,,,------((((((&&&'''(((+++***888...+++---)))333&&&&&&)))---...333FFFIIIFFFUUUUUU^^^\\\}}}ccc___ZZZWWWYYYgggmmmnnn -,uuujjjggg[[[eeetttssshhh^^^ddd. {{{sss qqqYYYhhhxxxvvvvvvvvvyyy}}}zzzqqq}}}gggmmmYYY]]]rrr{{{nnnwwwiiieeehhhooommmqqqgggdddeeeZZZRRR\\\```iiinnnpppmmmmmmlll{{{|||   -~~~}}}zzzmmmnnngggmmmuuunnneeehhhcccTTT]]]lllpppwwwtttwww}}}iiikkkRRROOOPPPYYY___fffLLLMMMOOOSSS___aaaYYYUUUXXXkkktttssssssvvvHHHNNNNNNHHHOOO===777QQQWWWRRRaaa000))) ***777===JJJeee]]]///--->>>HHHAAAOOO===888777+++)))+++111444222...222---...&&&%%%,,,111===,,,000...FFFJJJOOOHHH;;;LLLKKK888...///+++(((+++&&&&&&'''%%%***+++---333&&&333***,,,]]]\\\BBB___kkkMMMBBBCCCEEEDDD???AAA888//////333777///111---111++++++(((&&&(((000000)))&&&###...,,,(((000---///111+++000777@@@EEEQQQQQQRRR```P2aaa]]]hhhSSSPPP[[[iiirrryyyiii^^^cccccciiinnniiioooxxxjjjjjj %N%tttuuu{{{QQQSSSQQQsssvvvzzz~~~'}}}kkkoooqqqvvvjjjxxx{{{jjjbbbhhhjjjlllkkkoooooogggppplll[[[ZZZffflllnnntttyyywwwyyy}}}  }}}}}}}}}ssskkkaaaeeemmmiiiooohhh]]]WWWUUUdddkkk|||eeewwwyyyyyytttxxxvvvuuuZZZUUURRRhhhXXXTTTUUUXXX[[[dddhhhvvvccc]]]QQQeeegggssssssyyyTTTaaaPPPRRR???DDD@@@:::<<>>NNNCCCKKKSSSBBB888AAA111000---(((''''''%%%&&&###)))000))),,,&&&&&&222+++---000555KKKOOOGGGNNN___JJJGGG\\\DDDGGG111000444444///111+++...***...,,,+++(((+++111---+++---***888---+++(((,,,111,,,''';;;333???IIIRRRPPPZZZpppNNNKKKQQQMMMTTTVVVgggooo}}}dddiiiuuuzzzxxxtttlll___```zzz~~~6zzzxxxpppuuu|||mmmjjjUUUOOOnnn gggvvvUUUjjjiiimmmyyyzzz|||yyysssfffhhhlllfffhhhjjjooossspppcccbbbgggdddgggnnnqqqvvv{{{  -}}}yyyuuulllhhhhhhjjjvvvlll___```WWWQQQfffuuufffwww|||zzz|||~~~www```UUUNNNNNNaaaTTTdddqqqgggaaaeeehhhjjjUUUgggiiizzzrrrooofffeeePPPRRRAAA===<<>>\\\::::::;;;333333+++---000,,,...+++---$$$###!!!&&&((()))'''(((===???555111000000---+++...555@@@III???===JJJFFFCCCZZZAAA111SSS///>>>333......)))&&&000***,,,+++(((,,,***###''''''!!!%%%$$$///DDD:::???MMMCCC555BBBOOOSSSUUU^^^LLLdddcccsssyyynnniii]]]ZZZ^^^hhhdddfff^^^QQQgggjjjdddRRRXXXvvvxxxuuu{{{oootttuuu|||ooohhh___ZZZjjjeeeWWW\\\hhhjjjxxxeeeZZZNNNRRRaaajjjaaaYYY```dddiiihhhllltttyyyxxxvvvzzz||||||~~~ - {{{wwwooo}}}{{{qqqttt~~~```XXXUUULLL```mmmmmmooossssssoooccc]]]YYYMMMDDD___```nnngggzzzgggggg___\\\UUUUUU``````aaabbb\\\aaaooo```UUUKKKMMMQQQOOOFFF333111///222,,,,,,...333BBB:::@@@HHHCCCDDDGGG@@@444""""""444111333111999///,,,111555222///222888@@@===444---)))111CCCJJJFFFBBB666;;;MMM444,,,,,,,,,"""(((%%%)))"""%%%&&&&&&)))(((===333///555---333111:::222222///<<<666<<<===@@@YYYPPPFFFLLL<<>>===SSSEEECCC:::>>>MMM:::UUU@@@BBB999<<<888<<<(((111///%%%$$$%%%***$$$GGG***''''''"""(((AAA666///---...777666666000333555AAAKKK===???PPPkkkLLL===CCC@@@NNN>>>FFF999------""""""&&&%%%&&&:::,,,###!!!)))$$$&&&666---///888???AAAAAABBBAAAAAAbbb___cccnnn```LLLooogggtttppp~~~nnn``````___[[[WWWTTTVVVXXXTTTcccdddooommmrrryyyvvvqqqooooooddd```aaaddd\\\TTTIIISSSLLLhhhSSS```qqqddddddcccaaaXXXZZZSSSPPPbbbkkkbbbhhhhhhcccRRROOOgggiiipppsssrrr{{{   }}}wwwtttppprrrnnnnnnxxxeee```fffkkkuuuppplll```hhhvvvjjj```[[[JJJZZZKKKKKK]]]TTTqqqjjjwww|||UUUWWW\\\[[[```cccrrr~~~nnnRRRSSSLLLBBBEEEJJJKKKCCC222111000666777BBBBBB===FFFLLLQQQPPPLLL555&&&222;;;888:::>>>:::@@@444000333AAA444999@@@CCCKKK===bbb>>>QQQEEEUUU???iiiTTT555888111999***///777))))))&&&%%%)))%%%,,,'''&&&999&&&222JJJ111---+++555777444666666EEE:::LLLKKKFFFUUUjjjMMMAAAKKKGGG___BBB111***---///"""###***(((%%%+++'''%%%'''"""''''''888666;;;666LLLGGGDDDDDDDDDPPP\\\bbbhhhfff\\\BBBWWWHHHTTTooollljjjbbbbbbaaacccVVVSSSYYYUUUOOOaaaiiiccclll4#kkkjjjhhhooolllllliii```jjj^^^UUUQQQPPPEEE\\\bbbgggsssfffjjjggg\\\NNNNNNCCC]]]eeemmmhhhgggdddTTT\\\eeeooosssooo|||  - #"""!"" -}}}zzzwwwwwwuuuoooqqqmmmddd___\\\aaaYYYaaagggaaaXXXfffgggeeedddLLL\\\IIIEEETTTRRRmmmnnnhhhnnn\\\[[[bbbTTT]]]pppttt{{{gggQQQNNNRRRCCCDDDFFF>>>666111+++///:::CCCJJJQQQ>>><<>>111((((((###&&&+++%%%))),,,'''(((...555EEE...222;;;111111;;;888BBB:::DDDFFF___FFFEEEFFF???FFFFFFBBB333555+++,,,&&&"""%%%'''''')))(((&&&((()))(((&&&111000:::???CCC>>>GGGAAADDDIIILLLOOOhhh^^^XXX>>>:::DDD^^^___jjjvvvggg___XXXQQQYYYJJJNNNYYYMMMUUUXXXbbbiiiYYYtttdddcccgggfffjjjhhhgggfff^^^]]]VVVCCCOOOTTTaaajjjhhhoooyyy|||pppiii```sssaaa___WWWgggjjjsssqqqkkkTTTXXXZZZ___eeeqqquuu~~~ !$'(('%%&$%$"  -}}}yyyxxxwwwuuuqqqnnnnnnfff```ZZZ```hhhqqqiii```HHH^^^bbbddd]]]dddbbbgggiiieeebbbzzzuuuvvv{{{kkk\\\RRRVVV[[[jjjzzzppp```UUUHHH@@@CCC===@@@000888---///***EEE<<<>>>EEEDDDFFF???LLLXXXGGGIII777...<<<<<<111>>><<<@@@---***)))666888NNNqqqSSSoooLLLIIIIIICCC===999XXXDDDXXX>>>666...---111......222,,,'''&&&&&&,,,000777&&&---###---<<<+++===;;;666,,,000@@@>>>444555===GGGDDDSSSNNNEEE@@@WWWYYYAAA444555...+++,,,///+++***$$$(((+++)))>>>222///...,,,???>>>AAADDDEEEEEEFFFKKKJJJHHHJJJJJJNNNDDD???DDD999???iiiuuuoookkkkkk___kkkSSSHHHSSSaaaVVVVVV^^^fffRRRXXX\\\iiiiiieeefffooonnneeezzzddd```WWWIIIFFFPPPVVVgggkkkdddlllqqqvvv uuufff```kkklllcccnnnssslllgggXXXJJJNNN\\\bbbdddnnnuuu~~~ - %),,-,+***)('$$! wwwwwwvvvqqqnnnnnnooommmggg\\\YYYmmmqqqgggWWWTTThhhSSS```bbbiiijjjppptttrrrvvvsssllllll~~~uuuZZZkkkaaagggqqqjjjpppmmm]]]nnnOOO:::===222,,,###%%%222,,,***333222888>>>===@@@EEEHHH???EEELLL666(((555666===SSSCCC<<<444)))222>>>@@@zzzQQQDDDBBBGGGDDDHHH777@@@===EEEEEE===444222---)))???******)))&&&((()))***''')))((($$$)))---******(((:::333444222000666???888888AAABBBLLLDDDNNNKKK]]]QQQAAA333BBB...111+++***+++///444555+++---999777222777:::RRRKKKJJJIIIMMMNNNPPPOOOKKKXXXRRRFFF;;;>>>@@@999FFFFFFpppqqqwwwyyy^^^^^^YYYLLLRRRbbbZZZYYY\\\]]]YYYXXXdddcccddduuukkkaaafff^^^rrrrrrfffIIIFFFIIIOOOQQQWWW]]]tttiiiyyyxxxssswwwlllggg___```lllooolll]]]hhhZZZNNNOOO[[[kkkpppuuuyyy !%(...00021/,*)''$! wwwuuuppppppqqqlllooottteee\\\[[[aaaaaaWWWeee```___gggcccssshhh}}}|||sssnnnbbboooggghhhfffcccdddnnnpppeeeiiiWWWFFF]]]000)))"""""",,,///...444FFF777888>>>AAA;;;:::999===CCC666(((999IIIHHHCCC===666///;;;>>>WWWVVVFFFRRRRRRJJJFFFHHHHHH>>><<>>CCCVVVAAAGGGEEEJJJNNNPPPVVVLLLKKKeeeSSSXXXKKKGGG888ggg~~~WWWfffxxxqqqkkkjjjbbbfffttt```___```nnnjjjaaabbb___ffflllccc```^^^XXXaaa[[[pppiii```TTTMMMPPPGGG___\\\ZZZaaaooohhhmmmwwwhhhZZZfff[[[\\\___aaakkklll\\\___KKKIIINNNddduuuuuu}}}~~~ - &+,0245545530-+)(%# ~~~wwwrrrnnnooouuuqqq|||eee``````]]]oookkkfffoooiiiiiicccfffzzz ooojjj```lllssslllfffiiinnnxxxgggdddRRRGGG<<<333:::)))"""###***,,,999>>>AAA:::444:::;;;::::::666888///&&&<<>>;;;...((((((***&&&%%%$$$%%%&&&$$$###&&&+++***%%%%%%)))111888AAA111222CCCPPPXXX===DDD<<>>:::DDDHHHPPPFFFDDDAAAPPPDDDGGGEEEKKKIIILLLPPPTTTTTTVVVRRRBBBEEEgggnnnnnnzzz|||kkkuuuccc\\\^^^]]]______```nnn\\\ iiipppjjjlll]]][[[\\\___cccddd]]]^^^TTTOOOLLL___ZZZ[[[XXX```ZZZcccqqqrrrsssrrreee\\\TTTYYY___```aaa]]]cccaaaTTTIIILLLRRRjjjuuuvvv %).0156888::730,*)%#}}}{{{xxxqqqooovvvooo eeeYYYeeepppjjj___fffnnnmmmdddbbbeeevvv{{{ nnnnnnjjj^^^hhhuuubbbgggppplll{{{jjjoooKKKCCC<<<>>>===444***+++111...;;;:::;;;444555:::<<<888:::<<<000 )))+++666@@@???CCC999666>>><<>>QQQNNN555;;;GGG444...)))))),,,,,,000###%%%'''+++%%%$$$ ------)))&&&"""$$$444---777LLL;;;???BBBKKK\\\QQQGGGOOOBBBSSSJJJMMM???FFF666>>>888---///******111222555[[[aaaIII???HHHDDDEEEFFFLLLlllPPPAAAJJJEEEEEERRRVVVMMMTTT[[[eeefffjjj{{{}}}^^^eeesssYYY[[[hhhiiiiii\\\ooommmeeefffhhhjjjooobbbgggtttbbbhhh___^^^OOOFFFYYY]]]]]]XXXPPPdddoootttoootttyyysssddd```VVV\\\^^^hhhhhheeekkkaaaVVVSSSfffkkkssswww~~~ !),12479==>?=:74/,+'$ {{{{{{ssspppqqqoooqqqpppeeeZZZsssppplllbbbkkkhhhbbbXXXbbbjjj~~~sss3 zzz[[[[[[aaa___lll|||tttsss___TTTFFFEEE:::===555000***)))///333555444444999888999???;;;CCCAAA777'''999888GGGHHHEEE:::222444@@@;;;GGGDDD:::333888BBB;;;;;;888777:::cccNNN@@@999;;;///111'''%%%+++,,,+++,,,***((('''""" )))PPP444***'''$$$+++(((---:::444KKKQQQHHH>>>YYYjjjhhhjjjEEE???EEE:::@@@888333444===LLL222...))))))000///FFFbbbNNN??????AAABBBGGGLLLMMMRRRMMMBBB@@@IIITTT___^^^YYYSSS[[[iiiiiiqqq oookkkbbb```qqqrrrWWWXXX\\\PPP^^^UUUpppsss|||gggfffaaafffllleeecccgggsssffffffbbbaaaRRR^^^VVV]]]RRR```wwwyyysssuuuiiidddYYYXXXUUUcccgggmmmllllllwwwiiiuuutttwww||| -"(+0357:>@BCDA<9850+(%!~~~}}}uuuwwwooonnnmmmnnnpppccc[[[{{{rrrmmmjjjfff___ZZZ\\\______mmmzzz {{{___\\\\\\bbbiiimmmvvvqqqhhh^^^TTTGGG>>>777999<<<444444(((000555111666DDD<<<>>>===>>>BBBBBBSSSAAA444;;;@@@PPPbbbIII@@@...111444222///...+++///222777888===BBB888999MMMCCC>>>???<<<***,,,(((&&&$$$((()))+++(((///&&&&&&'''$$$$$$'''###111###%%%---333888000777SSSvvvNNNUUUjjjPPPPPP]]]PPPHHH;;;???444999555777111:::---(((&&&---999YYYAAA>>>@@@DDDHHHEEE???QQQRRRQQQOOONNNXXXSSS^^^bbblllYYY???aaavvvkkkqqqnnnrrr]]]hhhdddfff^^^cccXXXMMMWWWbbbUUUbbbuuudddcccuuubbbjjjkkkeeeqqqnnnfffaaa\\\iii___YYYYYY]]]UUUMMM[[[ppp{{{www7ppp```eeebbbfffooogggiiiooouuuooowww{{{vvv|||yyywww|||~~~#*.167;?ADIHGEA>;81.*("~~~yyyvvvuuu{{{uuuooojjjhhhdddfffkkkjjjjjj|||ggghhh___NNNTTTYYYlll}}} - rrrYYYZZZ\\\]]]pppiii|||~~~lllaaaZZZPPP:::666444GGG777333((()))///666444111<<<999OOO@@@AAADDDEEE;;;777999AAABBBXXX\\\PPP@@@///666999888666&&&!!!)))111<<>>===HHH888<<>>555222555222///(((...---((($$$###"""&&&'''!!!!!! """---///000555222888BBBIIIGGGCCCOOOeeemmmKKKIIIPPPeee@@@666000888...,,,&&&"""***&&&+++///+++***'''888OOO;;;LLL???EEEIIIMMMPPPMMM_________iiinnn{{{}}}uuupppSSSXXXKKKMMMHHHPPPRRRRRRVVVTTTTTTWWW]]]uuugggddd```fffcccbbb^^^fff qqq ssseeePPPTTT]]]YYY```\\\ppprrrssseeeRRRWWWCCCMMM```eeeoootttrrrzzzpppeeejjjwww~~~{{{|||~~~ "(-26>>CCCKKKGGGHHHJJJWWWbbbrrrcccgggI  wwwtttyyyqqqlllRRR]]]KKKIIIHHHUUURRRWWWeee]]]aaaYYY```ZZZaaaooo^^^ggg```XXXccc -}}}pppfff]]]SSSUUUUUU\\\ggg{{{pppgggfffZZZJJJPPPXXXdddkkkmmmmmmqqqssslllkkkZZZbbbyyyzzz{{{}}}|||").4;?FNSTWWWUSOID@;51.*# }}}yyywwwuuurrrlllxxxkkkccccccaaa^^^bbbfff[[[```ZZZrrrgggPPP___oooqqq}}}jjjZZZYYY```YYY^^^sssiiidddaaa]]]XXXGGGGGGIIIAAA>>>===???555000,,,***999888444999666666AAAHHHEEE555"""AAAHHHPPPgggGGGAAA888;;;;;;333......444000===@@@@@@EEETTTIIIQQQQQQddd~~~QQQ;;;222BBB222%%%$$$------***(((%%%000)))***%%%&&&$$$)))444222222000>>>DDDYYY\\\yyybbb^^^RRRRRRGGGJJJDDD@@@222333...---+++&&&###$$$)))***333222---333888555WWWHHHFFFHHHYYYNNNNNN___ooo\\\hhh___uuuhhh/iiixxx{{{tttgggZZZ\\\XXXJJJEEETTTQQQXXXVVVuuubbbccc\\\\\\dddcccfffcccVVVaaakkk~~~nnniiimmmfffbbbRRR[[[```nnnrrrhhhooogggwwwfffUUU\\\___kkkllliiiiiimmmllljjjggggggdddsssvvvzzz "(/5;AIQV\___[VQKF@:510)" -|||yyyqqqmmmooossseeebbbeeeggglllnnncccWWW]]]UUUkkkdddNNN\\\zzz```aaadddssspppZZZ[[[___hhhuuuaaa___WWWSSSJJJJJJVVVZZZDDDCCCAAA777<<<333888AAA000...888(((444999===???@@@---'''AAAFFFRRRKKKFFF;;;;;;<<<;;;222666555555999>>>;;;BBBCCCLLL888OOOIIIMMMIvvv@@@000444---'''%%%&&&---@@@...%%%%%%&&&'''666)))---111,,,666@@@QQQfffqqqPPPSSSQQQ@@@>>>CCCRRRIII444---...555+++%%%!!!+++***555///---,,,,,,BBBHHHzzzKKKFFFLLLSSSSSSOOOWWW___RRR]]]XXXkkktttyyyqqqiiiMMM^^^ppp|||{{{iii]]]XXX[[[YYYQQQQQQTTT]]]iiiggghhhgggyyyVVVqqqeeeyyyhhh\\\aaaeee tttcccfffdddSSS```gggbbbddduuummmaaaVVVnnnXXXbbbuuuiiiZZZffflllpppmmmkkknnniiimmmoootttyyy -!%)049AKT\elkibZRMH@9630)# {{{xxxuuuooopppqqqeeedddbbbiiipppjjjeeeVVVVVVZZZrrr]]]ZZZcccuuuwwwuuuiiigggfffwwwXXXZZZbbbrrr{{{ccc___SSSVVVIIISSSfffLLLNNNHHHBBB;;;???AAA===<<<,,,$$$### ,,,999<<<<<<777111---999@@@AAACCCBBBMMMLLL;;;777666444888AAA???FFFQQQTTTNNNCCCEEE999TTT;;;cccbbbAAA777(((111,,,---"""&&&///'''###"""%%%))) ###999KKK...@@@444777@@@KKKtttxxx{{{ZZZ<<>>KKKOOOddduuufff___\\\YYYYYYzzz___\\\VVVaaafffyyyiiipppjjjccceeeaaacccpppeee^^^^^^~~~ ' {{{JJJRRReee]]]kkk```^^^```ooowww___]]]fff\\\___dddccchhhTTTOOO]]]cccfffkkkgggcccnnnrrrxxx}}} -#(+159ALU^jvyrh]TNHA;63.(# xxxtttpppooommmnnnhhhbbbeeejjjkkkgggbbbVVV[[[bbbiii\\\^^^eeepppwwwssstttvvvmmm]]]WWW^^^rrr{{{fff___VVVMMMZZZ|||vvvYYYOOORRR@@@333555JJJ111111,,,"""###,,,777;;;===444???---777@@@GGGNNNGGGVVVBBBTTT>>>111222777AAA```TTTNNNiii]]]FFF888777;;;<<<>>>666===000***000666+++EEE000***&&&!!!"""***666###&&&"""...>>>///@@@???777RRRRRRgggYYYUUUSSS999@@@WWWHHHDDD999===---)))>>>++++++"""---+++000)))777333DDD555>>>;;;@@@<<>>???GGG```yyy]]]nnnHHH<<<>>>EEE@@@===BBB:::///222888000333,,,&&&%%%,,,222111666VVV<<<999<<<;;;PPPeeeJJJOOO@@@AAACCCjjjbbbWWWPPPFFFEEEMMMMMM```[[[UUUaaaiiigggdddfff]]]cccpppbbbZZZRRR]]]```fffkkkmmmdddbbbwwwiiixxxgggtttwww |||vvv```MMMLLLKKKaaaVVV___WWWgggssseeennnWWWYYY```pppaaafffYYYnnnvvvRRRcccqqqaaaaaappppppxxx -"!&,/27>FMRZaotndYQKF?:52,$ zzzuuuqqqnnnmmmkkkbbb___bbbeeegggdddaaa^^^WWW[[[jjjfff```]]]fffnnnsssiii|||+|||```oooiiiccc}}}yyyvvv]]]^^^NNNKKKMMMLLLNNN???AAA:::444555///***###333---,,,(((---222222///%%%'''???LLLVVVLLL===CCC>>>BBB;;;444333???ZZZRRRLLLKKKQQQMMM???WWWCCC666HHH;;;111(((,,,:::,,,---AAA***&&&(((%%%###!!!%%%!!!!!!&&&(((000nnneeeWWW___cccUUU[[[>>><<<;;;:::999FFF777===444222^^^CCC((()))***+++>>>444???@@@CCC???AAA;;;\\\OOOQQQ@@@AAAIIIHHHRRR\\\]]]bbboooSSSFFF>>>HHHRRRfffeeecccvvveeeiiibbbllljjjcccNNNSSS___NNNRRRaaa___\\\___cccjjjnnnqqq{{{tttzzzjjj^^^SSSCCCMMMZZZ[[[[[[aaaccclll___vvvaaaDDDRRR___```\\\^^^}}}nnnaaatttjjjmmmSSS]]]jjjssswww{{{ $'*.49?GLOUZbgcZTPJD>92-&# -{{{yyyrrrtttrrrkkkdddgggfffhhhlllbbbbbb[[[]]][[[]]]hhhiii^^^gggxxxcccyyy}}}nnnvvvjjjeeennnxxxgggZZZTTTLLLKKKBBBDDD666111222555999---%%%"""%%%(((888000)))///222(((###777;;;IIIcccoooEEE===>>>CCC===<<<666666BBBNNNFFFMMMNNNRRRTTTQQQcccPPPMMMKKKPPP---***%%%''',,,%%%((( """%%%$$$"""$$$### 888///{{{QQQPPPhhhWWWBBB>>>666222444999111999444444666AAA)))444***///444===SSSIII;;;DDDQQQGGG<<>>TTT___aaa\\\aaaiiiooosssqqqJJJAAATTTeeeTTThhhmmmjjjooojjj```ZZZqqqrrrzzzyyyyyy&(+159?EHMQTY]\SPLHC=72-%! zzzuuuuuuwwwssshhhdddjjjiiimmmqqqbbbWWWLLLYYYgggeeebbb```dddnnnooo|||zzzxxxAyyytttcccfffZZZhhhbbbZZZQQQLLLTTTLLLHHHFFF;;;888666555444)))&&&$$$&&&###---+++,,,===BBBPPP444>>>FFFJJJWWWUUUHHH>>>FFFAAA666MMM;;;BBB<<>>;;;111---999,,,333+++(((+++222444===LLL;;;CCCgggSSSVVVDDDLLLJJJ```aaagggaaa___nnn:?xxxZZZ^^^___aaaqqqdddLLLNNNZZZooozzznnnuuuSSSFFFPPPKKKNNNcccbbbQQQ```kkkzzz rrrnnnyyymmmggglllQQQEEEWWWbbbeeeeeeiiilllkkkuuu^^^HHHQQQ___hhh___kkkooopppqqqeeegggfffggghhhmmmtttxxxxxx{{{ #%+059:50)$  -yyyuuuvvvvvvjjjiiijjjjjjiiijjjlllaaaVVVJJJVVV[[[XXXTTT```|||ttt{{{rrrwwweeejjjsssjjjuuusssmmm\\\ccc___TTTRRROOORRRCCC@@@AAABBB999JJJ---444$$$+++***!!!***555DDDHHHBBB444BBBBBBHHHRRRXXXSSSMMM???:::999666AAA;;;HHH777<<>>888:::000555444LLL///444555000444666,,,>>>YYYHHH>>>777DDD6MMM>>>CCCKKK===;;;WWWaaa```hhhlll{{{1&5wwwccckkk\\\fffffflllttt{{{cccccc```TTTgggOOOPPPPPPPPPWWWaaa```SSS[[[RRRdddpppuuu=vvvbbbccc^^^WWWQQQmmmooolllooouuuwwwjjjUUU___\\\RRRdddtttmmmooo```fffbbbhhhdddqqqyyy{{{}}} !&,048:>>444666CCCLLLUUU\\\XXXDDD<<<555;;;GGG===666888333999kkkddduuurrreeehhhsssddd+++  !!!$$$(((+++$$$""" $$$???JJJ,,,777///222444<<<666777777MMM333999555000555555333@@@///000666***===EEE777///cccHHH%LLL===BBBEEEVVVNNNJJJOOOIIIggghhhfffhhhwww~~~eeehhhZZZ[[[WWW```nnnxxxmmmooommmmmmEEEFFFDDDLLLJJJJJJJJJJJJTTTXXX^^^qqqUUUVVVPPP```zzzkkkmmmccciiiiiiYYYTTTWWWaaaeeemmmxxxoooooo]]]```aaaYYYCCC___lllqqqpppppp|||qqqaaagggnnnrrreeejjjvvvxxx~~~ %+.1479?ADGIKH@AA=951,)# -~~~wwwvvvnnnooonnnkkkhhhkkkpppnnnggghhhcccXXXOOOLLLSSSdddxxxyyypppvvvhhhVVVMMMNNNWWWgggkkkggggggfff\\\]]]PPP[[[IIIHHH888222...,,,,,,%%%''' $$$''',,,%%%###333AAAJJJCCC@@@KKK999>>>TTTWWWbbbfffJJJ<<<444:::666444222444888:::aaaXXXhhh```eeeaaaooo```888...###%%%"""&&&+++$$$!!!$$$%%%"""666AAA...333...///333777:::666111999000444555888222888555555666--->>>...///:::@@@666@@@CCC;;;777===CCCQQQTTTKKKRRRNNNRRRRRRdddyyyggg]]]hhh{{{pppkkk```VVV^^^[[[___cccggg}}}uuubbbRRRDDDUUULLL===999BBBHHHQQQ[[[RRRSSSTTTLLL___dddgggxxxpppeeedddAAAHHHQQQ[[[PPPcccuuusssaaa[[[iiidddOOObbbgggrrrppppppfffVVVaaakkkoooooo}}}yyyrrryyy|||$),/269:=>BEE?<;:951.*&  }}}vvvuuuiiijjjmmmggggggllltttooo```eee}}}VVVWWW{{{mmmaaaQQQNNNRRR[[[mmmpppxxx]]]UUUXXXYYYEEE;;;JJJJJJBBB333333+++&&&***$$$***---111"""///???@@@AAAFFF<<>>HHH555000888888111222000)))---444:::111///...444999222+++111,,,111888:::222444777NNNKKKJJJZZZCCCDDDaaaiiiYYYVVV]]]bbb```jjjmmmcccaaa^^^]]]aaa^^^zzz[[[cccuuutttwww IIIPPPdddnnnBBBBBBEEEXXXRRRTTT___YYYhhh^^^fff]]]\\\5^^^WWWCCCEEEUUUcccRRRfffaaaeeejjjsssIIIxxxlll]]]llllllqqqlllyyypppdddhhhmmmqqqpppvvv{{{{{{").-1478::<@?;78642-)(# -wwwsssggghhhgggiiijjjnnnvvviiiRRRZZZffflllVVVaaa -yyyeeessseeeVVVcccZZZnnn{{{vvvccc\\\bbbTTTBBB???SSSPPP???777)))LLL+++'''---000###""")))222DDDGGGGGGNNNMMMBBBLLLAAAGGGQQQPPPIIIBBB===:::555222777666<<>>GGG<<<555+++---111111222666---//////+++))),,,'''...444+++---000///<<<777;;;///555:::[[[III@@@SSSMMM```SSSVVVYYYVVVSSSdddjjjgggsssvvvnnn___\\\xxxfffeeeqqqsssooolllllllllFFFRRRQQQOOOPPPGGGHHHUUU___VVV[[[aaaggg rrr\\\UUUCCCRRRNNNXXXNNNPPPZZZVVVVVVTTTQQQ```ggg``````qqqgggffflllqqqkkkmmmssswwweeeiiilllhhhpppzzzwwwwww !(--014678669:4230,(%$  ~~~}}}wwwqqqmmmooollljjjkkkrrreeeRRRNNNXXX^^^___```oooyyyuuuqqqdddTTTUUUTTT[[[ggg___```qqquuujjjnnnaaaRRRPPPHHHBBBFFF===999000,,,...444---+++""")))CCC555000AAAOOOQQQKKKMMMYYYOOOGGGEEESSSRRRIIIMMM333333222///666;;;===LLLAAA???AAARRR[[[UUUBBBXXX>>>222###''')))---'''***))) +++"""'''&&&"""444###%%%"""???MMMFFFHHH111444,,,---222444===:::333///111---111333///---(((222---888111000666JJJ<<<@@@>>>KKK[[[DDDFFFOOOZZZMMMIIIVVVWWWgggqqqjjj___iiigggkkk___[[[oookkkgggssshhhhhhkkkAAALLLQQQ;;;IIIMMMVVVMMMOOOOOOOOOYYYUUUaaa^^^^^^pppwww```NNNHHHNNN[[[OOORRRnnnTTTMMM^^^\\\dddWWWZZZ\\\dddWWWVVVkkkxxxooorrruuujjjkkknnnooowwwvvvzzz{{{ssswwwyyy %*,//148640251,.-*&#! -yyytttllljjjrrrsssrrrlll|||UUUPPPOOOWWWXXX___kkk{{{|||vvvuuulllYYYaaaTTTgggbbbaaaqqqjjjrrrnnneeeZZZlllIIITTTeee^^^BBB???222>>>JJJ111+++((('''...555>>>999888DDDSSSSSSYYY___PPPKKKPPPGGG@@@===999777,,,000@@@>>>BBBEEE:::<<>>CCC@@@:::666444777888333222;;;///...111,,,---+++)))$$$+++...111555;;;+++)))888FFF666;;;BBBGGGIIINNNKKKSSSUUUMMMJJJVVV[[[ggg]]]YYYbbbaaadddbbb\\\mmmqqqooo|||nnnsss```)))***777999HHHMMMUUUPPPWWW]]]JJJRRRfff^^^cccfff]]]jjjYYYOOOBBBNNNTTTYYYPPPlllOOO\\\pppllleeeYYY\\\ggg[[[DDDiiiuuu|||rrrqqqqqqmmmnnnooosssxxxxxxsssuuuyyy|||zzz~~~"'*+,.16340./,(*+(%  |||xxxqqqmmmlllnnnrrrkkknnnlllUUUBBBMMMGGGZZZccclll -~~~tttpppaaassstttUUU^^^eeeccceeepppssskkk___VVVNNNIIIHHHJJJMMM???++++++000000//////)))666333CCCOOOHHHQQQVVVSSSPPP]]]gggddd[[[QQQIII777JJJNNN777//////444888???BBBPPP777///&&&'''DDD:::AAA,,,+++,,,'''$$$###""" ###'''""" !!!!!! &&&$$$"""<<>>FFFXXXgggiiivvv}}}|||sssxxx___WWWdddkkkdddhhhjjjbbbeeesssmmmaaa]]]SSSHHH@@@NNNAAA888:::///,,,***$$$&&&***222:::???DDDGGGKKKMMMQQQZZZ^^^RRReeecccTTTDDD000...---999>>>@@@888:::;;;999<<<888666===GGG---$$$------///...+++000(((###%%%&&&$$$((("""###!!!""")))  VVVMMM666888HHH666111000666GGG@@@:::999///222///777222***333888666000111ooo - AAA999666::::::GGGIIIPPPLLLXXXYYY[[[\\\jjj^^^gggggg```jjjkkkWWW______```rrrkkkoooHHH@@@&&&444KKKzzzeeePPPUUUaaa]]]WWWZZZXXXYYYYYYNNNZZZaaa[[[[[[hhhRRRQQQMMM[[[eeegggrrr -nnnrrrjjj[[[bbb{{{qqqwwwkkkssszzzxxxzzzpppwwwlllzzz|||qqqqqqrrrpppwww||| $'()--.,*)(&#"  -~~~zzzrrrllluuurrrlll```^^^LLLBBBKKKMMM???XXXffffffiiiooojjj```lllhhhiiidddaaafffuuu{{{dddwww{{{ooo```WWWYYYEEEFFFPPPJJJ===@@@222,,,+++)))......444999666FFFOOOQQQTTT\\\bbb]]]WWWRRRKKKQQQAAA555888555:::AAABBB======999999111444666???:::;;;...///***&&&***,,,***+++$$$ 000***"""!!!###""" """  !!!$$$###nnnXXXGGG@@@LLL>>>222---,,,???555666111AAA---++++++111000)))---;;;555+++888GGGTTT===;;;555999:::===EEEFFFEEEKKKbbbbbb___YYY\\\\\\gggiii```___\\\ccchhhXXXiiidddqqqwwwoooPPPUUU<<<666IIIVVVSSSMMMNNN\\\[[[XXXWWWaaaXXX\\\[[[oooYYY[[[QQQWWWTTTMMMGGGLLLeeeeeebbboootttppphhhxxxLLLeeedddqqqrrruuu|||zzzyyyyyyjjjiiisss|||||||||~~~{{{xxxrrroooooozzz}}}  %&'')))((&$"  -{{{sssrrrooorrrpppeee^^^[[[RRROOOIIIDDDBBBYYY```aaa[[[RRRUUU~~~zzzppprrrkkkbbbjjjyyymmmeeerrrpppmmmeee^^^WWWPPPSSSPPPkkkOOOAAA;;;888333111222444777<<<888MMMNNNRRRXXXUUUYYY```JJJBBBAAAEEEFFFAAA???999AAABBBHHH===DDD:::333777666BBBGGG555777666***&&&&&&(((''')))$$$!!!!!!""")))&&&%%%  ###%%%!!!BBBLLL???:::666---------***AAA666999222555222(((222---'''(((,,,000;;;///---666>>><<<444222555===;;;BBBBBBEEEMMM]]]VVV\\\```aaammmllllllTTTTTTMMMQQQ[[[[[[hhhllljjjkkkbbbOOOCCC888666GGGVVVCCCLLLZZZWWW]]]kkkXXXRRRVVVOOORRRNNNMMMQQQSSS>>>IIIQQQJJJPPPaaabbb```jjjiiiVVVNNNhhh```ttt~~~xxxvvvuuuiiikkkrrrxxxxxx{{{yyylllkkkmmmggglllyyy}}} #$&%&&%%$" ~~~|||wwwrrrqqqlllooohhheeedddZZZYYYRRRCCCAAAMMMVVVXXX^^^UUU\\\|||~~~}}}kkklllqqqqqq{{{tttqqqfffcccccc[[[nnnyyy]]]TTTDDDBBB777666---222)))<<<<<<555GGGLLLYYY^^^VVVPPPRRRLLLEEENNNFFF???999@@@BBB<<>>DDD::::::666333888//////'''###%%%%%%***%%%%%%$$$'''!!!$$$'''%%%,,,777!!!!!! ;;;$$$))) ;;;888:::111111444,,,---&&&'''///555......HHHCCC===...'''!!!$$$BBB+++(((...777111===888777222888<<>>CCCEEE???EEEDDD]]]VVVuuu{{{lllYYY===???NNNMMMQQQddd]]]QQQXXXgggdddjjjaaaaaaYYYTTTeee$ZZZOOO```[[[WWWYYYaaacccWWWdddMMMNNNGGG___VVVWWWRRRPPPQQQEEEAAATTT[[[cccuuuwwwppphhh{{{|||zzzmmmuuusss```bbb```lllqqqyyyyyyvvv[[[UUUgggfffnnn{{{|||  !!  ~~~|||{{{{{{tttkkkqqqvvvnnn___ZZZZZZVVV___eeejjj```VVVTTTXXXWWWccceeettt%#}}}wwwnnnkkkiiiiiiqqq -~~~qqq___cccpppbbbZZZGGGNNNaaaBBBIII===777;;;AAAGGGIIIFFFOOOMMMTTTQQQUUUVVVNNNLLLIII???///222BBBYYYBBBDDDHHHOOOLLLFFFRRRPPPJJJGGG;;;444:::444,,,)))(((''''''&&&$$$%%%###***+++ """$$$######'''""" ***&&&'''%%%...111555555000444...222777000,,,###+++111333///333999444...'''<<<+++###'''***&&&888555444555@@@555QQQ>>>===GGGOOOZZZhhhhhh||| bbbMMM>>>FFFWWWXXX```]]]OOObbbfff```]]]```[[[]]]___eeeZZZNNNOOOZZZUUUwww^^^gggaaadddSSS>>>BBBWWWEEEYYYXXXQQQLLLEEESSSeeeaaahhhttt,|||qqq\\\qqqcccrrrjjj```ZZZ```eeesssyyy{{{uuupppTTTaaakkkuuuvvv{{{  -~~~zzz|||xxxsssrrrqqqqqqjjj[[[WWWXXX^^^aaaaaaeeefffeeeaaallljjjuuu___eeezzzqqqwww|||gggfffeeekkkrrrzzzrrrllleeefffZZZIIITTTeeelllJJJ>>>===???GGGBBBNNNXXX[[[MMMFFFSSSOOOUUUYYYPPPCCC;;;///;;;===EEE@@@:::CCCIIIMMMLLLCCCEEEIII>>>AAA;;;<<>>===HHH@@@DDDDDDNNNMMMJJJKKKNNNKKKKKKBBBBBBGGGFFFCCC<<>>///:::)))$$$$$$%%%!!!!!!%%%!!!!!! !!!###$$$ !!!###%%%KKKAAA333'''///888888888444666...333///000///111222<<>>888@@@EEELLLMMMNNNZZZ```cccZZZbbb\\\GGGRRRYYYDDDJJJKKKEEE\\\^^^qqqjjjooo#@QDGC|||ppppppqqqqqqiiibbbVVVVVVbbbqqqvvvkkkyyyTTTWWWkkkiii}}}}}}   zzzxxxxxxuuuvvvwwwyyyzzzxxxppphhhgggaaaVVVbbbfff\\\\\\fffllluuuzzzsssmmmooovvv{{{yyyssscccffffffeeeaaammmvvvlllqqqkkknnniii~~~llliii```fffBBBQQQEEE///;;;888555;;;@@@nnnLLLIIIdddVVVTTTSSSYYYUUUIIICCCJJJHHHKKKJJJ???:::NNNNNNJJJQQQ```>>>DDDCCCBBB???LLL;;;iii???@@@:::666,,,%%%)))%%%""")))###---******''' """%%%!!! ######&&&''';;;***)))(((@@@777:::<<<<<<222<<<222222AAAttt@@@---AAA>>>,,,)))...AAA(((,,,"""///111,,,>>>888888444AAA\\\JJJhhh\\\dddlll~~~rrrsssxxx```fff{{{|||{{{zzzddd\\\XXXTTTqqqggghhhRRREEEGGGQQQGGG...???<<>>>>>666888::::::BBBDDD???DDDQQQRRRQQQRRRMMMOOOUUURRRRRRSSSRRRVVVUUUIIIXXXXXX hhhbbbzzzlll]]]JJJNNNBBB>>>>>>333===111((( """((((((***---$$$%%%$$$$$$222%%%""")))))),,,222---///GGG;;;<<<111---666999EEENNN777000%%%===222+++******...,,,***888&&&///)))(((666333+++---++++++666;;;555999:::AAA<<<999333HHHBBBKKKdddqqq \\\+iiiFFFKKKUUUuuutttlll```YYYXXXXXXZZZTTTSSSKKKJJJIIIFFF666444,,,444111===DDDZZZHHHMMMXXX]]]RRRLLL:::999@@@>>>>>>[[[aaaOOOGGG\\\aaahhhmmm &/71,{{{aaaUUUeeehhhiiiggg```KKKVVVfffjjjnnnqqq{{{zzzxxxiiikkkvvvzzz}}}ppprrrxxx  ~~~{{{|||}}}{{{vvvooonnniiiggg^^^```[[[VVVYYYjjjmmmfffiiinnn~~~yyy|||zzzrrrmmmggg]]]eee___ZZZaaagggiiirrrkkkoooeee[[[|||\\\VVV999222999:::FFF===>>>KKKBBBGGGGGGFFFQQQQQQKKKWWWOOOffffffUUURRRkkkuuu___ZZZ[[[[[[ SSSyyyoooNNNFFF999AAA===<<<666111///))))))+++$$$&&&+++///---&&& +++***''''''...'''eee,,,333JJJ111:::666OOO>>>>>>WWW[[[PPP999+++(((000------(((""")))---EEE(((((()))---222//////)))***222222:::222999333333...:::<<<>>>QQQIIIAAAOOOdddaaaTTT?aaaAAA@@@___oooppp___QQQ```VVVGGGRRRRRRKKK@@@EEEBBBBBB333222000666<<>>bbbKKKFFFBBBIII<<<>>>PPP888000...---///'''(((&&&)))000FFFIII((()))$$$***(((---666***...)))111---+++---555]]]444XXXZZZ<<>>DDDMMMCCCCCCFFFHHHMMMTTTUUUHHH777DDDTTTCCC<<>>???HHH???:::CCC======555666666222---...)))((()))+++)))XXX<<<222111///888)))))))))(((((($$$%%%,,,***)))///;;;999===<<<:::222,,,(((***&&&555+++(((&&&###$$$'''<<<))),,,333111)))(((,,,///???888:::000111...;;;===GGGAAADDDGGGSSS[[[HHHIIIWWWKKKJJJNNNLLL___dddgggaaaSSSMMMEEEHHHUUUEEEOOO[[[DDDCCC<<<>>>000666999777<<<;;;:::BBBHHHKKKJJJMMMOOOJJJ999666IIIKKK...888[[[RRRHHHccceeeOOOYYYaaaqqqiiiUUUbbbeeekkkeeeEEEZZZnnnXXXJJJbbbbbbWWW]]]^^^qqquuuzzzwww}}}yyynnnrrrwww}}}pppnnnwwwwwwxxx~~~ |||xxxzzz}}}yyyrrrqqqaaaZZZWWWWWWdddaaakkknnniiijjjtttvvv{{{qqqnnnuuulllmmmnnntttvvviiibbb```oooZZZiiipppbbbcccpppmmmdddgggoootttSSS[[[HHHCCC:::@@@999222222;;;777===DDDaaaIIIRRRFFFRRRCCCIIIHHHOOOHHHPPPVVV\\\ZZZcccYYY___ccc]]]```gggkkkWWWGGGLLL^^^CCC999888444555000333>>>555444+++!!! ###(((---+++)))QQQ666111)))///'''&&&***'''***###+++###'''111)))555JJJ333222.........***&&&(((,,,)))000""""""!!!'''&&&333&&&''' CCC...>>>+++))))))555///333111GGGBBBCCCPPPQQQLLL~~~___BBBXXX???BBBKKK___sssvvvjjjaaaUUUTTTfffJJJMMMPPPZZZbbbAAA===WWWaaaAAA///333444444<<>>222+++---KKK000000...===222:::]]]VVVEEEHHHDDD===666888EEE```eeejjjdddhhhXXXRRRRRRHHHLLLNNNUUUJJJBBBGGGHHH999444666111777888<<<:::===@@@FFFFFFHHHLLLKKKAAA555$$$...333JJJ???NNNMMMAAACCCaaa|||xxxfffVVVHHHQQQWWWkkkLLL```RRR???DDDZZZkkkcccPPPjjjuuu{{{ vvvmmmqqqxxx|||fff^^^^^^gggqqqvvv}}}{{{}}}qqqoooqqqpppqqqtttnnnrrrmmmmmmsss|||qqqfffggggggkkkkkkmmmllluuujjjxxxkkkfff'xxxggg^^^```TTTZZZbbbaaa}}}|||ooottthhhnnnTTTWWWGGGBBB<<<===666333666UUUHHHCCCAAAFFFFFFPPPRRRPPPLLLKKKCCC??????OOOJJJOOOQQQWWWkkk[[[ZZZ```]]]]]]___iiiUUUccc??????555000::://////555...222444,,,---'''%%%!!!$$$###(((%%%"""###'''//////)))///***//////###555"""###%%%...%%%&&&###)))(((...222111((($$$&&&###&&&!!!%%%---+++---%%%)))$$$ $$$"""!!!''''''&&&666000(((...222222888555FFF@@@EEE<<<111,,,DDDZZZcccpppgggmmmzzzpppYYY[[[UUUMMMEEEGGGEEECCCDDD;;;:::111666888CCC444888BBB:::HHH???KKKFFFEEECCCHHHDDD444$$$"""(((777>>>QQQVVVOOO999EEEmmm|||rrrhhhwwwmmmYYYhhhaaaYYYPPP;;;EEEKKK///999]]]ccc\\\OOO\\\ttt}}}qqqsssxxx~~~{{{wwwlllYYY]]]cccrrrvvvnnntttwwwuuuyyyyyyqqqqqqiiifffZZZXXXkkkmmmiiijjj{{{sssxxxooodddmmmppprrrrrrsssyyyrrrmmmooovvvxxxrrrllleee[[[```cccddd^^^gggeeemmmzzzuuuvvvuuu___[[[SSS]]]999111777@@@@@@:::>>>eeeWWW\\\IIIKKKKKKDDDGGGNNNGGG>>>EEEDDDHHHJJJMMMOOOUUU\\\ccc[[[]]]aaa]]]ZZZXXXUUUGGGHHH@@@:::222///333555000555---000------+++))) 555###!!!$$$$$$###''''''%%%444***(((+++:::###***222(((((((((((((((%%%+++)))...(((---000&&&&&&***%%%(((333,,,<<<999'''"""### %%%###!!!"""***///<<<%%%333...'''%%%&&&******222999>>>888555222333FFFPPPuuudddssseeecccSSSQQQRRRLLLFFFAAAAAACCC===???222---111888666333<<>>000999444333222000000000555444666))))))&&& &&&***+++''')))000+++...444222$$$$$$+++&&&(((666))))))&&&(((%%%''':::;;;$$$---///)))000///---111///...+++&&&$$$###"""!!!$$$(((000***111,,,''')))))) %%%&&&---444777222<<>>MMMIIIKKKOOONNN@@@@@@CCCEEEGGGJJJFFFLLLMMMOOORRRUUUWWW\\\``````aaaWWWVVVRRRKKKFFF>>>:::>>>:::777666<<>>777888000---&&&111)));;;MMMPPPPPPddd|||cccIIIHHHTTT[[[iiihhhmmmnnnjjjrrrfffRRRhhhdddZZZYYY\\\bbbPPP]]]xxx |||vvv{{{qqqjjjvvvsss~~~tttvvvvvvxxxrrruuulllnnndddWWW```bbbeeedddiiihhhjjjmmmsssnnnnnnzzz{{{rrrrrr}}}~~~~~~fffaaagggccchhhcccnnngggqqqxxxmmmmmmmmmnnniiitttmmmbbbQQQFFFIIIIIIUUUEEE>>>:::EEEHHHDDDHHHXXXKKKKKKHHHJJJHHHGGGYYYCCC222BBBJJJVVVUUUTTTRRRYYYcccbbb```\\\bbb{{{kkkCCC<<<999888<<<<<<222444333666<<<...+++444///...)))'''%%%$$$''''''!!! ###"""$$$$$$%%%)))>>>+++888888,,,DDD)))111(((%%%***'''(((;;;444+++ )))777...111,,,***%%%((("""888&&&%%%$$$&&&###!!!!!!((($$$"""+++......,,,&&&,,,666///222222111222AAA888AAA]]]VVVOOOSSSWWWeeeiiirrrnnnhhhjjjfffSSSJJJ\\\CCCFFFAAA===;;;:::222666666888:::???GGGHHHEEEPPP@@@???===;;;@@@CCC<<<+++)))&&&444$$$888WWWQQQXXXaaattt___KKKTTT___hhhvvvmmmooogggnnniiiggg ccceee```cccVVVZZZfffyyyyyyvvvzzz|||rrr{{{sssiiixxxyyyvvv|||xxxyyyyyysssnnnpppqqqsssbbb]]]kkkffffffmmmllluuurrrsss'xxxooosss}}}rrrmmmnnnccc______^^^aaa]]]ppp}}} uuuzzzmmmllloooffflllqqqgggVVVYYYMMMIIIeeeNNN@@@???NNNEEEFFF>>>SSSNNNKKKFFFEEEHHHLLLRRRHHH@@@AAAHHHPPPUUUTTT\\\YYYaaa___ccc\\\SSS___UUUAAA999777666888444666333333000<<<555<<<---***,,,+++)))%%%!!!"""!!!$$$!!!$$$&&&)))...+++)))'''(((---...999444777UUU000...,,,&&&%%%333555&&&(((******&&&OOO---+++'''"""???sss...xxx)))%%%'''!!! %%%///,,,))) %%%---;;;//////...111666666888===GGGZZZGGGRRR^^^cccttt{{{uuugggbbb\\\PPP??????999???BBBEEEAAA666555888???999::::::@@@KKKBBBBBBAAA@@@CCCIII>>>777333000000...333===MMMSSSQQQZZZYYYddd]]]hhhuuutttkkkttt{{{lllnnnjjjlllyyy-5xxxaaaeeedddbbbmmmbbbmmmzzztttrrrsssrrrxxx}}}gggwwwmmmkkksssuuuqqqsss}}}wwwvvvwww{{{lllrrrppp{{{uuuvvv~~~ooorrrqqqwwwfffkkknnnrrrkkkjjj pppjjjiiiaaaXXXaaabbbmmmqqq{{{rrrfffaaannnqqqnnneeeTTTRRRQQQNNNNNNMMMTTTCCC???CCCHHHOOOLLLNNNJJJIIIHHHEEEJJJdddKKKnnnPPPPPPRRRNNNVVVjjjeeeiiiWWW]]]fffTTTNNN???===EEE???===LLL...222444000666666DDDyyy<<<(((...---)))))))))"""'''&&&(((***---$$$---&&&444+++111666^^^DDD888)))333:::444---### CCC###)))'''###111%%%(((&&&(((???UUUGGG+++&&&$$$!!!"""'''333&&&&&&&&&$$$333)))***...---+++333666777@@@999;;;DDDTTTOOOTTTcccmmmddd\\\]]][[[PPPMMMAAAPPPOOOGGG:::DDD777444999777777777666>>>CCC======???666444:::888444111,,,---333AAAuuuPPPOOOUUURRReee\\\mmm }}}iiitttvvvjjjeeeYYYaaa|||5oooWWWiiicccfffiiihhhxxxuuutttmmmeeekkkgggjjjkkkwwwtttfffwwwwwwyyyyyy}}}tttrrrpppjjjzzzzzzwwwvvvssshhhlllffflllsssqqq{{{wwwwwwtttxxx|||ssseee___bbbddd```nnnnnnssssss|||iii^^^^^^lllaaaTTTVVVOOO]]]RRRJJJFFFRRRBBBEEEFFFIIIOOOJJJLLLGGGKKKEEEGGGDDDSSSHHHFFFCCCHHHNNNMMMSSSXXX\\\XXXSSSTTTUUUOOOIII;;;888888===:::FFF777888777333666AAATTTpppuuu...,,,******)))((($$$***,,,###%%%)))(((%%%000%%%777444111222===III---)))))):::LLL'''###""""""###%%%$$$((('''((("""&&&111999"""###!!!)))### ###"""$$$"""&&&'''''',,,555+++555<<<333///111===JJJAAATTTJJJSSSrrr~~~~~~llldddcccYYY```XXX<<<>>>MMM999EEECCC===>>>777888<<<999888888BBBLLL;;;:::<<<@@@999:::333333000000333555333999;;;CCCUUUYYYaaaoooxxxpppkkkppp qqqhhh]]]gggggg qqq]]]ddd^^^ooosssooo{{{kkk vvvqqqrrrzzzyyyjjjuuuvvvzzzfffvvv}}} - yyytttooolllkkkmmmjjjhhheeefffhhhdddpppjjjlllooo}}}}}}oooxxx|||tttllliii___oookkkrrrllluuulllhhhzzzooobbbaaa\\\```TTTMMMSSSSSSLLLWWWpppHHH???FFFIIISSSSSSXXXTTTJJJCCCAAA???<<>>777DDDQQQYYYZZZZZZbbb^^^YYYXXXVVVOOO@@@;;;777:::333222888:::999:::AAA@@@???SSSOOO>>>>>>:::---,,,777((()))'''$$$%%%'''###$$$)))&&&222AAA444999///333===???'''------((($$$###&&& &&&$$$((())),,,%%%%%%!!!$$$'''!!!###!!! """!!!)))###+++""""""(((UUU((( """###'''111---///000]]],,,222BBBUUUEEEOOOSSS^^^___}}}6hhhaaaJJJMMM333DDDYYYGGG;;;AAAUUU999;;;666555777555>>>KKK;;;555<<<666BBB:::999<<<999999222111...222------DDD^^^RRRaaavvv |||iiilllooonnngggkkkjjjgggWWW___^^^WWWaaa\\\```cccuuu~~~zzz -~~~ttt -{{{xxxtttxxxrrrwww|||{{{ )fffjjjeeelllqqqxxxooorrryyyrrrssspppxxxrrr{{{~~~wwwllluuuuuurrroookkkkkkcccfffkkklllnnnpppxxxnnnbbb]]]\\\[[[ZZZ^^^TTTUUUVVVPPPLLLLLLIII@@@===GGGNNNLLL[[[pppIII>>><<<===@@@;;;<<>>===888:::AAADDDDDD444;;;777???888000***///---,,,CCCKKKGGG[[[|||yyylllwwwqqqsssRRRssssssqqqhhhxxxaaaLLLPPPaaaeeeTTT___ooo}}}-rrryyywww -zzzwwwttt|||~~~(}}}ppp{{{jjjnnn~~~xxxwww}}}xxxuuuuuuyyywwwqqqoootttxxxnnnmmmnnngggeeekkkmmmnnnmmmsssqqqjjj]]]WWW]]]bbb^^^YYY```cccUUURRRWWWFFFAAADDDDDDHHHGGGMMM___dddSSSEEE999;;;BBBNNNKKKUUU]]]WWWYYYdddggghhh]]][[[YYYVVV[[[VVVKKKNNN888222555888???KKKGGGGGGGGGCCCJJJQQQvvvbbbIII555---...EEE)))%%%""")))(((###!!!%%%$$$&&&+++000555777???;;;222444(((111$$$***$$$%%%###000***(((%%%...***333'''%%%$$$%%%###### )))""")))%%%$$$,,,000"""222+++'''...###'''CCC)))444===>>>:::@@@555888@@@<<>><<<777SSS@@@CCCGGGFFFZZZ)"{{{eeeIII333...888kkkWWWIIIGGGYYYFFFBBB;;;:::???BBB@@@>>>;;;OOOPPPLLL<<<888888===555777???<<<555666000888FFFEEEMMMJJJnnnhhhooosss~~~+TTTXXXjjjlllkkktttzzzwww{{{~~~qqqsssttt{{{qqq{{{  ~~~ ~~~xxx}}}  |||ppp{{{}}}vvv{{{rrrxxx{{{yyyuuukkklllvvvssssssrrrcccccc```iiiuuufffSSSKKKMMMUUUQQQLLLCCCDDDGGGLLLEEEIIIGGGiiiAAA@@@JJJMMMeeeNNNPPPNNNZZZYYYRRRVVV^^^___bbbZZZ\\\NNNAAA>>>:::555888@@@IIIPPP===ZZZ;5ooorrrzzz[[[<<<777000000###$$$%%%$$$&&&&&&***&&&'''+++,,,***...---222555,,,888---999)))&&&...***)))))),,,///&&&***111&&&$$$)))%%%%%%%%%)))"""&&&&&& &&&###'''(((!!! ###"""&&&"""!!!---444ZZZ???444===<<>>OOOXXXuuunnnppp```UUUMMM777999<<<===BBBZZZ;;;OOOBBB???>>><<>>666777999111111BBB@@@FFFQQQbbbiii#}}}PPPeeewww >Fbbbpppzzzkkknnnttt[[[nnntttzzzoooaaa}}}wwwmmmmmmoookkkiiiooo}}}~~~ -|||~~~{{{   nnn||| ssswww|||nnnmmmzzzoootttcccaaaZZZdddSSSPPPSSSPPPQQQIIIYYYJJJDDDGGGPPPLLLOOOAAAJJJVVVUUUPPPJJJJJJRRRZZZ___iiieee[[[ddd]]]\\\mmmaaawww```KKK:::NNN>>><<<===>>>QQQDDD111666AAATTT|||+\\\MMM<<<'''...&&&&&&&&&$$$'''***(((&&&%%%...```444,,,,,,---000,,,...;;;000$$$###888AAA***...111+++---...===$$$$$$&&&)))***###,,,bbb--- '''""""""333((($$$ !!!%%%!!!888666111===777888@@@666FFFBBBBBBCCC333AAAJJJPPPdddUUUHHHEEEAAA999BBB<<<<<<666DDD>>>;;;999555999;;;AAA]]]KKKNNN<<>>QQQTTTjjjBBB>>>FFFGGGDDDDDDIIILLL@@@000999777<<<777666777VVVXXX===UUU888===HHH999>>>777TTTIIIEEE:::555>>>111777888111LLLBBBIIIOOOTTTeeeaaakkkwwwvvvhhhkkkeeeVVVXXXDDD]]]mmmttttttwwwrrrwww{{{~~~jjj[[[ZZZvvvgggiiiqqqqqqmmm||| }}} -  ~~~ ! ||| -}}}ooo~~~gggooooooqqqpppwwwyyy nnnnnnkkkWWWWWWYYYOOOKKKKKKGGGEEEAAAAAABBB???EEECCC???AAA===EEEKKKOOOeeemmmXXXZZZbbb^^^\\\YYYYYYdddWWWTTTQQQPPPWWWoooAAA:::???HHH777@@@>>>KKKcccCCCPPP777WWWjjj???@@@BBB888***---)))%%%&&&$$$###%%%''')))***,,,(((+++...777''')))))),,,&&&((()))+++&&&''')))444555,,,'''***...555888$$$&&&---###'''%%%///CCC<<<777(((333%%%;;;bbb777222!!!"""%%%666333///000777444777<<>>DDDOOOLLLCCCIIIKKKPPPEEE@@@222,,,111999AAA222===999999;;;999AAA;;;777===???NNNFFFEEE<<<666:::111<<<333000@@@FFFUUUOOOVVVmmmxxx~~~|||yyykkkjjjcccNNN===NNNnnnEEEKKK^^^hhh -{{{pppmmmooottt~~~uuufffsssnnndddfff|||{{{www~~~ {{{ - - }}}uuu||| ~~~uuuxxxttt{{{yyysssrrrqqqnnnmmmsssyyyppppppkkkkkkiiiiiiRRRSSSLLLNNNFFFHHHFFFEEECCCFFFJJJGGGNNNHHHAAADDDEEEDDDIIIRRRWWW___[[[aaa^^^```ttt\\\[[[^^^WWWOOOUUUIIIOOOFFFAAA>>>AAACCC===]]]LLLSSSTTTIIIAAA???AAA===222999YYYHHH%%%%%%)))###$$$ ###+++111***))))))(((///,,,,,,(((******------&&&...(((888...((((((222\\\DDD000333QQQ===((("""---+++%%%***///CCC+++%%%!!!555"""000FRRR '''!!!000RRR777666111666BBB<<>>;;;???@@@<<>>999JJJGGGGGG:::>>>AAAAAAHHHTTTRRRIIIJJJFFFCCCJJJLLLWWWaaa[[[___\\\cccYYY\\\WWWYYY```ZZZYYYJJJEEEIII@@@:::BBB666888???@@@BBBBBB:::444???TTTPPPuuu111)))&&&)))+++(((&&&%%%$$$%%%###+++***+++---444+++&&&)))666'''&&&&&&)))%%%%%%###%%%333888%%%'''777000---111...)))<<<... """+++===---))) ######"""###%%%:::&&& ,,,===//////XXX???;;;===EEEJJJMMMOOOYYYEEEHHHEEE^^^UUUXXXeeeHHHCCC444666:::AAA333%%%000888@@@???PPPhhhDDD666222888333===222999===888777555999555===888777RRR???;;;CCCQQQfff|||ooommm[[[lll}}}uuu{{{~~~vvvlll[[[RRR===VVVRRRZZZTTTVVV[[[ooohhhoooVVVVVVHHH^^^zzzvvv~~~kkklll~~~rrr{{{{{{vvv{{{}}} -}}}~~~{{{zzz{{{ooogggeeefffeee___ccc -wwwggggggtttnnn}}}vvvhhhttteee___bbbcccXXXUUUUUUUUUSSSNNNUUU___YYYNNNIIICCC:::@@@BBB888222888@@@HHH]]]JJJLLLMMMRRRPPPQQQTTT^^^YYY\\\ZZZhhh^^^gggbbb[[[RRRVVVkkkUUUKKKMMMFFFFFFMMM???<<>>///)))222333AAA;;;;;;???===555333;;;===DDD777;;;:::222333222999333;;;>>>777CCCHHHQQQ:::===MMM iii___TTT[[[}}}uuutttsssSSS666FFFFFFUUUVVVUUUSSSdddddd]]]nnn^^^EEE===FFFRRRtttpppjjjqqqzzzvvv|||~~~sss{{{ zzzpppiiihhhdddfffhhh]]]ccchhhhhhsssnnnaaafffaaa\\\iiinnnddd]]]bbbNNNWWWQQQVVVUUUWWWRRRbbbTTTQQQKKKGGGPPPFFFCCCFFFBBB===888<<>>+++&&&### """%%%''',,,333***111000111222888000---$$$;;;)))%%%%%%""""""EEE###$$$###!!! """ &&&###000------((((((444555KKKIII___@@@DDDEEEKKKTTTGGGHHHUUUXXXXXXQQQTTTcccMMMOOO888((((((...<<<444333;;;NNN666333444777>>>@@@???666333111666555666555BBB@@@;;;:::333666888???NNNsssrrrUUUpppaaannnuuussszzznnnFFF777kkk___lllVVVPPPdddyyyjjjfffIII222DDDKKKnnnffffffxxxsss}}}xxx~~~{{{www}}} uuullljjjkkkqqqhhheeehhh\\\gggccckkkaaaddddddrrrxxx xxxmmmoooqqq[[[WWWbbbttt___PPPOOOOOOUUUSSSYYYKKKDDDGGGJJJIIIFFFHHHFFFHHHNNNMMMTTTBBB===HHHUUUQQQIIIKKKQQQYYYeeeccc^^^ffffffccchhhaaa^^^^^^YYYiiiQQQQQQDDDDDD;;;:::@@@>>>AAA888???AAA===HHH555222???000333111***&&&***---///,,,))),,,))))))...))):::******((((((;;;)))''''''+++)))***!!!"""'''555'''///"""$$$((('''&&&...---,,,---...555???111:::"""'''%%%$$$"""+++777"""<<<&&&!!!!!!%%%!!!$$$###---,,,==='''444999999555111555888@@@EEELLLAAABBB\\\VVVLLLppphhhKKK))))))AAA...000...JJJ===333444555555444444>>>IIIGGG999666555777444888777===777666111:::999HHH^^^EEEZZZ{{{^^^hhhuuuvvvzzzmmmkkkRRREEEZZZ'jjjdddbbbaaakkknnnSSSFFF888<<>>???777+++...,,,111333666))),,,%%%******---***(((---)))...000(((---666)))(((&&&$$$***&&&222'''%%%333%%%"""%%%%%% $$$%%%"""%%%111---...)))(((%%%:::***'''"""!!!"""$$$ ,,,[[[""" $$$ %%%&&&(((///,,,KKKKKK777///111555AAAFFFEEEHHHHHH\\\ vvvuuu -\\\777'''&&&***)))111:::<<<@@@111---333333555;;;>>>???===...///777111000BBBHHH777>>>...777<<<@@@CCCcccSSSZZZ```jjjhhhvvvppppppbbbUUUVVV -oooiiieeecccvvvnnnuuuWWWTTTAAA444AAASSSVVVdddRRRTTTiiijjj{{{ttt~~~rrriiieeemmmeeehhhkkkffffffXXXTTTsss[[[UUUXXX^^^YYYTTTKKKOOO^^^\\\ZZZYYYSSSSSSQQQMMMWWWHHHJJJkkkeeeeee\\\RRRNNNXXXXXXTTTNNNKKKOOOIIIMMMFFFGGGFFFGGGMMMhhhZZZ^^^qqqjjj```bbbaaagggfffaaaVVVSSSUUURRRLLL???===888888::::::JJJ;;;888===;;;555---,,,...333444333///...333222///---:::(((***+++...***+++)))sssHHH((('''$$$%%%&&&&&&,,,###'''""" $$$!!!###%%%''''''BBB===XXX===+++111'''%%%,,,***$$$ ###!!!(((YYY%%% ###&&&''':::CCC222666666888???zzzSSSMMMOOOYYY~~~oooppprrrvvviii<<<,,,***///(((!!!333000222444333---666444777<<<<<>>IIILLLRRRLLLYYYiiiuuuddddddppphhhWWWaaaYYY222222+++...&&&&&&...111///000444666888;;;EEE999555CCC)))222;;;BBB:::555111...666:::===GGGVVVUUUSSSjjjYYYcccwwwtttpppoooppptttVVVNNN___XXXkkkbbb\\\~~~[[[XXXdddIIIhhhjjjpppeee^^^YYYLLLJJJFFFKKKiiieeejjjmmmfffYYY___pppssssssiiinnnkkkmmm =qqqiiilll___YYYUUUIIIFFFHHHNNNfffgggVVVJJJDDDCCCBBB===VVVKKKOOOOOOIIIOOOPPPRRRUUUNNNTTTZZZTTT[[[YYYQQQPPPKKKKKKCCCBBB:::JJJRRRPPPPPPXXX]]]]]]___qqqeee\\\YYY\\\XXXKKKAAABBB>>>AAA[[[444:::777:::222222CCCDDDLLLGGGLLL;;;888444333---(((+++333444888000((()))***---)))++++++'''&&&'''&&&'''OOO)))$$$"""'''&&&&&&%%%%%%###!!! """******///QQQQQQ///111(((000555BBB+++222"""### $$$&&&###### '''000'''...@@@@@@EEEMMMFFFCCCJJJ\\\QQQHHHLLLXXXggguuuhhh^^^QQQdddXXX999&&&$$$"""*********VVV444:::'''&&&...111777111888555AAA555111333666888???222444444:::>>>CCCVVVZZZXXX???JJJXXX```pppnnnyyybbbYYYUUUaaaSSS\\\gggggg[[[nnnKKKQQQKKK]]]aaafffeee\\\YYYfff@@@LLLKKKLLLsssXXX[[[aaaYYY\\\bbbeeelllrrrpppoooqqq ~~~{{{]]]bbb[[[[[[SSSRRRJJJQQQKKKQQQTTTQQQZZZGGGEEEIIIDDDMMMZZZUUUXXXZZZTTTTTTccc]]]bbb\\\XXXddd___XXXUUUOOOOOOVVVVVV```WWWNNNJJJQQQ\\\bbbdddhhhwwwrrrnnnbbbWWWSSSIII@@@>>>===:::888AAA888111888666333888AAAUUU>>>BBB<<>>000222######"""!!!###(((,,,***...000CCC@@@LLLOOOJJJPPPSSS^^^DDDFFFVVVsssTTTNNNUUUDDDEEEGGG<<>>HHHNNNPPPHHHJJJFFFNNN]]]dddfffjjjnnngggPPPZZZYYY```WWW___bbb___ddd___]]]VVVmmmrrrhhhVVVWWWOOOJJJ???TTTKKK???MMMRRRWWW___RRRVVVYYYcccdddaaaaaaooo -hhhlllZZZPPPPPPSSSPPPFFFOOOSSSMMMMMMMMMQQQEEEDDDVVVNNNOOORRRPPPSSSYYYYYYUUU]]]```ccccccjjj[[[]]]YYY^^^eeeRRRVVVdddnnnddd]]]PPPRRRiii```]]]aaammmdddiiiVVVSSSFFFIII;;;===999444555OOO666///888333000888]]]III@@@PPPNNNDDD:::555000888---))))))......,,,...&&&###)))(((''',,,'''###$$$!!!!!!$$$ )))%%%)))&&&%%%%%%"""$$$&&&###...///111111---)))***666333111333555[[[000$$$!!!!!!%%%!!!111######+++))),,,+++(((+++111JJJ@@@CCCZZZGGGTTTXXXQQQKKKNNNOOOWWWfffhhhSSSCCCGGGKKK??????888666???555QQQ(((---444222000666///111999000333222***---000:::>>>555:::333CCCAAA>>>KKKHHHNNNGGGIIIDDDPPPmmmlllbbbfffiiigggcccTTTWWWVVVYYYWWWXXXiii|||iiieeecccddd~~~^^^FFFrrrkkk///@@@@@@TTTWWWYYYXXXkkk```RRR___^^^bbb```dddlllttttttnnn```ZZZEEELLLOOOSSSBBBPPPmmmlllSSSLLLBBBFFFKKKVVV^^^[[[WWWRRRggg\\\aaa[[[```[[[ccceee___YYYWWWjjjzzzlllYYY^^^eeemmmyyytttVVVjjjggg\\\\\\aaaWWWRRRIIIJJJEEEEEEEEE???444------,,,+++444>>>222444555333333>>>555FFFBBB777@@@]]]555555///111...---+++///'''$$$%%%'''&&&''')))%%%'''$$$$$$"""&&&$$$''''''+++'''---***###'''&&&///FFF888CCC...222666999999===>>>000&&&$$$$$$$$$))),,,%%%''' &&&111)))### $$$%%%)))$$$))))))000???111XXXBBBKKKLLLUUUUUU^^^FFF???```kkkWWWTTTQQQNNNOOOEEEQQQAAAFFFMMMCCC"""###...000,,,***000)))///)))///,,,333...000333999222999KKKLLLdddCCCBBBTTTSSSGGGCCC>>>LLLdddmmm]]]eeegggjjjooo```PPP@@@BBBBBBPPPbbbppppppkkkrrrqqq[[[UUU\\\YYYrrrYYYAAAEEE888XXXhhhJJJEEEUUUiii]]]TTTXXXiii]]]ddddddvvvppp}}}sssiiioooSSSCCCMMMPPPWWWHHH}}}SSSfffXXXTTTQQQTTTPPPTTTjjjjjjwwwdddiiihhhiiiTTTmmm\\\mmmdddeeebbbvvvyyyjjj^^^vvvqqqjjjiiidddiiiiiigggVVVPPPCCCEEEAAAIIIJJJMMMQQQDDD222222...111......777:::777333999>>>777999333===999;;;111666111000*********...&&&***333((()))'''&&&$$$ ######$$$!!!###'''+++((()))&&&$$$&&&$$$!!!###***NNN@@@999222@@@---OOO@@@......''''''333---### &&&$$$:::999===!!!+++ $$$:::888%%%&&&---333BBB^^^222<<>>FFF???III[[[YYYUUU\\\VVVIIIGGGKKKNNNXXXRRRdddiiijjjdddSSSPPPRRRTTT___QQQ\\\TTTQQQXXXWWWUUUVVVWWWWWWWWW```^^^bbb]]]XXXZZZeee``````hhhfffcccooo}}}xxxvvvrrrsss|||qqqtttuuusssmmmcccdddKKKMMMTTTIIIIIIHHH___fffTTTEEE333111222444777222777:::555444,,,999;;;999:::000111999000,,,...---***;;;...***"""###+++)))---)))###%%%%%%(((%%%'''***)))+++&&&%%%""" ###""""""!!!>>>((())),,,***,,,444&&&---,,,===---===KKK"""%%%!!!'''+++ ))))))***&&&))),,,222888;;;===;;;IIILLLLLLJJJTTTSSSPPP[[[VVVFFFMMM\\\QQQTTTOOOSSSDDD@@@===::::::III111111(((!!!&&&///+++,,,---444222666222000222111000333111111555222999AAACCCKKKIII]]]444444999FFFOOO^^^lllZZZZZZRRRKKK<<>>///KKK[[[ggguuuYYY\\\bbb___UUUMMMHHH@@@ ===FFFSSS[[[UUUYYYQQQ???JJJIIIOOOOOOQQQSSSQQQ^^^gggYYYXXXRRRVVVSSSOOOSSSSSS^^^^^^```]]]\\\bbb^^^\\\YYY^^^^^^ZZZZZZ[[[```cccaaadddmmmgggjjjooouuuuuuzzzyyyyyyqqqnnnsss}}}rrrkkknnn]]]PPPLLLJJJKKKLLLHHHPPPJJJDDD999111444AAA777BBB555555444222333444777999===777333222444333...222555,,,000333)))+++$$$&&&&&&%%%===,,,&&&''')))###)))+++***///%%%%%%######'''333&&&""" '''000222&&&...---)))%%%,,,///"""NNN@@@""" """$$$### 888&&&(((%%%)))===>>>>>>AAAGGGMMMGGGUUUVVVNNNPPPSSSHHHiiiKKKHHHTTTOOOVVVdddTTT===:::;;;;;;;;;GGG777777HHH&&&###!!!$$$"""...000666333222222222222111222111222333,,,999FFF;;;<<>>===[[[CCC555555888777111444CCC;;;>>>===888999333444CCCccc{{{::::::JJJ***,,,$$$+++(((""")))((("""&&&&&&###(((///%%%)))'''$$$((('''+++,,,(((<<<)))***888222'''***'''&&&,,,%%%000444'''"""%%%(((+++ ######"""!!!$$$"""!!!"""###%%%$$$)))999===DDD;;;GGGFFFSSSTTTWWWKKKMMMTTTRRRPPPPPPIIITTTLLLLLLJJJDDD===;;;GGG===;;;BBBwwwUUU***###...$$$(((,,,222...555444333444>>>KKK555555>>>555333999;;;===NNNCCC444333***999555333;;;777>>>GGGFFFPPPiiiVVVTTThhh@@@NNNGGGUUUUUUVVVQQQPPPCCCEEEGGGTTTXXXXXXVVVPPPSSSNNNMMM```>>>999>>>KKKbbbppp|||'\\\HHHdddYYYWWWVVVOOOSSSddduuunnnXXXcccddddddgggccccccbbb\\\aaa______UUUaaaaaa___```ddd```\\\uuuuuukkkeeeeeesssrrreeeddddddjjjhhhgggkkkfff]]]QQQMMMaaaPPPTTTkkkCCC888888EEE===???III>>>555999555///777:::555HHHEEEIII;;;999===555444000555///---000)))''',,,***+++'''222+++(((&&&%%%$$$)))jjj%%%)))+++(((((($$$)))''')))???***...***%%%''')))'''&&&(((''',,,333 %%%888&&&$$$###!!!  ***###((($$$%%%000XXX@@@333KKK@@@IIIAAAMMMHHHMMM]]]VVVXXXNNNKKKVVVAAA@@@@@@@@@DDD===333333<<>>JJJgggVVV999:::777555333333@@@444222BBBCCCFFFHHHAAA@@@FFF///...---222222,,,+++&&&"""%%%)))%%%,,,)))$$$"""###$$$$$$###(((///(((###$$$''''''&&&&&&'''+++---***,,,''')))222$$$!!!###'''###!!!+++$$$ $$$%%% ,,,%%%(((***'''+++(((--->>>EEEBBBRRR666===000;;;IIIXXXFFFNNNPPPPPPDDDHHHBBBCCCLLLCCC===;;;<<<888???PPP===###'''((($$$%%%,,,KKK///)))%%%---...111222111...+++---111888444333vvvPPP===HHHEEE<<>>999EEEBBB:::999>>>=========bbbAAAEEE<<<444333111+++//////===,,,///&&&$$$***+++%%%)))(((###!!!  '''+++>>>000$$$)))''''''&&&'''***---+++######(((&&&###"""!!!(((((()))"""!!!!!!""""""!!! !!! $$$""" """%%%)))***000888:::EEE===444555222555EEEIIINNNHHHNNNJJJVVVCCCBBB>>>EEECCCEEE:::@@@===GGGJJJ333,,,(((###%%%...,,,%%%...&&&''')))---***)))333222)))%%%---888333,,,222III???CCCJJJ888;;;ddd;;;:::111222666GGGGGGIIIJJJKKKVVVgggXXXWWWYYYSSSPPPQQQNNN___]]][[[qqqtttuuuddd[[[VVVTTTEEEDDDDDDHHHUUUOOOlll " {{{ccckkkUUU^^^ooo```]]]YYYbbbfffgggmmmhhhgggqqq mmm^^^^^^ZZZ]]]hhhiiipppmmm}}}eeecccmmmaaaeeeaaafff___fffcccYYYPPPVVVRRRHHHNNNLLLRRRNNNQQQFFFFFFFFFIIIDDDGGGGGGxxxwwwhhhbbb___[[[EEE\\\zzz@@@@@@<<<>>><<<:::;;;JJJ555//////---555444///...---444,,,222(((%%%$$$'''"""!!!!!!"""!!!""",,,******444&&&(((%%%...---777***,,,***$$$&&&$$$&&&&&&&&&###$$$000((($$$%%%!!!&&&%%%### $$$555&&&@@@999"""'''###'''---///111===777111444999999@@@JJJIIISSSRRRJJJHHHZZZBBBIIIAAACCC???CCC:::>>>999===333...---///,,, &&&!!!###'''###$$$'''***)))///666...''''''<<>>AAAAAAAAAEEECCCMMMWWW~~~UUUEEEEEE<<<>>>666999777<<<;;;IIIDDD444111111111555111///;;;///;;;,,,$$$!!! !!! &&&,,,111222555---<<<,,,***))),,,???---((('''###000&&&***$$$%%%$$$%%%...???((("""&&&777$$$&&& ###((($$$&&&'''***,,,...444???555LLL@@@===:::OOOOOOKKKMMMMMMKKKDDDCCCNNNGGGCCC>>>JJJIII999888AAA555111777777```...+++%%%###$$$###$$$%%%(((:::)))///...###)))+++<<>>444FFF>>>999???;;;:::888;;;,,,DDDRRRIIINNNGGGUUUVVV___YYY___NNNXXX[[[MMMWWWZZZXXXbbbaaa\\\___LLLUUU^^^TTT```iiicccaaagggsssXXXbbbiiirrrjjj\\\nnndddwwwyyylllbbb[[[KKKRRRYYYhhh```hhhmmmttt\\\[[[nnnlllkkkkkksssnnngggTTTZZZQQQLLLUUUSSSVVVgggKKKJJJSSSLLLNNNNNNKKKIIIFFF@@@XXXGGGBBBFFFEEEFFF>>>DDDXXXDDD===ccctttOOOGGG@@@???999======>>>IIIAAAIIIDDD===111:::888///222444EEE******+++"""((("""&&&%%%(((///333+++222222GGG---))),,,)))***+++&&&+++%%%)))''')))$$$$$$!!!)))111>>>###%%% !!! ###!!!$$$###---111)))888FFF@@@DDDNNNFFFFFFEEEFFFXXXEEEPPPMMMaaaZZZIIICCCFFFHHHDDDCCC<<<>>>LLL888555FFF222...222666>>>&&&'''###))))))###%%%///,,,444111)))$$$(((GGG777???@@@===999555DDDAAA777???HHHOOOBBB999IIIDDD999@@@KKKAAARRR[[[gggTTTOOOMMMHHH???IIIQQQ^^^^^^^^^[[[___]]]LLLSSSNNNTTTaaaRRR]]]TTTbbbmmmyyyggg^^^KKKVVVrrrpppMMMVVVJJJBBBVVVFFFJJJNNNWWW___]]]```^^^aaadddWWWWWWVVVkkkgggccciiiccc```bbb```QQQQQQJJJGGGGGGEEEEEEKKKJJJPPPLLLMMMIIIFFFCCC:::>>>FFFJJJOOOPPP^^^VVVOOOFFFFFFFFFEEE555@@@IIIDDD@@@GGG<<<===999AAAAAAGGGEEEttt===AAA777666___[[[DDD)))***+++'''$$$ +++555%%%***"""(((,,,bbb111---)))///---,,,)))'''---...... &&&###(((111(((&&&###(((!!!"""&&&!!!'''!!!""" %%%*** ,,,...)))444333<<>>EEE333<<<,,,'''***$$$%%%###+++111...'''+++000???666666<<<===777<<<@@@;;;>>>DDDDDD<<<===DDD///555666HHHEEEDDDFFFIIIGGGTTT[[[EEEDDD===LLLPPPNNNOOOOOORRROOORRRIIIHHHNNNRRRJJJRRR``````QQQmmmaaaOOOXXXccc~~~~~~sssXXXEEEJJJ???NNNLLLVVVGGGQQQQQQZZZZZZXXX[[[qqqccc[[[ZZZ___dddWWWVVVQQQNNNRRRJJJHHHCCCIIIJJJFFFBBBBBBAAAFFFEEETTTNNNDDDFFFNNN444EEERRR___~~~mmmXXXOOOXXXJJJLLL???DDDBBBOOO@@@EEEEEEFFF@@@888AAALLL>>>???GGGnnnTTT;;;666===222***......***&&&&&& ### !!!<<<&&&!!!***JJJ...555+++(((((('''((('''$$$000AAA((('''444222ccc111+++,,,---,,,'''---"""%%%&&&333###+++!!!---111222!!!###&&&%%%$$$999>>>:::NNNYYYSSSDDD:::LLLTTTIIIOOOIIIHHHJJJPPPFFFQQQNNNMMMDDD>>>BBB>>>999///DDD///444%%%///,,,///***!!!"""%%%...,,,'''))),,,444333555<<<@@@;;;777:::AAADDDBBBAAA;;;^^^ZZZ999GGG>>>BBBGGGEEEUUUKKKGGGSSSPPPZZZKKKMMMUUU===IIIJJJKKKPPPPPPSSSUUUNNNJJJTTTSSSZZZZZZ]]][[[SSSJJJNNNddduuurrrvvvbbbZZZRRRXXXGGGUUU[[[OOOTTTEEEAAAaaabbbmmm^^^___hhhddd[[[WWWRRRTTTQQQKKKJJJEEEFFFBBB===@@@JJJBBBCCCBBBAAA???SSS===CCCJJJEEE>>>444PPPccc'nnnWWWNNNHHH>>>BBBCCCFFF???BBBEEEKKK888CCCGGG;;;DDDQQQ:::999cccQQQBBBHHHCCC000///***+++...&&&&&&!!!### 000888999222***((($$$)))...'''&&&&&&---''')))***---777+++---222)))666WWWooo333,,,%%%...+++%%%'''!!! !!!!!!### >>>,,, (((******"""!!!!!!***++++++333666DDDOOOOOOFFF???FFFPPPNNNPPPPPPXXXQQQIIILLLYYYGGGMMMCCCCCCJJJ;;;888444...(((333)))111999***---$$$ &&&...''')))///555666666:::@@@:::555:::888>>>===@@@===EEEQQQ]]]999222999CCCEEE@@@MMMHHHKKKNNNUUUFFFIIIAAA999///999AAAIIIIIIMMMQQQKKKKKKPPPfffUUUGGGhhhSSSGGGEEEKKKEEE===NNNiiieee\\\gggdddYYYRRRPPPWWWUUUOOOLLLHHHHHHRRRRRRUUU\\\ggg]]]]]]\\\PPPJJJIIIDDD??????QQQTTT666<<<@@@<<>>===:::;;;<<>>???AAA777333XXX111***000EEE---(((,,,&&&((("""(((III---)))''')))&&& ###((((((&&&&&&+++&&&((((((,,,&&&555///,,,((((((000666444000+++((($$$%%%$$$ %%%!!!$$$$$$ '''###"""###$$$(((111,,,000999AAAAAA@@@MMMFFFMMMKKKHHHHHHMMMMMM[[[ZZZPPPwww PPPAAA:::>>>:::CCC>>>///000***&&&///...,,,++++++""" ---******000BBB777777888;;;;;;888222///;;;???999@@@IIIJJJkkk===)))***555EEECCC@@@KKKDDDGGGVVVJJJ@@@999333222777AAA???DDDEEEMMMNNNMMMMMMPPPLLLNNN[[[OOOQQQjjjDDD777@@@OOOFFFFFFJJJQQQQQQOOO[[[UUUJJJPPPKKKQQQNNNDDDDDD===LLLQQQVVVSSSSSSfffMMM???BBB???888CCC777???999777444888999AAA;;;CCC;;;:::===???:::;;;222GGGMMM```HHHWWW___JJJ???===EEE@@@444VVV@@@000000222555333<<>>;;;IIIOOOGGGIIIXXXHHHNNNIIIMMMOOOLLLBBBGGGUUUQQQKKKEEE>>>FFFFFF???888222///111,,,111666;;;;;;111...&&&$$$!!!((())),,,???;;;EEE777666777<<<;;;666UUU///:::EEEMMMCCCVVVIIIaaa???000%%%000OOOSSSKKKFFFHHHIIIFFFMMMZZZ???222---111@@@HHHNNNAAA999@@@PPPVVVCCCJJJIII???FFFJJJUUUGGG???===555666333EEEDDDFFFPPPWWW>>>AAA>>>BBBAAAAAAGGGEEEGGGNNN```PPPPPPZZZ\\\EEE===>>>======>>>888???777111777999444>>>AAA:::NNN@@@444:::>>><<<<<>>@@@OOOCCC...000***###222111222 """###"""***(((""""""''')))&&&''''''$$$'''+++...===HHHIIICCCHHHCCC???LLLOOOLLLLLLPPP@@@FFFWWWeeeLLLDDDBBBSSSPPPHHH>>>;;;999333333...AAAOOOmmm:::***%%% ###...111MMMRRR@@@KKKUUU???555:::>>>777@@@---,,,TTTOOOMMMGGG???>>>///&&&...999CCCFFFMMMFFFUUUIIIVVVhhhBBB444666:::AAA>>>===888LLLmmm3WWW<<<999===888@@@@@@EEECCC;;;CCC<<<===???AAA???NNN@@@EEE>>>999:::000777DDD<<<===CCCFFF>>><<>>:::666<<<======777222333999777888>>>:::III888UUUAAAIII???>>>???===BBBMMMMMM```KKKMMMAAAAAAHHH{{{@@@999999777555===---111222333000,,,------,,,,,,CCC,,,KKK444???555$$$###### """'''!!!""""""'''$$$(((+++###!!!###444...+++)))(((...777BBB333///444BBB777222666555+++---,,,VVV[[[...&&&$$$###!!!"""  $$$===$$$$$$***"""%%%"""$$$###,,,,,,///FFFBBB<<>>......+++,,,)))999QQQ@@@@@@]]]iiiVVV///444BBBAAA>>><<<777HHH^^^\\\eeeIII@@@AAA444 (((111===CCCZZZHHHJJJ```]]]WWWHHH;;;888<<>><<<<<>><<>>777999888III:::999666888666@@@777<<>>;;;:::@@@EEEUUU333000///***...333,,,HHH666333333///999:::HHH===...888$$$)))"""!!!""""""000""""""<<<\\\%%%%%%###///000+++'''+++444444:::DDD>>>:::iiiWWW@@@===666...,,,333111((()))///'''))) '''"""%%%!!!&&&$$$///""" %%%###""""""&&&%%%///...444PPP;;;888BBBJJJBBB;;;:::GGGBBBFFFDDDDDDFFFCCCLLLCCC???III@@@GGGbbbsssDDD@@@NNN999333:::CCC;;;000AAA555777,,, $$$:::GGG999===999777OOO333666:::HHH===:::666:::CCCFFFCCCBBB===EEECCC%%%'''666<<>>NNNIIINNNEEEAAAFFF@@@JJJBBBFFF???ZZZ[[[aaaFFFGGGYYYLLLSSS???999555888EEE666111000+++000888888666333......---111@@@777333333111&&&&&&### ###"""###&&&;;;777222&&&//////111(((,,,000444KKKMMM888???oooiii777???PPP>>>;;;FFF111***---...&&&)))""" )))CCC999EEE'''"""!!!"""!!!***%%%"""!!!%%%$$$222...666666333888>>>^^^MMM===NNN666;;;AAADDD@@@<<>>999;;;888222333---...###...666777888888111222888222111333WWW===:::888SSSSSSBBBYYYSSSIII777222$$$%%%777DDDEEEFFF:::CCCUUUMMMfffHHH===999===EEEKKKAAA444222===>>>444333000,,,<<>>000JJJ:::///444...000555...,,,'''SSS111555777000******$$$!!!!!!'''((((((%%%''')))(((------------111(((444888333777000---;;;<<<```BBB888///KKK111,,,000;;;AAA------&&&((( ######$$$###,,,'''###'''(((,,,"""!!!&&&%%%)))'''&&&(((999??????>>>???EEEiii555888>>>DDD<<<<<<===<<>>PPP333999///777666222000777GGGUUU======000:::)))...///'''222***111%%%,,,###&&&$$$"""!!!"""((( ''')))###$$$ $$$888///(((555@@@KKK666888BBBPPP;;;777999999;;;>>>BBB:::BBBQQQWWWIIINNNIIIQQQ>>>:::KKKDDDFFFMMM777444555:::222888,,,$$$###%%%***---111444@@@:::555AAA===555999777===DDD;;;888999OOOUUUzzzCCC111******'''333:::III[[[SSS>>>SSSqqqKKKLLL999111333//////<<<;;;111999BBB555;;;///)))555@@@ }}}BBB===---,,,///666,,,111000555666222666111111777555333888;;;555999;;;<<<===222666333222555666<<>>OOOCCC<<<<<>>888>>>777IIIccc~~~WWWBBB>>>GGGAAACCCDDDAAAFFFFFFNNNFFFFFF???:::222;;;...$$$'''###'''///777999;;;888AAADDD888::::::CCC===...111111///777CCCLLL000???...***+++---;;;AAAIII999===UUU```HHHRRR@@@///333---333000888555444555333999777111888<<>>888999111777999222999//////111111///---555===333;;;:::444888:::333;;;777333666111...000666444777333999:::444555:::222:::AAAEEESSS>>>???@@@@@@999<<<<<<===DDD@@@;;;999888777CCC;;;999FFFOOOHHH888777...---,,,---+++,,,)))888777333333999///444000PPP<<<000888000999777:::DDDbbb<<>>,,,888888:::???888===999888777>>>222666111333222222@@@LLLXXX -\\\FFFDDDFFFDDD@@@===;;;444BBBKKKYYYJJJ888GGGbbb555---000%%%$$$&&&///222EEE999222444HHHMMM<<<888888444???===:::OOO444CCC666333,,,+++'''***@@@CCCFFF777888>>>BBBSSSHHH<<<:::333222777888:::444000888444555;;;===@@@iiilllSSS<<<555999222...---...000///,,,...111222222,,,222666999555<<<444333444111===444555000111111222444000666===^^^RRR;;;<<>><<<,,,...111222111///555XXXYYYcccIIIGGGQQQQQQRRRCCC:::>>><<<>>>bbbSSSJJJ:::555***...333555222***$$$(((%%%111333...111...333===GGGDDD===<<<888777===000777666111>>>333,,,***,,,AAACCC999BBB:::;;;:::JJJpppNNN;;;333555999222777222:::;;;---000555333444:::EEEDDDKKKVVV///222555---222FFF222111---333333///...BBB555:::555---111666======777666333444000333333///555===888===EEECCC;;;:::222;;;:::???CCCCCC<<>>DDD|||===777///111+++777===&&&*********666***###...%%%)))"""%%%]]]###!!! ###KKK444222>>>>>>$$$<<<<<>>??????BBB777<<<888222999333555...///+++999yyyCCCJJJQQQXXXJJJBBBEEEMMMNNNAAA???ooolllWWWOOO666+++333---333:::000...+++'''...111111,,,---000===@@@MMM???BBBDDDAAAFFF555;;;666BBBKKK>>>@@@333GGGIII555***...000666<<>>000BBB333000,,,///,,,444000333111000555333666666888000000111===LLLXXXEEE===555444///111222888555>>>888MMMMMM>>>===>>><<<888;;;555999>>>:::@@@999999444777FFF...---+++555777???RRR333777444QQQ;;;:::@@@aaa;;;===555777888ggg777FFF^^^@@@777ZZZOOOCCCAAA===<<<999999DDD???===555444OOOUUU<<<555000***(((&&&888444999...555222888333...111...111888000+++<<<...000OOOHHH###333,,, )))$$$///@@@+++ """>>>UUU555:::///)))((((((333++++++555777///...333000000///333///+++111DDDIIIHHHJJJTTTkkkFFFIII___IIILLLHHH]]]CCC:::222***,,,,,,222???999222)))((('''+++...000//////666555<<>>DDD@@@OOO>>>BBBXXX@@@555999888+++777333888888>>>555AAA:::;;;999***,,,???===888222NNN???>>>888>>>777@@@kkkWWWDDD@@@===<<>>AAA???>>><<<444666;;;444;;;888777888777<<>>000777555000LLL@@@222---///333===999222000***444===LLLHHHddd000((('''000!!!$$$(((888&&&%%%###"""&&&&&&)))000***+++000,,,333444...111222444***)))///FFFIIIBBBBBBCCC@@@EEEBBBGGGBBBJJJNNNBBBGGGFFF???999111>>>///BBB333III:::555111((()))(((+++444///CCC222666HHH@@@FFFBBB;;;>>>GGG>>>JJJ===PPPNNNKKK:::999LLLRRR888111'''...===EEE;;;GGG@@@999???:::::::::999===888???MMMAAA333999555999\\\KKK===>>><<<666888///888>>>999666444555;;;666333777<<<222---222222:::@@@<<>>IIIRRRKKK:::???666000666222---222<<<666444000))),,,)))'''111===???(((...000222...///???JJJ888999@@@===222+++,,,---888000---'''AAA,,,AAAWWW;;;;;;###'''%%% !!!!!!"""]]]***'''$$$)))(((,,,###&&&------222HHH111???222444---===222@@@***444>>>>>>???<<>>999<<<<<<666999@@@>>>BBBLLL>>>@@@???___===>>>:::888>>>===666999999:::666:::BBB???333>>>666222777222222:::444<<>>000---111555666>>>nnnKKK888GGGDDD;;;999>>>===000222777000222666///@@@666DDD333777<<<;;;333HHH666)))...GGG---444999222888...222222///222:::111444===,,,777999333<<<;;;MMM444333999666---DDD;;;:::///&&&(((''')))))))))((()))---111000---000999@@@FFF111111000III---***///666///'''555<<<>>>>>>~~~\\\+++((("""!!!!!!"""&&&===...&&&$$$$$$000&&&000333///---111000...///222333******(((---666===MMM===<<>>BBBNNNAAAPPP888000555NNN666333222((('''###"""+++///333FFF===999<<<:::<<>>@@@999CCC:::CCC===>>>===AAAFFFGGGBBBAAAOOOGGGJJJ@@@FFF===???MMM999555555<<>>:::@@@666666===888999999666777>>>@@@888:::222444111666BBBDDDJJJ777666nnnccc>>>555>>>???666555QQQqqqQQQ>>>333CCC222999333666999KKK222999555555222111222...222(((%%%&&&'''///AAA666BBBAAA<<>>FFFRRROOOZZZJJJkkkQQQMMMIIIXXXIIIDDD...111555666444111$$$***%%%!!!...+++000222555666444NNN555999CCCEEE@@@999;;;JJJ===BBBMMM...&&&000,,,000222...)))555111111444555333===DDD999NNN:::>>>:::<<<@@@JJJ===>>>XXXFFFDDDDDDEEEKKKAAA>>>@@@DDD<<<;;;;;;KKKDDDDDD======QQQ:::<<>>@@@888CCC@@@:::666888,,,'''(((,,,---IIIBBB)))///***...<<<666///>>>BBB444888777000)))---111,,,:::000+++--->>>222///GGG""""""$$$"""DDD%%%$$$"""%%%&&&&&&***:::***444555BBB...222000000***,,,333777<<<:::???FFF@@@GGGUUUYYYhhhXXXKKK[[[UUUsssOOOFFF@@@@@@KKK222<<<888555;;;SSSEEE444888000,,,...222444666777EEEYYYXXXpppnnnGGG===666;;;<<<333444111)))888333:::222///(((---((()))111...000111888888;;;444::::::???JJJ>>>???DDDEEEEEE<<>>>>>888:::@@@FFF;;;<<<>>>888999777PPP444///???KKKGGGBBBEEEDDD555888333???000333777::::::;;;SSSyyyKKK===;;;<<<333444555222222000222:::555---222///...111222---333222,,,444777777(((+++555111FFF333444...222000888:::777222555000,,,---CCC888//////,,,,,,***'''///:::111---,,,CCC,,,333...///,,,<<<^^^ddd000000***######%%% ((($$$ ### &&&&&&%%%""""""(((111...000>>>:::...//////((()))777444888@@@NNNKKKKKKSSS]]]PPPEEEFFFOOOOOO[[[SSSGGGGGGFFFIII___@@@***---...///pppKKKTTT}}}<<<999FFF'''***888:::CCCJJJooo HHH999444111(((---666<<<333999888999]]]111(((...777YYY222555888111000JJJ;;;888777;;;???444777111???:::AAA666???EEERRRFFF>>>:::>>>NNNBBB888>>><<<>>>777III&FFFFFFSSSBBB:::===:::999444999===777777777DDD666FFFAAACCC777@@@@@@888999<<<555000EEE:::555444555;;;___vvvPPP;;;000555333777444---000999---111---555:::222222777222DDD999;;;,,,.........///,,,)))333555===000---///===222...666...///---+++>>>555111***&&&$$$%%%+++'''...000///---,,,333---,,,333)))000<<<:::AAA)))((()))>>>$$$,,, %%%  """777...%%%*** 000000@@@,,,333666444999///)))///111000444:::ZZZQQQfffZZZTTTvvvTTTPPPIIIPPPGGGUUU\\\mmmaaaMMM555(((***...QQQKKKDDD777111@@@???QQQ777222...<<>>888222111JJJBBB======AAA777555555555///111...<<<777999222444111>>>AAA111222444>>>999666555777<<<444666777QQQDDD999<<>>111;;;???>>>444444111777'''&&&---;;;@@@GGG<<>>444>>>AAAOOODDDFFF222555@@@666TTT555>>>///...&&&444,,,000)))666///888222;;;333ZZZ666>>>...222---===111666000///111111111>>>AAA///%%%(((***,,,---222---......)))***666++++++&&&111%%%+++(((.........---FFF(((///,,,)))((((((333000)))###+++"""///***((('''...***)))%%%000===111777...444///---888000CCC///111444<<>>CCCTTTPPPKKKfffNNNFFF999WWW888666222555;;;DDDKKKCCC>>>HHHVVVrrrMMMYYY}}}DDDDDD666mmmRRR:::000111111,,,333666999555222999;;;???===::::::+++'''***///...---000///444555...666444555111111333777444444222///,,,)))KKKMMM888TTTEEECCC@@@666...******'''///222222///,,,,,,+++,,,&&&%%%///FFFnnn???AAA``` -fff666BBBOOO999;;;;;;777777444333333666777^^^ZZZIIIFFF666HHHFFFBBB222,,,>>>000;;;,,,(((+++555111***(((777444---:::111)))444111888===777777===999666333888---******"""###))),,,---+++---(((---+++111)))---666111TTT---'''444444000\\\EEE///,,,///DDD000---***444777///+++""""""!!!$$$;;;666444+++%%%&&&)))555888(((000111,,,,,,,,,///222III111---333000@@@<<>>WWW777JJJ???NNNIIIVVVRRRKKK333DDD???;;;555000111;;;HHHAAA666;;;WWWqqqfffTTT555888333```~~~BBB999...555666444555777000222///>>>CCC999LLL888///---###$$$@@@$$$888(((KKK444000999666555888444666222555444333333111000777999@@@CCCOOO---222555///***+++///---111222000444''''''...((('''///333GGG===EEE}}}~~~oooSSSBBBDDDAAA[[[BBB<<>>@@@JJJGGGLLL>>>OOO999333...444444111,,,HHH[[[333000...///111((()))%%%(((---)))...000888333666///000000111000000@@@NNN@@@EEE888000777888333---222...---)))---++++++***,,,+++(((---BBB111(((((((((***111vvvIZZZ000666:::HHHAAA000111///...)))...///000,,,DDD555...---###$$$%%%ZZZ000&&&***,,,,,,''',,,'''&&&%%%000...LLL000AAA333333333444777555...666===EEEHHHEEE>>>III@@@DDDPPPIIILLLGGGNNNIIIBBB(((555555AAADDDJJJ???AAAKKKUUUnnn```UUUNNNrrr+++333000444%%%''')))***111333<<<...333///+++888666CCCTTThhhHHH...'''///666///+++ (((+++......:::555222000JJJ555222888333,,,888555---222EEE666444666333888===...444(((&&&&&&,,,)))(((+++111&&&///000777222888,,,555...CCCbbbBBB:::DDDIIIKKKCCCCCCFFFBBB555000111***---......000///...---***&&&%%% ###%%%333---+++---777ZZZ333???///333***///555DDD\\\FFF<<<888...,,,000BBB222%%%'''//////777+++&&&(((%%%###"""&&&+++,,,***&&&///***333[[[ttt999>>>000777kkkMMM,,,JJJ>>>;;;,,,...222)))&&&'''666333555$$$%%%(((+++333III000'''666VVV666------000++++++******+++222555///222555444777AAAAAAEEEIIIFFFKKKRRR[[[EEEGGGTTTWWWDDD999LLLGGGFFF^^^XXXGGGAAAJJJdddWWW}}}QQQyyyGGG@@@===666---!!!+++111555555111///;;;///???666>>>uuuJJJOOO444---***''')))555***'''***'''))),,,222444///777HHH777000000111,,,'''999<<>>111;;;;;;DDDiii000******)))((('''&&&+++***)))'''///...555000...+++999///+++000;;;444333BBB===CCC>>>;;;111111000222,,,...,,,---000...444,,,***""" !!!%%%'''***+++***000---;;;000444555333...000111444333444999555111;;;,,,EEE:::&&&###$$$***333,,,***((($$$---"""!!!''')))111BBB///(((...___yyyAAA888111777...---111MMMAAA;;;>>>mmm000//////***......>>>:::!!!!!!&&&(((NNN666333<<<777,,,)))555,,,///***%%%)))EEE%%%''',,,PPP666555222555999444XXXAAA777DDD[[[OOOGGGMMMAAAFFFIII[[[UUU???MMMVVVRRRmmm<<<@@@GGG===HHHEEE>>>___qqq[[[DDD555III '''444000222333111777777555;;;999CCCDDD999///000333---///***<<>>777444999999555///...---,,,111000+++GGG999444@@@"""###)))***---***///EEE555555333ccc---777***)))%%%'''---...+++111...GGG333)))''')))******,,,&&&###)))&&&+++)))***---)))$$$$$$''')))---444KKK///***KKKVVV???:::333777///'''222+++***AAA...222RRR---+++---000'''+++...+++111+++222;;;===<<<111)))+++000,,,...111,,,...///555<<<000++++++&&&++++++&&&'''((($$$""" """######$$$((()))---;;;DDD<<>>III222???>>>;;;;;;===444???((($$$$$$''',,,...DDDVVV+++$$$"""%%%TTTCCCDDD444)))'''&&&---+++'''(((111;;;SSS***(((%%%---BBB???555///777HHHOOO:::;;;999@@@BBBDDDIIIKKKLLLIII\\\UUULLLHHHLLLFFFKKKFFF@@@:::888777HHHjjj0AgggkkkOOOaaaOOOBBB===555888......000222///000777444;;;222''''''999'''))),,,555//////333+++555===PPP###"""===)))222BBBHHH///111???222###(((444222222//////,,,)))###???...$$$%%%))))))***---***)))(((+++***hhh///(((###'''$$$$$$(((//////999>>>222GGG555666[[[EEE222222)))---CCC???PPPFFF===777555...000GGG'''%%%***SSS555333777@@@@@@111HHH---111>>>>>>HHH***&&&111111+++,,,...111,,,;;;///&&&&&&%%%$$$"""###"""&&&&&&"""%%%(((***FFF^^^:::PPPDDDVVV888111GGGCCCQQQ\\\TTT```>>>888LLL((($$$'''...333,,,555***"""888$$$***===555555333(((***)))((()))'''$$$+++999((( ...,,,...***000...:::@@@888555...888AAA===FFFIIINNN[[[MMMGGGEEE```LLLPPPggg___???///CCC777 bbbSSSdddwww;;;111<<>>***+++***000---'''999+++***???<<>>OOO///:::777III===@@@KKKYYYdddOOOFFFbbbKKKOOOIIIIIIAAA333***ccc---888)))JJJLLLDDDRRR\\\CCC888>>>KKKDDD+++222333444//////333999111000(((&&&@@@%%%###%%%+++---'''***!!!RRRVVV,,,$$$$$$222+++333333:::777;;;666...,,,222222777444111111///***+++&&&(((&&&$$$%%%!!!&&&[[[444%%%+++&&&$$$+++***$$$%%%"""///)))+++//////,,,>>>***///)))+++,,,###,,,)))///666888;;;aaadddpppvvv???===BBB......000///111;;;,,,---...222***444111+++111***)))(((]]]111JJJ999111,,,666222)))===+++***---)))((()))///000444111&&&\\\???<<>>OOO///%%%###%%%GGG%%% )))%%%///---***%%%---///---)))%%%'''---SSS:::333""""""$$$ $$$???,,,+++...;;;::::::111444<<>>:::555666555EEE000...666000333QQQIII...///(((444222(((---//////222333***---444222'''%%%"""&&&***//////555444111000333((()))'''$$$!!!))),,,...000AAAQQQDDD<<>>...555FFF>>>RRR>>>FFF@@@BBBOOOOOOGGGEEEEEE;;;PPPFFFRRR666BBB<<>>111,,,***@@@%%%'''&&&***,,,111777...++++++888)))!!!)))___KKKDDDMMM>>>>>>333@@@FFF;;;222111000222UUUTTT555:::333===444666999888111666666333555>>>BBB---%%%&&&&&&,,,...777000///555///CCC...,,,%%% 000222777222GGG>>>FFF777===BBB888777999<<<222+++)))&&&+++---888555qqq222///<<<222---%%%(((---,,,555:::CCC666777999...000000+++///+++,,,...>>>VVVOOOiii@@@555WWWJJJ222///>>>...555))))))>>>===999+++TTT---222MMM'''$$$ """&&&%%%(((%%%JJJ$$$,,,***222222+++***///$$$###%%%&&&$$$%%%"""%%%)))''',,,TTT>>>777444222444;;;<<<222888>>>FFF888<<<<<<<<>><<<999333&&&000,,,%%%,,,///888///777333///***000&&&+++333@@@;;;EEE999666>>>;;;YYYYYY222333;;;666333---555333999AAA;;;???999555<<<444666///888444IIIGGG333111(((......444---...***)))---///111HHH!!!***555111000000666666QQQ===888:::LLL===999AAA333000444------777......,,,)))---,,,+++000//////:::222333000222555999000,,,'''$$$(((///,,,222111222@@@<<>>---555111333@@@;;;:::000mmm???333AAAEEE???666999333@@@111///777===666+++&&&((("""***;;;---FFF KKK111333---000222111BBB---+++...)))111===::::::PPPNNNDDDWWWppp>>>JJJJJJ222999...555///444...DDD;;;WWW___<<<444...'''&&&CCC$$$""" ...%%%!!! (((###)))444:::AAAFFF777...''''''&&&!!!(((###!!!"""$$$///+++***000)))***&&&...444BBB666777111:::333222WWW```>>>777888777;;;AAA???:::>>>EEECCCEEEllluuubbbLLLNNN>>>&&&333CCCPPPdddPPP>>>666+++%%%))),,,---:::555CCC666===)))000333444222222222111---222///(((*********---444333:::555333999>>>999+++&&&111222555333;;;QQQsssYYYJJJ___\\\ZZZCCC@@@AAA>>>666555...222000222222,,,,,,,,,333333222222333...555HHH444YYY111666...444555:::000...111333444BBB]]]777///CCC666444666DDD777444RRR111%%%***$$$(((aaaZZZPPP3OOO///:::'''+++444***444HHH555%%%((((((222888MMM<<<>>><<<555999???***:::222...000(((,,,222ZZZ;;;;;;;;;HHH___HHHHHH888000###%%%$$$ ...%%%&&&###"""&&&!!!&&&KKKUUU333,,,&&&&&&&&&"""$$$$$$(((***555---(((//////333555222666///111555444333;;;===:::111555888555777GGG;;;AAAHHHCCCTTTzzziiiXXXxxx```]]]<<<...000---000666AAA+++JJJ+++'''&&&%%%...BBB@@@RRR===777222666111<<<555666;;;;;;111333---333111222,,,...666000666???III@@@777555888666hhh666;;;;;;@@@LLLYYYYYYxxxlllbbbyyyCCCHHH<<<888333222555333000666RRR,,,222444333000444888@@@<<<222777555>>>DDD===111444@@@...555777444333111AAA666222000666111888777444666111222555$$$%%%&&&///;;;III[[[MMM///444******)))///"""%%%444%%%%%%BBB***,,,'''---SSS777888,,,)))444,,,)))555***)))+++,,,HHHPPP333LLLnnnWWWqqqTTTJJJ333"""###""" ###))),,,///---222$$$'''111!!! $$$$$$!!!'''NNN%%%&&&777...))))))111111///(((---111000888CCCEEE***000555;;;222???333555===???:::@@@___OOO^^^}}}}}}VVVMMMEEE+++---%%%$$$%%%###+++###$$$)))---111...333444777999DDD<<>>222333---777???555<<<...000444777???===@@@444666333<<>>777777222333555333///444...666555000999444>>>GGGBBBLLL999222777:::TTTDDD777///AAA444222000---222CCC888555<<<444222444666,,,777<<>>BBBiiiTTT111444<<>>888;;;BBBNNNttt]]]fffVVVVVVIII:::///777 &&&)))***(((000(((***,,,777666999MMMJJJLLL===:::666555111555222111666222:::888777<<>>333<<<\OOO666888222444777---***---)))///666222333///BBBBBB```HHHCCC>>><<>>222CCC333---111666...))),,,'''$$$"""%%% !!!+++###""""""!!!222###---+++***---:::111///111111777<<<888888***,,,///$$$'''))) (((!!!"""""" """ 333"""...000DDD!!!$$$!!!"""&&&,,,%%%'''"""///(((---!!!"""%%%%%%###222)))---...222===<<<...===555555666000333===666::::::<<<777333JJJ===JJJmmm/uuuTTTBBBCCC???JJJ...---111++++++...+++000...***+++%%%...000222666rrrIIICCC;;;777GGG666333444;;;FFF888222;;;===:::888:::::::::DDD>>>888666;;;BBBAAA333333;;;999666222+++IIIyyyCMMMNNNEEEBBB444NNN777///***,,,---555333777???AAA888BBBHHH666???999>>>AAA===999333GGG999===999222555333;;;<<<<<<@@@>>>RRR===EEE>>>666BBBHHH<<>>AAA{{{AAA;;;:::<<<<<<===999555666EEEGGG===:::EEEUUU999111777777888IIIHHH<<<>>>KKKKKK}}}QQQ666222;;;555999999333EEE333///555999EEEOOOZZZ>>>CCC===???;;;888CCC777:::000777;;;888888111777WWWCCC===EEEYYY<<>>555777<<<888>>>LLLPPPTTT]]]FFF;;;UUUCCCBBB444GGG;;;DDDPPPXXX+++ 222---+++///333......(((777111333...:::444:::<<>>CCC333:::;;;999<<<<<<444JJJ---(((555777^^^AAA@@@555CCC???<<<[[[222666======FFF666222333888333HHH888@@@QQQOOOEEE===<<<===@@@III;;;<<<<<<+++XXXBBBBBB222KKK333===AAALLL===DDDBBB???HHHDDDPPPPPP???HHH<<<;;;@@@888:::888,,,LLL666444222CCC)))+++,,,***,,,"""$$$###"""(((///%%%$$$### !!!111555555((((((((()))"""###%%%######!!! '''###111666%%%$$$$$$777!!!))) """&&&555!!!444$$$###..."""  !!!GGG%%% """!!!%%%%%%111555<<>>EEE>>>OOO@@@>>>DDDAAA;;;===CCCEEEHHHDDD>>>,,,***555---444---444***&&&333)))555///,,,555222444333///III^^^iii;;;@@@[[[BBB???666999>>>888FFF888333:::%%%///111---000999===666444:::000777;;;===@@@555111KKKSSS+++000111555999666MMMNNNMMMAAABBBTTT;;;===III<<<888222000AAARRR===666777@@@AAACCC>>><<<999sssJJJOOOMMMeeeRRRRRR>>>222555===999555---111JJJ;;;///222+++((()))***,,,%%%$$$$$$'''(((...,,,(((SSS""",,, )))######000''''''%%%&&&111 !!!!!!%%% !!!!!!!!!!!!!!!666111NNN777%%%&&&"""$$$######///%%%!!!"""'''''' &&&---444QQQSSSAAA===---555===______111(((***$$$(((,,,555>>>CCCOOOAAASSSHHH???:::888BBB@@@TTTKKKLLLCCCFFF777JJJcccIII;;;111...000555000...888///777BBB---******...999///)))111555>>>AAAMMMJJJ???KKKAAA:::333888777:::IIIOOOZZZCCC***+++///333CCC666555999,,,111...GGGOOOfff999999,,,AAA999((((((444333>>>FFF:::===???CCC666333999TTT@@@>>>777888888???QQQUUUbbbJJJ@@@===III999:::<<>>BBB111:::888444;;;FFF^^^LLL888999AAA333444444000***///,,,,,,===333GGGJJJ444jjj///%%%%%%### ###***&&&%%%%%%(((,,,---&&&$$$######"""777---***!!!!!! """###(((!!! &&&"""### !!!""" ###%%%###111___111***///'''###)))%%%###""""""(((&&&???\\\CCC...WWWhhhBBB]]]444@@@333......555222===AAA***&&&>>>$$$(((:::888```999888MMM///666@@@EEEvvvoooKKKsss}}}ttt@@@@@@888555///222000---XXX<<>>000***777...++++++999@@@555AAA999===///222111777)))+++222333$$$222666DDD@@@555222111888999---555,,,000333222777>>>999999IIIGGG;;;kkkAAA222999;;;LLLKKK>>>@@@444444:::999OOO444HHHbbb999BBB777555>>>999222+++)))+++333***,,,---222,,,///555GGGLLL555&&&###""" $$$***GGG:::+++AAA111AAA&&&$$$$$$%%%%%%;;;---(((000,,,%%%"""###&&&---$$$### """###;;; """ """""""""RRRSSS+++###+++&&&===(((>>>lll---,,,---666___???;;;111...444KKK333444111444888'''$$$&&&###<<<777>>>---666:::------MMMUUU}}}ZZZ\\\qqq|||yyy===888666<<<333//////MMMEEE//////999666;;;:::===777555***,,,000//////111000GGGPPP<<<777777OOOLLL...444333***%%%111222333222---///---000(((,,,777...+++***---***...333---222***///000444333444BBB222///888666333HHHHHHCCC;;;;;;:::PPPEEE000777FFFRRRIIIFFF<<<777333444MMM<<>>...%%% %%%"""jjjooo,,,...///"""555BBB444))),,,...000000///000888......%%%)))!!!***777555000777///+++---LLLDDDOOOSSSYYY|||(^^^888(((%%%------111000,,,888///...FFF:::CCC777,,,000888000---000555///<<<@@@===999777444___\\\000((('''%%%(((,,,%%%---///)));;;...:::000(((+++666---///333222444222...111444444333666222:::555444999======AAA<<>>;;;111111+++888999XXX;;;FFF===???...999///???"""((('''((('''JJJ;;;000bbb^^^===999OOO -___777000&&&%%%,,,BBBwww666555333000$$$JJJ&&&'''---666)))%%%&&&###"""!!!,,,111SSSUUUCCC666---((('''EEEXXX555BBBAAA###%%%!!!!!!&&&333,,,ZZZ ###$$$'''---...)))%%%333555)))***///???SSS:::BBB888666000...$$$ ###,,,000DDDRRR444@@@PPPLLL888HHH>>>pppdddTTTIII888&&&""")))---???III;;;111???+++,,,///111(((***---<<<,,,,,,...666333777------777000444}}}0PPP???+++###### ###LLL777444888444+++***333&&&###...111***333333222666222222444333666444???000999EEE444;;;BBB>>>>>>SSS>>>BBB@@@IIIFFF===222111666@@@555111111===...(((...555---;;;999---&&&(((DDD%%%...999+++%%%'''---===%%%///LLL???:::[[[www???///))),,,'''---555---444HHH...@@@+++'''$$$,,,+++999...'''""";;;%%%'''666888999bbb======ZZZ[[[AAA^^^9+fff333...(((###&&& &&& %%%222 ;;;### <<<"""%%%"""!!!###(((VVV''''''777@@@FFF222???aaa666GGGDDD888,,,"""$$$$$$$$$111,,,111HHHOOO444444KKK777444;;;000)))&&&$$$000---+++555000444+++111)))***222)))******(((///666---///444111III///---,,,***+++III___444,,,)))"""$$$%%%+++888<<<***,,,...***000000)));;;333222333///333;;;222111444333555666444333>>>DDD888]]]DDDJJJ???lll@@@AAA>>>BBB===>>>///333KKK666666:::333222(((%%%666999,,,555---...!!!%%%///HHH...+++'''+++---((($$$%%%,,,'''333IIIFFFLLL000333999111%%%+++%%%222+++(((###%%%&&&111444)))777+++;;;!!!&&&000///(((;;;FFF^^^PPPKKKUUU^^^LLLccc>>&&&"""111@@@'''(((,,,000---)))$$$&&&&&&$$$&&&***&&&***eee===---<<<222777TTT---111---((((((333&&&(((000000&&&---111FFF!!! +++VVV***111>>>>>>>>>PPP~~~{{{hhhkkk]]]___#?|||>>>MMMMMM&&&'''!!!'''111'''!!!###""")))GGG%%%eeeCCC!!! """###(((+++222%%%)))---777\\\ dddJJJGGGhhh>>>OOO+++444%%%!!!&&& &&&###%%%&&&(((111///&&&222>>>777444111...***222999&&&'''###$$$///,,,...+++---(((%%%((()))***'''$$$---(((ddd444555,,,888///000///...%%%### ((()))+++((('''///>>>'''&&&FFF---000((())),,,...666+++---))),,,333---222000JJJ888888666<<>>///CCC999&&&!!!%%%555))),,,'''%%% ,,,;;;333%%%&&&$$$***...(((...///444&&&HHH333:::888%%%"""$$$GGG///000OOO;;;@@@###///  ###888;;;444***###%%%!!!YYYDDD+++###$$$RRRNNNJJJ222WWW,,,CCCGGGAAA%%%***###(((''''''&&&((('''$$$###!!!###&&&!!!!!!((('''***+++,,,+++%%%444((('''&&&(((111888%%%"""(((---+++%%%%%%!!!$$$$$$ ---,,,$$$ ###!!!&&&--- ###%%%%%%$$$&&&$$$&&&%%%+++333>>>LLL...,,,222///,,,(((,,,,,,444EEE???gggRRRaaaOOO444...000666...@@@TTTgggMMMXXX777JJJ333444++++++)))444'''(((+++)))""""""$$$&&&&&&)))*** """ """"""%%%&&&"""000###&&&,,,))):::///777JJJ<<<>>>)))???---***"""$$$---$$$!!!ccc&&&***AAA444888333>>>###&&&(((((($$$@@@///111(((999;;;---???999***"""&&&"""333 bbb!!!"""%%%""" ###GGG222+++!!!"""$$$888OOO...555666$$$333%%%%%%"""&&&222%%%%%%000((()))###)))"""***'''&&&%%%$$$+++,,,'''------(((---***222WWW&&&$$$%%%555'''######$$$&&&""" """ <<<%%%"""!!!&&&$$$$$$"""$$$###((( ###'''(((///000444???JJJCCC------777...---222<<<;;;{{{ -uuuggg???222444+++000CCC***000333111999777>>>###$$$((('''***(((///+++---...""""""""" ###%%%"""!!! '''...$$$888 ######(((111...GGG:::;;;AAA...***$$$ ### ,,,...///###)))***NNN@@@,,,)))&&&...///))))))777000 """)))"""---%%%+++666VVV999+++999%%%!!! MMM///%%%GGGNNN777888%%%"""!!!!!! 111...###,,,%%%%%%'''///666%%%)))%%%$$$%%%%%%((((((((($$$&&&)))+++%%%###+++%%%AAA(((999mmm!!!&&&---((( ###,,,%%%"""$$$ +++!!!$$$ 222,,,"""!!!///&&&###$$$)))>>>GGGGGG\\\111:::0002223336663338887)xxxnnnRRR333...---...(((888...(((&&&%%%...666,,,222<<<,,,222((('''%%% +++$$$!!! %%%"""$$$)))###!!! %%%***(((###***...+++AAARRRAAA???RRRSSS---%%%+++'''$$$"""$$$%%%(((%%%(((***)))222+++++++++111###'''!!!---333;;;888***'''333""";;;000@@@///555!!!'''((( %%%222%%%,,,222&&&)))...444******'''###$$$...)))&&&$$$%%%###&&&&&&+++(((***(((***$$$((((((!!!''')))(((######"""!!! >>> %%% ###!!!!!!%%%""" !!!"""$$$$$$%%%&&&AAA000@@@)))666(((333///'''***...AAA>>>oooccciii<<<***$$$%%%(((333///<<<$$$,,,)))111444111UUUFFF>>>,,,%%%"""+++%%% !!! ###"""$$$###'''+++///(((###777&&&,,,***...XXX:::===777)))$$$<<<*** !!!((($$$ !!!%%%222+++%%%&&&""",,,)))!!!111 ***   '''<<>>\\\zzz -OOO$$$!!!&&&%%%'''$$$...(((&&&...222))))))***%%%&&&000$$$""" $$$%%%&&&$$$(((===(((***"""!!! 999%%%"""!!!  """  """###%%%###'''!!!%%% ###$$$(((%%%$$$<<<&&&######!!!---FFFPPPAAA___MMM~~~,,,'''$$$'''''')))---666)))"""'''...888555AAA???kkk((($$$%%%---&&&''' )))!!!"""%%%###<<<$$$ ###......###!!!"""###;;;(((999...,,,;;;OOO)))%%%###((((((""""""###444111&&&%%%&&&555))),,,$$$!!!"""###!!!""""""AAA BBBBBBDDD222)))000---UUU444```bbbAAA444$$$ !!! ###%%% $$$***---///***((()))000,,,((((((888...((("""&&&""""""'''***+++'''$$$$$$&&&######!!!%%%### !!!"""%%%&&&###!!!!!!""" !!! ...%%%'''LLL///###$$$///'''+++///999SSS888[[[TTTbbb888&&& $$$222>>>DDD&&&***!!!!!! $$$555+++)))KKK......---&&&999###$$$  """444***$$$$$$&&&)))---$$$ &&&%%%555(((***,,,(((!!!!!! )))&&&$$$((("""&&&333000'''%%%'''"""""":::MMM***###+++!!!###...111~~~000BBB9VVV666!!!  <<<***$$$ ###$$$222555555KKK:::AAA@@@777&&&'''&&&)))###"""!!!'''!!!%%%!!!"""))))))!!!###&&&((($$$ !!!!!!###""" %%% &&& +++$$$&&&""" (((+++%%%+++444AAA222===&&&$$$%%%GGGdddpppooo...000###(((FFFXXX000---111"""000:::111$$$"""!!!!!! )))777!!!!!!"""(((#########"""...'''///!!!(((///***(((######!!!''';;;---### &&&((( %%%ZZZ>>>333""")))***222///ooo///666LLLKKK''')))$$$777$$$'''$$$ ###,,,'''***)))000---&&&+++999SSS```LLLZZZ111 ###$$$###'''###!!!+++### $$$666&&&((('''$$$###"""!!!"""!!!$$$ $$$$$$000"""!!! !!!,,, %%%777''')))""" %%%)))HHH###'''+++ """222'''222III((((((YYY$$$%%%!!!---$$$***"""((('''&&&%%%''''''###444!!!'''%%%"""###''''''&&&WWW!!!###(((+++""";;;OOO333)))000***%%%&&&DDD999&&&---SSS***"""&&&999 &&&$$$### $$$ $$$"""###888'''++++++%%%999PPPVVV???AAA !!!"""!!!$$$$$$!!!'''###%%%!!!(((888777<<<%%%%%%###### """ """  )))!!!"""###&&&!!!...&&&))))))===###!!!!!!999'''"""444^^^///555(((%%%%%%&&&""""""### ###"""!!! """"""!!!+++777############$$$ !!!!!!+++'''""" 333$$$ $$$((("""%%%  %%%+++(((###333444LLL[[[;;;???000(((777777 $$$,,,$$$######$$$### %%% )))!!!""""""((((((***+++$$$)))$$$DDD555555666JJJ$$$$$$"""!!!#########"""$$$%%%$$$'''%%%""""""!!!!!!'''!!!!!!$$$ !!!)))""" !!!"""%%%...III ###%%%(((### ((("""(((&&&...***$$$ %%%&&&---"""(((&&&""" !!! ###%%%&&&&&&  """(((!!!...'''"""%%%"""&&&###&&&"""+++"""$$$ \ No newline at end of file diff --git a/data/fits/NGC3344.Color.8.fits b/data/fits/NGC3344.Color.8.fits deleted file mode 100644 index b553a37c8..000000000 --- a/data/fits/NGC3344.Color.8.fits +++ /dev/null @@ -1 +0,0 @@ -SIMPLE = T / file does conform to FITS standard BITPIX = 8 / number of bits per data pixel NAXIS = 3 / number of data axes NAXIS1 = 256 / length of data axis 1 NAXIS2 = 256 / length of data axis 2 NAXIS3 = 4 / length of data axis 3 EXTEND = T / FITS dataset may contain extensions COMMENT FITS (Flexible Image Transport System) format is defined in 'AstronomyCOMMENT and Astrophysics', volume 376, page 359; bibcode: 2001A&A...376..359H PROGRAM = 'PixInsight 1.8.9-2' / Software that created this HDU COMMENT PixInsight Class Library: PCL 2.6.1 COMMENT FITS module version 1.2.0 ROWORDER= 'TOP-DOWN' / Order of pixel rows stored in the image array END (! !!#%*...!! ! !#!(& !!# & #)%$"(##!$(-'6,-&)42,*.0/,-L_3.355]}[HYZL>P-:^9'.,1-1-4.5/60)EK140315800,1133...36:4238:>;8>999737?C<=;9a6<>9794?6<3:>8:2D500.67ASC9?FCB=7;=7537244836>.6=7471*0)'(0,!')$#!%    /"!&# #!!' "%+ 5$$,!) %)!"(& )&%*0*21.#+A+)&(,&.6,)8247TZMnHG500%/23/0162./0-*.1.01/*454339;6558688<65A43654374/:3044.1?>1:=C:5D5HMG8>;9;C<6C72@1+*15&*((,%#&'*%#! ""'%"!")&!#!""$% $!&'", "''&((5(+/*.Q*35%$)/+.,6AR@<:65+BD<1.+-///0+-.0-.,*,.+-2.[E/-.5.32,50/472*441:@97899A?:9<=?B;4::88:@<4://1:4306463<41.;602-?;6DB>4=>7?@48G8463-*--21),-&/'%(#)+' (% #&41 %$%"&'"!7.)'$" !!$'!$0+),)&,0.2*0)*+<7(,4%'+-107LO516?;-=1../116+/-.(**')**-/56120/1++0&-0543224@?7267789775:98?<:;;D@@<>48468664594678:<735=E?4467224;RLEFKL<8V89-4./-/,+A')(-$./()&""!")'%88 !#%0! !1$$#$+%1#!"  )6&+-#(&(.)0?2:9L20B/1'+(21+0-7E;67=:IQ,.*+-)+,**,.,/+)+.590/004100./,44.8,26422FE;8;6>@9<:979=@7?DCOIF6AC8<069?0,.-2&)+/'$1*+0!!#'$!# 1(+)%.)"#/) !'("%(!&$#&"($'9/ -()**+6:GeoB;C0)$&08.1/1+:7226319<3020,,0--*-0141+6201.>W4--/..,31,..2489P9;=69:?<@84469?A;9<>\AY??AAKA>9=?9?2BQBRI?cA:?@99<FA59=?XQ^kfHXIFM``aZocVSLZDDG<0/.42+4/())$#$&+)%) ! " +"9%.;C" ,'!# !&1!#-#;),:,*L'+&,*$);'*.2BaWV3/+(**,-.-2/05.*))38A;:R030.*)//%'-+-.*.348S,0...+(/0,.365114266;7:;:8:LBD>E?:8<=B@EAJ?H@;;>A9:BHB<[zNLNhC6;B;DM@HP[`uv[bEUS;C?HM2375./2%'(%#)36'!!("!! $#" %.'>) $)%#'" '*!!%((BA$)(41*(&%$+9(0C+<0.Psz=3-1.-+)/.3.+:1-380025C?q11.+*,/;/++,C/,+*-78/+(+,3*,-/0036453504356?;>8]=?==?8>DJ@6=CPHU<<@Q:A=XcJKACB?84>RNVUWie]EHO<::5286C01-1(+,***'$%%%(!*!(!G"!#"(Q4K%%!'" !# %,)-3'-$#)).4&,)-(+&&85/1,=325<3OaS44(+-+.G)-2+1-,/+-/-34FW^9008/.+.5,)-1;-//0-,+'++1<*+-0/+3020.252538=>?88?B@?A=Asm=G>=A@9HC?<=<@>:CCDCK98E[FA>Ml::;B>HZLF@EBEAC:=718:5342212+*)&))*%!!&*$ "!"% !**!&$- !# #,%#'5#'$$/-4/5:*RHQOLA2/*)/Ec'")%,(##+(.?J)%))++-)*/&+*&&*,*'+0+--+,:,/.(%189-/-00;-,-*;/*//*((,,-.0441/123668875==F?<>?@<9<>?A9??I?>>.*('*.+&$&-.&((&+"(-)'8'+/9),(1,))**+70*,0010/;)*0,+-274--.8+6-.0+-4/,0)/93,,135/314273435568P7MBFC9<<9::>===;B@8=EBCKCC>>@;:@<9><:73692+.287-,)*,)-.)&)##'#&"##  #%3 /'I &5,##%,).)#-2.0-/012=;;=6<=;8AC@=A>;DEGo?::HDJ:@?:;==<@2-,++%%&-'$$$$/,*+*-+&+,-)*(2'+/?***,;+/1/*0-/)-*(+2400.+135-93/0-010225554122:2<693=455257>65B:;==BD=ABAAJGDD>F>XDJB:<7ABB=E<4204=62///588-**&'('.&&&"%! # "$%,"'!%)"* "*0,@7'# 0.*C''--06-?6BE;B=:CFE@@?B=C922:7.221)1-A3/-&,,/&&1?*+$$&%&!  !*3$!"  ! "#-9""&"*'K$&"#*%#&')%$-:21H;1>EZrkaJB5-+-+'-(+0&%(-,'$##*)'((.'-*&&+*%)+-105+*++,/-13+*2--+,/05-331.-54..@;41.37828<95:<7578;9553=54<2/,0-.13E2.+)'(+)%-3-/-"$$$# "'(A!$!!m%.(=!$ &%#!!%%$$(),'+,9A?989?ưtwLC2)/#.(+/%(&'))0.+%)*+,(P(&&+*(-)()-6:8;0,(+,-,-.-..,,-,2289/43,2557/127165/25108/7::;=68>>C<:6:::899?DD>GA>B<:>@O@CJD@AG<<;^fbjUORDB@A9>78:376;34?-.-')***1.-,+$#)+(( #,*"!!$ !##!*&$,%"#! %#!&%(! )*'&$-329=SpͪaA:2()/4))'%*()*),.+)')()+)*&$))+**.-/+.20/(**,.+.11/0,-/--7212032038B@902547F?92087::?E69<;7496>>=<<>;8E<>E=>@H=@@?FA?GD=EF=>DD?AACMOFE?<>99@NciUMGQMEKHAEO;6>>C\?AK@EFB>>=KDRLUN@DDCFDC;<<9;8AQT_TLSIcI@Q?>>:>76;6;D2*.'01.*-<7=8>F?@B6;H3:?>5<:389>?>C?EIBGEX99<:9=:78;;CDPD@@?=>KGP:=@@GBA=9=?@ABC99>LOZYMGGIGJO;@B;:<7;6621401:4*0/0+-+2*&(&$$!#*,! ,(% &$& (2@"!  $!("! !$ !#/ $&$""#(+'2KutLWaED@2.3*.-2/+,-*(-,-.$+-+-*-,.*&*.0+-/-221631313021-/-234452537453479;H:9557=87<=68;6;@>N=:CKB99?=@8778:=;99F@?FA8>CEF@=CB8A<>:7633101+1/.87>/402()4,,39!"% L.%& ') 4D!%$4(!!-&'!#!#"$"$%)$ ""&'(1;DI@VotO>D920-*'-4.;+),)()+2,/,.40-+.=--00447/1/8.000..02-/336055438<;9253:826:@438E933455;=987?QK;87;95=;;8?<;?@7=9:=@>BBEAK=CBE@>@CEA???BAEAAHEC>:@@B:I=FI`KE=J@LFE>:<;95362(-P=8DB5,.,40)(&)% #19"$!#  #!)'' "1 # ! $,"! "'" #3#%#'# %($&&+/0,I[pf`hQC:>997/*1/2,*,,*-).)*.0/-1,03,,1/1*-,,0*1-=21/-0-.20351126302-/07466:<_:;9?9753,6666C889=:>:94838@?:A>:8<@=:;GA?AIGD>?BADEFHOC=@@@GA@:FTWI]K?E?FG=AD6581213-04:?ZZM9-)&#)%,)* &*&"*. #"? '&%XR3 B$'$ %"$&() #$$!&%'(')%#'&),6XeifydCCG?-+'().+,,0+0:1,/0=,-/-6>:,/-+0555465116/.677148452456H34:8=;?JN6:38374799<>BH;799=749<9L@?=@D;:A:@GQ@?=<==?FB@BHEFB@B>A?:)=/.'&2!!")"B;3!!=,!8!#"" $'"% $'#+*%$&'((+)*@Pb؏pAKIjP4).-,4/1,1),)0@A.0.25B90.572*/544621>664D:7;45C<757:8:;433:;9F@9<8:@OH;972<5646:?:A=@99C<=36H=E?F=:==?><<9?BBAEACEBBDBDLGH@>>B@?BHGFA>DFPABDBGUQOJIHG:;@713/1/4/5w|L;3)+,('##)&&+)$ %(*"#&,$%11'/4p#&#""(/' #!"%&"2(#" "()$%'(-22FUƄWWJ8GC=..,0--*0-**239;1--428A1109793A403376@<<9<@@:C73565154869?HA@F979F341879<9><<8?D:?9D=><>9:;A@@>EFHLJFKCFIGJA@D?FD?CERF@C?DWJHMIHGO^hgMFC=9<566,//22:}͂F1)-(+))%#".'$.#"% "!,%"')!! "&&/&1.*  "#%$"$ *""($"$#,%'$%'%((9=M|}ca:C>=615.31+.5E112.231431..+322=:85759464:8:76Q@5887<>=;:@@AKGJ?YDAAB?ABHDDCPUCKCD?JQKTcDHS^~jLEE@;7;=:6/18/GYI(-)&$-''"&'$5  !#%#""##2)''%0>%& ### !'(%# ("!#.8("$(,9/R\No^bUF<499:23.0390+-3/288:8242/065.471989:66;88KE48?=::<<<8?>_?<@?@=96B5569A78::=C6:RH:?:?7>OWCE>=:@=?@ADID?>B<1.399J=>39/.3//-)25.3016.399765P8;::888;98=59<==;79<=:BND?6;:77::6875::IFDN>::93888>AEKL;?97:===;?C>;?Q?@@NSMYNeF?E@=AGFCCABKEQ?DA@;ASJZ_Gu`EFLC@B975533+0.66)-4/+#'&)&%/+''###---'-+1E6!""## !  $!#$.$%'!"%)!" !"%2!./786@6/22/,-462.2210-8653115A8?;>3:=78=8?=2368<;9:;::<;<93<88?;A;IvJ96A28849<=?Rg@9;==L=@AAEH8?;==9:<;=F=9\VRYKPVCEEAB=BEEEE@GNGIFE<<=FEGd_oJJ;CH<9=8=3/..))-,,.0,+.$#&(&,'$'$#%** (:40*!$(""! ' !! .,#((23)'$$! #"%-0+-0>0D9<;5;@@?<==@=AFE=?;979@><;<<;959=:=B<8C<><>@48:BC7;>DaHF;>@=9;:?E[>[DB^JCEEFDB@A>EEEHEKFK]MQ@<6<==elNdZKD<@>8764,72+,2*+/1/(-&+&(&&)($(&(*0%@-4,)(!)& ((")$/%$'$(" %4+"%(+!#!)%$/(!&*).0,7@PgQD65Q8=C34722:5845259;68:==8H?7;9966;9;>>D@8?A7A>@C@?@>GB?A;=>@C;8F:=8:<<>==<:BE?EB;>;?K@B89=`K?=;><;?>A;@<>@@89:=98@AD=@D>FBHJB?=GJD?AB=A;B>G>N8A7==<>ABDDJ<7::6K:B@>=>AAJEACA@VFCAECHADDEIMEF@=F^[FZBIMFGYAD=:74B956/-.,F(&(()+%)&,+'./$*)'%'-QE'& "( "# %!$'& !%+S%!%511,%'0%*%%'%$&+"$+',,565.;99448/1D74;A6/2597@;36DA@<;?>@8=THA=BEBE=;;;?GGDDIDDDJJCMECF@@<;<:8:8>?9=>LWC@;=IBED<8E?CL=;>?A85;GA9<:B>@@@A>@CDEA?FFGPJF@GCE?DKE>BI:CB?>KIafUEHECDA;JBCFJJEJLD@BD;Hf=>E?<;;=:A>?<@AGB=<@LHBA<=8A@=?=@KAEB?DH@E?MAVECDJEBM@A;3??GHROJR>A:=<3045//02.*.+2*1(,+'(03)(Nf))&")39`2+& !$4+=9%!&$'#!$&%1-K)(:#!))+$#$'.?))/%.-.,/2/60==E711/8225:G=995=;<>@H<HGA?AA@?@F>A;?DGBA><=HAB6>CABPPkCB@ACGD>9;A>A;=@;>CE=B=E@CCCC@>>DEJFGHGIKA><;?B?DIKIJGA?:8985546-3/0,'-0**)##(*.+)$*+)0.*)(/-$( ##'4),-('&#&&$!'"+Z<)'"&()*03&&#((,1*(,*464M:]KL?3:5244558<;>;8:?8=:;@BB@>BQKEhb{ZHEHBB?IIJJHKADCCGILKHJNHEIEEBDBD@B@AIGCDBA?>GNVKDBDAC>??@FHDBEGEA>IAFGETcAAH@@JSC?DC>EHDGB>EE>CJFEGMICBG>?96181291-.-,-**')$)*%!+((=+e=$#%26)*$>!$!( &&&  $!!##%!&*$0!)(.'%3)($&%"#3*/,33.704;:@88=>29AB8938>M=8J9>9A@BCE?DIINQN@??JCEFHNFIWDLIE@BIFFCJPTLHDDGC?CAPGDGKGKGF@?GJPHJKKDGAADCHFJLOLF@;??>CEB@@=GAAEaGSC@@@JFDDMKEFDGHHMOQGLEFJHIFHGE6=AA@CGGIFC:?<:448B1143/,')0(%%$%'$"('.3.5*&%$%*,'"A #%8 "$ #%>.+#$"#&23&)-'%))*&1-.>7035@@<4ICJ@6CJBBCDFTRHEHN?@>@HJICFGBJNMLIWHHJDPIJIN61DHHDCIGCA<@:>818762:/./?')*(*')'&)('(4M'*-%+&$#%()) !#!(/%' #0 ( "$-(  ('*.D#!'0'$&*+*'054J0015-=CAPGFIWMSBAEGEGLLGFRJHFHHJKB>K^hKHNPXUSIMHMLMGKIFNLODIGDIMFJIMPPJPHNHPFNXHJVKIM?=GCCD?JF?CAKFJIH@>AEDBGARNNEFKIRTOFDLGFHJIHII?:9?KFA?ECHQ575973>-*),%*/),(&)/&#(/*)&/(/)%('' " #%&4!#"$/%!!"" )#'&=*(("(*,+)1+')2250/5/5KHL8D=988:6:7899KAA@KLVZGGHHDKPX[YOGGXLEwONPPGFHGIMQPKQVZmrhbpuhVYUPTTOJJIGLOJPNFJFJQLNNSPQTPOOIJLKPQKLOTMLIHELIMLE@@A?GEHJBMJFD]KHIPIJMN^SLGDFLFFIKEGEA@58AD@EECKFDAF:;72:9B0..-)+('*,(-*#%(-&0)*'(#"$#"!(!  *# $)!#'"!#% #(2&!)(()$*(+1&)032.13?=?76BI7:;885=A87G?4;98>C?CSUjxjk^SWPNKS`TLCGJNVKXVEJIOP[S_NPZZhcc^X_ORWQOPMJJNSLNIJIIOJTQRQPSNOQLPLQOG>87=48454-.6(+-.-*)&$(')++**+%$"$!"&% !!'#!*!$!##$)')#$$$"(%$&+$$'-'BC-+538993;88>=CI:445>8>?=<>:E?F?FHLFB`l{dQ^UVWXPIPYMNLTMJQJLIESQUZYQWVUoowʬwcVVUQVQMLPMMUPOMJKJJNI[SKSYXOKRNMNPIGECHRUPLNHPVOLICEACGAFGFCCIDCGNEFOPKDIHJJGERIKPqDHNHH>;FD?IFBEED=825>56G4/-1'-**'4(*%#)A%'(00%)+&&$(&+$&$(< #!!!"'", !("#!!$'$'($#!#))-,1*133-33A?00565C9;??6CH[CCECR:SeGEL#!# '!")#&(&&"(#<- #%0$'&%--1/5-?)+0/./1-23/339<=;6:39:=A:7>=<=@@<>>:=C@7660-13-(,+)+*3((*&.&&)''*($&%)'$$.''%Gs!*&+03DKC>,'-%!##$-481,+0.--.+-+/903163;88<;58@B@A;<:FBU{oDBGKROU\\XZ^O]^RRQNMUOOMOTJRKOVTUQ]WgWXhk_Z]jk[\\c`Z`hgwaelc_ZZX[[UYU^Y]e^_]XXRVVX\ZZYbghfqxVRSQKKKJMKFOPFLK\fIFcPNRLDBIFBGOPMQMMNLRZs<@HNGFFSKEBB?B2636.*2/)*()%.(**,*%'2)'&%))($(+$!"$.(#&/6446jxO1+)%#!7G,(-@/01-27(9;8754=@?747<:;A=E:7=8;98EBASJQkLQ[aj[O^MLSOSTSZO[TMRWV\UNRZUWQX]XXb[YU^\`\^aa]X\a_dh\sildaZ\ZYW_l_]^e]c`c]]dZ`XZW]~^a^\bUa]iVRVQSNJMIJRPNMDLJHSmN_D>E=EHIRLKPSMONHGDG>JIDHFA@B=FB?:7X?=2-**,+*)'1)->-,()%%#+*%')')7"%(''%+*'C4251(&83*&/%&8.0),636.643<=D2D<787CC468=QDE>:7>?:995;>>4=@I?BNQEGNQX^VUUORVOQVRRTdiOOXkPRSWU^QQWUX[Y[Z``Yd]`[Z_[Y_bhhfeke_`^\[[bb]b\^bw_bXXXZ[X]cd_a[ZZ`pXUVRSRUOMLLMIKKLCEDJWp]GFITFFAHKKNNTRUSW[M?C>DMOHAEKDBCL@<<:;500-((*8&*-+)-'&$%'/(*')+.$$#")'*<*($):4*'2)%**')1;,)((+)-+&*246:;=A@47?>B;664QkJ=9?9;:38JW=F>4<=AGJEGAJb]RSMPS[QNUHOSUQYRNOSSQW[OOYZOWXeXcRWXX[[X]bYY_d]_acnigkqk`adgf^Z`d]_ajnd\]Y`[\^\^]bXZ\ZXVZSTPVTYURQMPLLIIFIFNTKXMIDLICBJJMJMMQOLLvjYO`IQHPNIACGL@<=>:6921.,)**-.+,<(#($&%)+)%$++')'#&&$')(#)-$(&.1+(.,*')).-00-1--.+(06?IH==B@;;<69598=<:@B<>458ER?GMOLCDEJDENQIQWVYLUTL^UOTSVRONKNMST_rQVj[O\\ZZ`ZTVXi]\fb_]]_^f^_Za~nshefad^^^\[^]_fh^VY__a[]_\Yb`XWXTXXXUNORWSQQPPQROSLHHJGFIKNCBBEDIJIINOKMLLeeTHWG@HPQDGDED<<;9:BCQ2/72+*-)-,,-+-8'/'$((1/70''&-'%))&(*(#!*+,.+#)2(')3.(42)++-*/887@E9<6789<8665<7@;?=977=9=BBC>@70/5./50*,*.,.),/(/%(&$K/##+%&+,,%$'&#$#*(;/+)()(*+*)A...02658=0368C47>=:7:I8;61;@987;@49FP>?PPOAJCA@FJMndVOSGRTKPHQLF\MKH`MNTSLJOPW\Y\[[[^[W\\]`[\]Y`da]be_cjhiepkiogidbabh_a^d`[a_`Z\V\ga[_ab]b\\ZY[UVOXRMLNNKOUUPMJMG?DFLSEKQDCMWWPKKNRbcZNNZEMHMLUEFAEEBA;;960.3.+.2.%&())&30(*%*1*'+&%'++,+&&$.1)>(& ,,*)'*)/B,,149?C:5D6<7DIREA=H>=A;9;7=9>968:96AAEQcQQQ]TRUONMWKNUPHQOROQeVOMNT[]WTY[\^X[[X\V[dng`_h^_bebeemlpnjljdfied_`]_`^dea`X\_]_a`_b_`]]W[VTW]SWSUSPNIJINHGKX@DEUHEHGIDDFSJNQQV_`SJXRLFIKHJFFEBDG93775332+/,*+.(+)/++(8,)&(--,,+&21)('%)*'$%('%%$3,'+2&4*-3++1=26>28ISZ[dBB9=<8:589:9:8<>@?SFGIAMNFLDGHIQUVRNPfUQUWPTKMMOIKNRSTQU[QSTVTZX[]_b[Z]X\Z^d`dabgaccdlyokugqhjjpmmmjdcdigbbab_ce`c^`b]Z_^_YXZVU\[VVUZWWSKRONMKNGLGHJFGFD>GILQQSWWRRQJFIMQLDNIDMYDA=@;7?230H44-**/+(**)(&)*)%%('*./2>%*&%!0(13$%((&&)-(,/***-1/7869@<=8;@bP:F@=7CFS>>588OH3<6569:>EHDH@EB>JJ=BGKMLEQQO_TZ_cLKM[PKNINPNSST[TXS\Z[Vf^VcbZadZXjhc`ecgmelp|yiknpmosmkkqkicedfb]^`begba^_\^ZZWXWZ[WSMWZYYYPTMPOMLKGLGMFCBDCHLLNNRPUPNLTSUqqUMGGAMHG?85533623713+*&,)&'$'.(+('&**,//*0&"$%$%*+$!#&',#((<*'*((-,?97@7:Q?;94@8BOE>779;957755856=DTHAGIDEFVRHJYQHKUMOPOZTWTTSUOMOX`WTVXUVYVXV]`UWcl_jV^lX]`ic``badbmp}ttmnmnkhfozvmikhkhe`cide^bc^e^]_c^bYXVRTVWYSW]RUXPKMKKPILNIAADHKJLNUWSOOTS\QZ~RaFDDCDCF@>4456@5434.)4.(---/43+*'*%))./14('+C&&##"($%&4$+*+/)'(%+9<734123=?98Q73G6?675?;F><:3749:FFC@?{I:31<9EKB;?=<48<8<7:D9?;<>>;820.10.37/*/+..1(,,0,(++0/-.:,*.0%,(&#%!%'(-,.''**10/63437=D@?>ICXRA=?8A6QG<>9;54=:=BI9FC;?@FQLIDFJX]FJMRLPQNMKLJOXPTUPMONVQOTQ_[UX`bgfV^daqtto~j^Za_]cl{t{wv|v}ps~zxwpywxpnnimygjcihihnmoeck^XVcYV^V`ZT]YUXOPJKOSRQTKHLPKPOKORRGHPRQUls^YRIDPQJMD?C8B=3.-24///+//0,-)/*'.(**,)*(/,&/1*%*&$*!,./,&('.,+2,48697HKNSNC\C@D9>B8>CEZE<;:89BD@>:FJ@CDETLfCEHS`QMGWVKLGLSRLLMMNMMKTRXUTQWVY\[^b]dajdeghnye\[\jjpky|vyur~{uxwsppnimrgbflrpaha\\^\VZ]_YY\XUPRRQNMXPQHh]TKMJPMQNKGJVVQ_ycWVMJPzODLLGA<;631740-.1,.5+++.:[75+*''/,(+/;EB510*8.-),2-/480-'-*--.)0'.*+''*/>*-&('&1(+*+;38;<=CEVUGLC:<;9<@:?V`S=>@LNE?B@EKGFHNLJKP`qHGKU[IIGGPOIHMEIBKOLRQLQSVWYWVSYZZn[pcl]dY^`ienjnjiogppu||w~z}utltrxqnklrlnpnlmlfba]Z`USf_\UZWX_SPLZ_`^khTSNOQ^RONIIE[]cuiagYWOIBIEOBH=?B:7462/-578-,2')+.-5ZG72-$*O3,/4'/*)+5.4J0/+))+.).65>?DITI@;5343284/-/,*)(/-+.08B60*++AA7,,+*%'+-*/)-./+-*'+088DDKGW_al̞sTI>:@=;E=;HFQNjxu}sQOOTXUWVUPjvLLL]ZPPHFLPIIPG>HHMGKJORXZV[cZ\``a]XZd[eguoohjehmqqpvr~~y{Ф}zuqxpxwsxnpnnwlkijshehxhhfd`XJMaa`aXYV^]Xa_le^]NIJGJMLMKVQW`_UXRUSTSPLC@JQB@I<::;6?:CBbqk}p\[Y[`bWWb_MRMNJEJLMLLJRLHDMMNPMLRXZX^`abUWcbd`]j^fllr{ttoeovonsq~òλwqpq~|y|tsppskmhkltsinlmkghUMNTZW^]YWW_Vacw[WWSODGNMPJNQP_gWPJONSTKJHEHFNCAB:>>?740--),8))/.G7=/,2/>.*0>,(,0,*-(,-65533,+6*028JMM]ZuQS[^vgVBCAB@CH=AIJ<@=;84/.,010/.0*,8136.F9**Z2)/-7),2:-1.3*/,).6.67JA9^TIUZ`SZ\e?I><=>L<<@?;Fgv{gTQS[SRLDGINORNQjrSLKQXSSSWRZ[W\`]\bfecmjkwr~vsu|v|tt{wy}pyvtryrro|s{nksmkoik_Z_]f_]\bSW[S^ntfXGMJSRQSNWVRfXUTSF@HMOTPYRKO?A@EPJAA:82,/,/-30./,0C15F*,*).*1*'.1.+0-2'++,*-**/+CI9CDNVbWJLL_RB?RGA::>C@>AFCKu|]RTRFHKGOQOLPd_w]`QMKQUPMTZNSbc^``wykflg|szyɵw{|wmzzx{~wvuqzzulrrlju{kc__^]`WWZWVXVdt^VOSMLMPWUPXQVVlg^pwJPOTKKLKGEJBSp\<8876.-0221+/.12P5/8-*),0/2,02'30*-**/.++-0./16F:9N?BOMI5?@MHL=@>?<>;=@DACGg˒m^a\QNKHKGFGMLRaaOGGKIRPHPW^Y]Zebe`ryvszn{qȰ}~}zu~}}|zv|vwonmho|pc^]Y__^[S[oeW[e^SLJDLJJTUXQZ^\ZZU^rRNNRKSEGIEC<>D7386;D;4,40,.2,6>;>=5)6367979:.55//0,0--.,3C/25@<77:\H<9?>=?9<==;@=9=A?AEJLkԿڷ}reRSQKJJMKHNgtr]POTQIQQP[YY`a[d]ijkuzwoqov|ĕ}~|{~w}{zyuvhllkdfwzy\`Xhcbe^N_h`]\aZVGEFFSMLQLT^^XXVXaY\QOTMIEEELB>:=><7648J=5=+-114:IED>2,+4D74/62030-++./0.0..029@=@GG@>U6::F@9CBD9>:9FD@B?EHKPsƽx\UONLLFIILTOQYSTQTQVSZ\[Z`V_dailzwmhonpr{㹙}}t~yu|ywrnrpivzzuj^_bdfb_`W]WQ_m_URJIHEKOOISPVVWV\VcgP]UNQDDDHEBCB:99943>A575.,0-0<=?BHNQi˯wdYSVOJDKKGFEcOTS`VUd\^Yc^d^\eb_bm|onntsw}}y~}~~~vuyy~~}t{~z|tqv~ymkk]aeaa`a][Ulg\QVPPNSKKNNPOXTXY[`][huXPKGD[JPC??;;E6846<8380/9/>5>@Z[9*/18832+5++*)-.,+/35+,26/=MIACC<:@CF;;JB:9A9=>>;9@?EITeëx__[SOLKKJIbbXV]Z\Z_ZXaig`engknwlqn|~}{rxu{}x~tt|ywrqkinl^cag]^WXZWVSSSLSPNNOTUm\aRSVTX]rcOOQIbUF@CFE;7::9507=>>533=;J:a@D3,086<2/8'+()((),)-+2/-;:N]6B:A7?IA=65594>7<=9;;?:@F?>AY7718;875@Q849T=:;==BJSQfòZYUSKKLNROMPP]RV_YXdkgc^dvixmgoxqvz{x|uqy~x|{}mm}h\gg_a^ZVWXWpRQZHOQOOOUUSUYXc[ZS_OBILKOFGEJI=X:577:32020:S;78F@3?A8;53666,(%%(%%/-(-00/424<56/<8887@9883M<3/8@8;499A=FMeҧa_WKILNNN^QTRTV\_obbydbZhwusmgpohuxeoz|wzzx}ww{ripjckkffl]Y\[^TSWR[OOONLNOSSWZUlgaccHBHDEMCBJMGDA@959CG).$%)$'' (,+2,2356568;H46103310:3+346365<EWJKHuy~]VPJPVTZ[b_`egitlgkmquizoqsleemix{|ytqxz}wq|riqphhlccbcd[Y]VYXXUXOMLGMTZPLVX]eXajbnsi[PMI?BNF?DFFDCK:24+0<:8759E]{\TaMH?80-05$$($)%''-+),*-00/43:660143<036B83264a=778?JJDDEgu\amgslcd\YSLJNMR[f\]eoffkkjklf\ltkiisakm{~|}}||~xyztu}z{zt~|sutpkki\efg`e`ZZbcYVVZPCGSXTXPNTV^hli\le\JAGD:?LJWEF>;C;:=144297:7ATn}QrnJ@=6<@@#$*-'&*'./(,331.628694?3//..62700/3;/:7:7Q_?D?X^NORY\YXY[a^gNLLWQVYek_a`f`ljgdigpgrflmhgkhzv}y}{{{pnzurtoosrbf^[nddfc^emml]fTSXNXUVVVMYYUXn__cquUWRIEPC>>A?H;@8??6:=6427@=ITah[]zPA7;7;3!""".'*+/./05>50324626/7/10,41/1345<8495Wg??@GHGMJKUWS`inombyWT[^Uh_gk_eZekhhigcgilklnegjxrvz||}z{qkpqtqlzndiidelhdihc]_]_Y^WTZY^o^SuMQS[^ibhvwfjTHGGGBDB@C=???<;97;>4AAIHcI``RGVNEB;*$&&$-+)(*JeO=5=53<358/26/41/.4/..3639=Z^?>AECEGGJKWTZfmxi]vid_c`btyoejkmdokefdkmia^^jcl|y|rqzyx{x}~zyqlnupnslckfbkfde__Z^`\Z[S\asbYS[X_tb_cYUQIHHGDB;>H@=@@>8:2@5:T65;ESobmhcNPJ=7%!!#%).(./UiD><961.,.1//51.*20500.7:49RL<DTZWTgxxucgfszp{|ihjlhmjof}fada]tjuvtzx}y}}ry~xwvt|{pnlwkgnldhimdbfggeZ_b]pky_X^^fad[aogJRQLBJCLR?>@?>FO:=8696>8AN\[_X`opubcil~xjoinmdejhmswiqu|wtozuy}xwru{{}~{w|xmvyqmsuiipziiepdmjgpW`lhci~gx[_bYaluc^]KJ^PNPGGGBCA9BJ:?;::9;7A:119IQb;>@IAJTOHSZ@2'!#"&+-+5306;94:0/.328J:-.)-0/12966:F@:7?IA;:CEJV\dl}xgiupq՘riqhmiepospuuu{xvzzoy}{~|~x~q||vkrusmkfhnw{mfkmjrm_]TZaekjrrvh`XUO[UR^`f];ObYPLFGCA;=;?F=LN. (')-^=3B>^5/,871-/.1+*++,0,3344>7>=FLX^_px]lkkt}Wgnfeds{mn}ymuzrx{{xrtqx}yopmqxxlrflr|qnilqrurp[fcaeegjlzme\OGOZmkedNIRWTWPIGCD@B=<9>9>:A@E@4;3CDD99NV=:?;8>69A81")'%*/4_f7>J/-/530-4/.11.1+0+-'/.17203<>:=DBKAGMTWgtsn҇epm{ulxsimhhffmz~üljvxwut}~xy~{~{zqvrwplruqjuulpozpqu^k\cV]c`cjjg`[HMTR`V[WRZPJMQNEIF@?A<<>?=?A>EF@AD@D:@OD8J755=1414*1:#+&(18DI?;G50J37J83)026)1..+0.+/281/09<99;>DHDWLXW_szfylfahxigisumhbgmήqirzusmvvy~{z}xtqpwyxwjsmqi|{qtkkY`XX^^\lfQBFLQMPT^YXlRKONND=E>:=9?C?=>B>>AB>D<@DK9=B\HBCMI;7<447=0/,-()''3;,16714,1C170.,G=501.1-3-+0815.24/3:=:5B>LGEEJXOayi_P`udiikndbc`ksccm^USfguwonhhyxsszt~v{pvwx~y~v~yz~}utztvslknsm|tojjd`aZ_dqTRUNGFFBFMRVZZQPZZICCG?IIJMG?BICB;ACF6;;DZ=:?79356<701,+(3*+C*835.&,,),/270+82,G0+Y-;.33,/:.1/152-5<;;:898@D@6;O2-5303.0.*)+),]835+.(0+0,5*-32Eg6611;/26635/.-/2:4/5>8:<@HAJNKNJVTY\Uaquyvlme_eY_]sfb^gxzhdiskciutmgjqtqlursujx||yzw|~|}|{lw|tlwspmnfhjufjilbbc^]W[kZSPLSMQWYUXVWbXPPPLNIJOJE@BB@AKBH?@<:C2O=@>;57,462//0*=*,,'*T1%$(-.6//,7;..8>0283A5D318,-.*.://5580><@CBHKLSPZTU[QLhkwg[\\W[`bf`nlvpnjqtudginhgnnqehfyix{u{xtxzvyw|vjuoshyr|yifhlccorxdcb]VUW`ZTQKNLMPQVZbWWO?>>]V:A44./726/-+,0)%62E-$%./01-5-9E58K94@4E7+/;:--12,,-,75;5CBD>JCGIJPXSQUUL_^\vpfc_`_XVa]]jiejselircmfrnrrlogckks{{s|zvptr~}{z|stksosonqhgmkamjklnda\VXWUZPOPMRT`QOUX_ePHKWFILIHJIDEIATFDF?B@7;J>P>717<73GWD^CD@8B9M:W<=6053082,+,.,/(+#"$#8:2((5-1,2>89<4FME4:52002-1+.20=5587C@@CHIGJMMOQXSRSLQ^d]_e^gXQYfVX[f]c]`sbcemkgqnho`cmoy{u}ts}~svx}~~|{yv{ywx{~zljlqahoiumnjcp[VUSIKNROIINRUPRNV`WSJCLIPdPJG?KN?_XGD??=95E=:BB784,C/*)+('%',)$&&'%%42+*--61,75539;Z7-5A./..,+/32469;FOXWOJG@KGGLAILH?<8:?BC@4DA956,+''.++,,+)(+)!')J;%-/3@2224659ZJ3:5.*,/-022657?@C@ADFBFELW_ZUX[emmdh_Y\i_]_f[}dW_ad`_^_eiijhjkfhpsss}utwvtwz{|||~~~vsu~{rww~vnjksh`_ZPKRJEHKMUPULGOPQOOMH6GSZRONLIJPWG?E;AC?=N@FU75744@210,1*)')*&%,*$'*-4C3,;EJ:;5I.23B./-+++0633;;IMD=G=ABCINRWTSZ^gxxrtgw\[Za\k]y_Zf[laa]Y`ammoneinwrsqsooxyx}rwrx}zz{wrzzsuxznjgnixli\UTSVRLRPLSKNFKMXNKNF=EPMPT]RMJHJaHCVXH=DCKAPB;9A411/001/)&.)$'+,&"#'6/2Q878LdLAB=?541?175-+-,16APE=7<::817/10,+/.-,+$*>+- !(%,.-FMB2ZWjoN5;561/,5=3--+25^I;8;:;EDFKHKLTX]\``bpkothkabq`TVgjfoago^\a_ccdafoqiyvitlltyz|{xz}½~y}zvyurzxrtlfjjllicg^ZVVRVSJJKKJUOQNOSTUSTUZW^TIIICA;=BFEAA?LY@LOFD9.132,.,-17+*-)('7.!#')0&-Ff74DPFH<95510,1,8-0/,SKCHHVVttjhjY[YYSOPZWVWUVVW_\\Vd_W\cwjsusciqloquvz{jpbl|}}|twxxx|zqyxqshkj}mi`][\VTPRSTPHKMHKIKUSVPPL[W_SPJHLNGH??B>>=RCOJHNEH>@613.88,2*+)##'-%2')(-4,1NB3BDE<8=>29431,+)7//,-5>QKXcNA9:/,+4:83*4+)&+,&%+*(*3/=;PIA9I9=A9.20-/-+(/+1/259>KD;;FEHN[TYhz}tkc\XTUPQNZW_]jyV[Z\\YU_Wbkjumhhlrqknzonr|}}s{uz}¼u~zvypr{mpwvtghomwljgddd^bW[SONILRNLLHHNONTJJ_TTOWQJGEE@FC@B@;CU5BJfO882.132?JPOONPPVUWRMQLJHBA@NNYEAAGB6OXE@-608/-21*'(((&(4:+2-121F_UH94,>A63./-+*/.-C+*33469;A>=JAPNYkYd{y]Y]Taj[ZXXUgW]X^Wg[c\ZZWY`bX`lr~elprmpqrq|rvwzzz|~xvwxvsx~|xxtrihyvgbihvl[^\QJL]MLOI;732/900,-,,(66C7:7@=ECCDQzeqy{YPm\Za`YYXZ\VX^XhSUi_Vbdbc_\suycRkgrojls{{psvyxwĿ}zwtwyrzwz|uvxsq}rkljhhobXY\MJGQELMNHMONQTNHKVTRYJLHKJFFDAFCDYoCDHKGHA;34602-/,(*-+%"$&#+%+577@=9O=36E42<2);J4.(*'++-2C>;:<]QEH@D]lohl\]Y_[T_a]SYXTcX^`bS\ZX[`jgweeknxmrlfgisnmhoxv{lmt{{z~{|vvx{styr~~ybkqpig^a_g^PXUNJKFKcYYTNNJXEIT[VuQHIILIGGGQD?GC\DBGE=}SE576.-E0-12&%#(%"%(+2\A7B6B8R_YUAPIVgivh]PP_][_mX]Z_ps_W[][Z`[[^cdehgg\fsmjjf`klnlopyz|{knu{}}y{ux}zw|~ynmowrjaa[^ZWKNQOXKFHW\mkTKS^DOKTenMIINNSFAFMIJEGD@I>DFMA:510./)+,-+##$"!"%%:3kTce>YD:97351(1C5>B+(&(,5HRM@FB;0./3,27+3,().07JAGdxLOQBGJVSY^Xgҍb\b]piaQS]lrptZSURU`aV_ifg^bpwnkvjiolqpoinmrlo~wxwzvuz|zz}umlj__^V]QULSONKJJOKPLUSRLXRTXY[_NLIFJGJACJQJ]fJKJH_m81.0+,/.'*$,&"%('"'<<8KpH46825480..9-0//,-)K>527,,.7/5208239300(56/DJNKJNIFNLTSddmymfZZS^df\`_q[WWYSVXQSZ]bU_Ydltxwy~{tovpsmsjp|xb{znwwz{|~|nkow{twsqpickX\PLKJKDLGJJFEDIQVTUXTRbUXgRJILEEBCKT}nZMAM{OhZVB2+%&(#)/*%&(%$#('%!=A<;3,2,-+-3.37=7/31<6:-,.4GGNF?<:8@47B25.8,,-*(!'#&,#&& P[3970+/0/.*-57.61/0,)30-76;27;EA9LEVEIOPNWbYf^\WTjSPXhcfodgic\URWZWV\]xeij`ohihaoqnkhosovov{~}|z~ÿy{{~~~zwzstknsiuwnqlda`V]VOFIHMIIBEYMDPVZWXbXWPSYUXNDFGAB;KEABDIYFB=?2<>>81++'+1+(3"#"# %%:;@:1-101,6/1/2.154(%0/829AhDD?=LG@EN[lJ?4bH068051((,''**%!% &!%"15AD9430B/14,',./-(&*.56=6PeD=?<:>@>BDCFTUOMIKOXdSYRWkYgaGISS[_]^ZbPQ][\`[k[bZ_`fb{rsonlghqokt}vvy¿}v|ow}}}z|uopmt{pjhh__[W`UMPKMPUILLRVUXQYZ[^a][XXSlsICCBE@CP;@7>XFC2552.1*+,,*****%& #$0(" 7;K102,020220+176$)(,./9>jD<:6957:BCKHSIVPQ^rciXRWZcblfkvV]\bYWSWTUSPOO[d_X]Y_bjzyojkiztpy{yv}uurzzy~~~{wvkwnoviih`\Y\WZuRKGGLNTTTRPUVTWXV[WYOABK]_UHEE?AC?*(*Z=,.;&&'88)--01Bk~G<35349:;=IKLFKKQYRPSTXQa`afi^bWUYUMQ\RPS^Y_ZcZ\XUg_^evoinrmf|u{{{~|y~zzurxurwusqnslgfia_q`YZQPJHKU\QXQUc[]bTUSWUSOPMPPDLC>=UP@8==423421,()***-(&#&'.9/+-$#%!;714,.))+Q90,0,'80(.-2:76BIE;15866:<=EBJGJS\[MROJRTS^[]Y_WKNVWLNZPVaROPRV_ZZVQ[e_`ivqold~pw|}|wyz|{w}v|~zusuvqmmij^mtl`_^SOIDEQPSUXYZ[VXWR^WONSTMLNNHGSOFF>>4220116-,),*-(,+2&$$#$$%0K.''.#9040.3+/&(%(**501-**'72;4;6;451859=M?ERJAOOYOHNKITTYXURZa^\ds\LPNPTPQU_ZVWU[sZZ_cfkwx||{w~yz~y}~zy~rtqsw{~upoghkkk[Y[\PLKLHMLZJdVSQORYUUWQRMNLQLJFJDSA=744<:-++.+($,*21542++1-()0214-097A:8?>QFW\LICIMEIVQUOWZ][X`YUqpTSRTLMSWQ\N\Xqg]]\`]^mvzw~~|~{~}xrnrtqn{}jfoyfa_ekafTMOQMMVWQRRRTSSYWVfQgTTMQNJSOKJD:;9732.2*-1+..,$(+'*#3%()("1(('"+2402,-0**&),-2)-543B0-+(),2.,66N35BEHZOWpVWDJSMTPLSUPOWTa`cf`VVSSLXLRY_VRRiY_^^]aclpz}}vvz~sxzmlnpuvqlnnwkfY_a_YSUSSSUWXSMVSWWTQTKZZYWPNMNLFKIDEC>?62261+0./(*&%&(+'&*,*,&%.&'#D"524//4*/)-(1/+-402CR6()%),2,//-046:FKEQWSXORRMPQRPIT[RKTUa]h^PaQHRIHRVYQZ_P]ae^[Xaaplw~z~vy}z{|pssurpryzostqheg^W]b^SPQSZVo|NQZVUUWS_U[ZiXTSPLKDDJNH<;=.0>67+*-+&%*'&)(')#,++')(*=0*&)+**);*7/,,846==).PQ4+"'.*-69//27?CKPpjMYhS^kkUXTQJ[bRPYKTL]L[MKGJNMTXSX]WU_`T`^Yddno|Ѽ}~x{|~~yx{usplmxq}lotsjai\RXLXMSMSiTTUTWTY]VV]UXPMWZ]QMbDGCEC<5K77;:.+(-*)*2*(+&(#0+-'))()&)." !1,*-/+?6-=u:-491).4,2$.1.-/60570QBINqfUtuc_bcXd^GMPJcZQTLOPNFCHIONZaTU\aW^hd]Z]_cpimyأ}~x|~{yu{xxrnms}vt{~caaYQLNPQSVU\TRdZ`Vp^RX]WT^P^{e]^LCTDE;E=WC<37/&)(+.0((('2*4:*)./.83,&-#)D0+,/))--.13,-75)(-$*3,,66*C-,,=;??HONIVrY]S^ajxOTIJND_KRNTHFNKMIMs\YZMSRVY[_aY\]filrբy|}|~~vuyxrksxyp{f^c[MWJPW\WXVSU]P\XSTQW\]_PQWhs`VYdUDJLG=<88C26,+.+-*'**)081<03139PM:00)*3-,,*0-=016,+%&,+#.(-72)-.170*07JFDY^XQk{udWY][TaUFPLSXJOPHEGDGQMDOYTVNOPY\W_fmcetklsÚ{yz}}v{voynq|{wptw\ZROPSYSMLOXYRRSZ\WQV_c^X\^fXj^QFAE=96;740.,-$*-0314/%,+*10@A+8>75(4260(*/5-(/00.4#%&')*1.-1+.0./>131<<164.74'*-./.+*,.,,-(I373/9LH86>921-*-'+)(/,2%''*)()+0.2/,+.//:67B=7BRbn\PU[VHFKKHPKJDFFMEEFDDH>GPP^SOPRRRUY]hfkigky{yvx}}~yhmmtltru~ned_^OJOV^KTOSQJPRSNZ_e_W\RT^Z\_IFSDA?OcיVPPTK\G@KCEIJ@HNUOLHGHSEDGGHPURLLTXOUY^aSgxx|qz|tm|mjy~}|}vr|omqptntrud_^dMUMNNVXPFOJQTLNI\`doXUcXTWTLKKF>BA@:99;320.2./2-'Z52--0,+)%4+,.*+*Y45,)5/*+).--1%&22"'33'*'(++/*..328::=JIPSkr]MXUTLGJCIRFBJBH][HIGDMKEDHHGOVOTIQ_MLd\Vglqjqro]rqyqzvjotzv~~~zvwywqxplrnnyx|~wZ[ZSFELJQNaSUSYSUKPOTdaXZW^P[Q\XLFKMG=;;=;=812.1,+.+.-Q3/--.,0&-6-/020=we/,'4/-*2(+)*&(*0%#%F+2-+%'2)3/B?GFF:863:=20/-)(*(,(&(*.+',(,1&6(+*0,--,)-/-'(''(&+*(+((' ##(%'.,M.-01872@>E@7=<;8:6471,6'(+))(-+'/)')8&/1*)-.(&*&&+-0)&),(0+02%,#'""&$%/6?/-4/'/128:E>?@:IDHTRLOHFHIHINJHO?>LOF>EYALIOMIIEOTJV`~dad`jvo]g}wy~r~jrpvlrozzy{|z||uoxwuyupmwxsnbi^]ZWXVPKMYQOQROQSVVXUY[TWYVUWVVTZWJEAE?B?G?AJLOJ`GGFPIT\cb\ebhhntwjqmsr|suqppy~|z|wwypnqwnyt{owqhpqopma[XWh\QR]QQNYTVSSUYZ^cXYXXT]WWTPNN[XG;;<6987:=GCJ6.0*+*(.)*%%)*+.+&--,0+-=),0%+2*@*$%C.*+-@c3_)''%())'47>9/6?1337GFELDHJ\r\[^ZdYrmmjgjmu~|ntok}sszyyxy~}|}}}||trqqmllktsukhejfiaV\YYS^PRSTTRZVZTUYf_YVUXOQQWQPTOGFDC?CCLB@<2G/0)'.>;,4M98@QGPQ]^c[]a\fJHCQLK@GR?A?JDBHHA>DAF@HGFHDEIHGGN\Ydhmwujmlglsruxzhntlpz|~{~~~~~~}wztwvzpqqgojfljfg_]hb[\UQNQPO[[UZthZVTSQMNVPW__^XVSOOIFL@CA=HEDC??@D5SH=5:28-+0+)((3)*-29/*541*&(("%02%!")(% !6'%%'$" )/>N|~EE?T/-11205BCDFFIDFBJCDCACFNVZ`dkgjiipqfz|vojdksemw}}|~~}}}~}|zvwytsqr}lqcegddcddg_[UYLMPUWW[b`VSORV[XWYXYaZYVUPJKHL_KDDHFJ\RA>L>JQX<648++-;+****',(.(15,2)0%%#"&.+'#*(6"%('#$".&'&7HNC=;601.2?2=EB<=4-+)-.3((,+,*1)),22C.*-2-"0*#""!"" "#7,8'407@UD7+)'(+15A\:DFEHHEPU[]Ujxnlotyqo{w}x}~xzv~yz~|}|{|}{{|}p{tlkpqpphbbnn^ZVZYUQPTNYWZVf[_]]mTWWZUSVWXQUuTNGFEAFDI^`YeJUd<8CG8.,.).2)*)-++*)+/%0/8+%*'%$!$"#)#!"(")')"#&,27EA;@94*()('+9J54:9E?DBABCL?GBEJDKRLV[felarzy~p}mmuww{zpsoutx~}{}}y|y~v~yqkm{o|ah`{dYYV^\R_WRObV\OXahk_V[n^^[XVYUagwoZFIDGGWQSMEGWx~sMXB=:1.-)./('&4W0('),-+-.%%,6',,! "/ !$%%<6&$&1BEB0(+E4.(%)$*F262472AEXYIN]^dTOOQIOCEALECE;AADUCECHFGH>FA@FJRPbamvnlwœxtwwpruxrss|zvso}wz|~}{~{{v{ztkusnund_^`oW]^\\WXUMRQSeZTZ_g^ea]\WX`][WSSabHGME[@M\NLI@YB<:<2588;/,/-2),*')+2)+,,*,;3(*+$0((*-,*7##/&#"%'*195C;D5<5*)&'./,1245;5HGUxKGX[jLJCLKHGFE@EBF@AAKM?KAAF?F?MEE?=8<:9>3,+-)3))'-4.''+&)',))'0+"%'#13'),$%#$.93#2-NB_qB/8-.(#((*03/31:9@Mbb[TSWKLNLJCHNFHB;=CIDCCE?DVCAFDJ>B>@D@IDDRRgfxrkn`jkaecqZcmrrllquqxxps{yy~uq~yz~~|x||xuntuwtoroesqklgtkfbcg]ZbR[YXZX[PY\WWWTY]_[a[RTjXXVQMLHYVKEDCIVFIJVb_DC:=P:25?4+,.&1+-('.)*%'**-'=+T/(-#A0(*4''(2& $#5$#&5-_{@,,,("=$@:4652;9A>FF>9LBBEMhYPKNRTdSAKLQIILKBCFBAE@8?BBF?DAAKKHI=CCCEN`mdbrnahzg\^deZRXbhmnnpjjmuvynttyxu~{}{|}vqy|uwxrronw|wwmxlvinncf_ba[be`^^Z^WST]^TUVT[RZ\WTSQUUXaYUXURQNYTQRLFHC>JFEDMIDE==A=?@BE9=>EC@>ATKPW_]cdd`|~cjkgpiiZg\a\`s~vvgf\pxqs{wtswrvy~wqs|wpminnqrjmvmiuqlpdafc^Z_`ggX\WXUVUWXRPTUZa^YZ]XVZZV_`VSUOQQNWIOOEHMBBFCD\TFG@IkU?99>E;0-1/-/20'*01%(+'(&0('.TP0*.+126$,2 #!P%! !'%( ($! !"$%##&2%+.:9F?CJCNHFIKUMZ\PNPVSK;8=BFG<7:ABBA?GEA?@?=<;>AILLLRWwiddog]sqi^R`b_ad^pupsjf\gfrun{rxuupqt|||~yzxgljlqqktlhmdanqf`gY_Ya]^]bWPTWWWUZTUTUWY|]lSd_\WWZXaaZV`TPNLIPRD>;B?>EF_ONP<>AC@A9/>5@/3?+.(',1''+,'*((&4$1))(*#*1&%(25/#(+#$!!!$"&"2 ! "(!%-()+,043;DXFPDHMKNQX`heWceJ86>;?@@@EG>@?DD@?GDCDEELO[gpadc_jucRRlghbinpebq_Yfdxprvxxqtuqw}~xtqstvkgnqrm{smrru|m`^gq_ZYcZ^[\SW\SV]XZ^`h^WPWVRY^Yf[QVZ\]ZRSSYKKHCD@CB>=CKQNA?G<8883852+-.,.0+2A20'5(,-%)&$#!+%2)%'$#')&*0-3(,"!")3 !)$+!!" (%)*+)&(,C+;<6458:CEMBKVXYveqxY:7K87BP@;@@=B?;CIC@?D?C??A>AFKXddh[Za_ede[^kmrptiuyqoe[`__epnpoqtqwtppnm}nqjlbf_gjryxe{whdo^kc_f`_zc\e[U[\b\X][\]XT^ZUYZ\YYYYVZT_TOLJMA@N;6FFBBAA7;2:9./0,322/---,.-.A2-("$--%&1(! &)&''+%#)+/(&$"/ %!"#$$U~% !#"$%#',.28FA1/7>CBCGIPqibgniD7563;IFA>;;A?:DD=87BA?EL@HDFPPQ_RVb_`hodfeegykhfaqrqdip_Z[cmolmxmu{ozxrupvifkmjja`he`chf^T`ia__]ahtbbcmfkg^\\]WXY]\]QRMTn]^de^\[aYWTRMJGB@<<=?EaCHLGebdjaS^qJB99/;F@A@:9@;?<<>>9;CCER;=DBFRNTPWcd\fpiefcXSgppbhZgig`ddwjcmefkvmpgrnyssmbemgj~n`f^idbUgaX_Wg`Z^S[Y[`qdVXW^a_ZZ]YYZZ\\\YRTWVY\[ah\W[]\OMFHIG9>7;7;:;_a>27;68662111-2.*+.'/*3.(6(#+20+&&$$'#$$'+),:A/-(-7'$.!*#!")F$ # %%.'$,27565=?B:8<<=@>5>>EEC@AAEKWSTY]fnbadt_\beshgqgpZpkhnhpff^dnnmi\ailhihlfrbgkc]^YUX\faf[XXSTXcaabWWVVXW\aW`]UUMSRSOVTWUVaY]la]WTRMKDEI_>B;=;=B6F?J:9;85/06401+*+*...*%&(.F(%(-+*&(()'($(;*(IP#((J47%'!'&($$*$#(!%%$($(4326A9?J9CESJRNPW\XVNQSD956;8EcD@4:<<>6@@>@FCA?E=C?CIMQ\SjbWX[cbhad^edikirlagqliqliiZ`df{Z^f^lfdczjdbmhjlc_gd`_Z]TV\Y]RUWW[_aZXTY]YaYcs^]\YXX\_]YTV\\^d\\YUUNHEDBBFL<<;:==K?:8FA@EEMPJUlULQGJLFQDE;67;Q@=;;:>878RA4?AC<747.)(.%-/**--*)$!$+*,,0()(')$').010*($%'/((+&9%$%& '!'! "  % #%-51-/3@I=>O>ADAAG><579;?B@D9CHJIONGJOYxb[\`ag``[chervokqglln|QW`a__[`]c^^f_fjsmivntbXYZXUae`YUS[X^plqeca_baY[][YW_mi^ja[\c`c_UUWPMSLMNNNE=<DEaEAQUKNJO[\W^Z_fhfVa`mjdohnmhnjgi__[WftfTWh\^dkehfvp}yfeaV[Y\Uq^iVXXdYapuzhlfei\dd`nZbki`h^a[`[e`YVTOHLTONVJCBDC<=E?89>A@?6B66271/**,,+.1--++'*&)+)&.-$$,'1+*(&(,;75(1"1+%&%  & 010! #%"$&'(0--71?^9@MB@?O>?I`j^HBHHGAKNODK_:45>>7?7884>:8:=CL65A=B>:;A=94;<7:7761./1.5)0+($''%%-2-)()'%#"#%.(*+N3,+(,'#&$,.=H!%!#*' ! ()''227;:7>@@GEOM\MQHWTWY[VbZ^ZZ[LeeekdhrpZdkhj^\eWT\a___Q[Z[[]aZkbWY]ZTV`[bg`]`e^^`\\[[]`a`djdc`d\ndaa^a^eXYVVNLMURLVLQE?CDAD:<<;47<:ED6325332/26-1-)(012+,$$()+*%'"&)37*'*4.$)-(*$*'QC"#(!P !  #&"((-177CEBF=??DAKM:2693469=<=?;<;:=@IBFCHHDE;7Clb62A488;5858:CR==D>ACIISHAH@GCCLKKRW^q]]y`m]fbfb[U[T^aaa]Zc``PPTYmxul`nc_[Z^_ef]ddd`deb_c_aZggaa][[jf^\\]`a^ZYUV]fxWQNMOdwVYbFGJF?A>E=>>8<;<<<9<@=;??A_SIPFCDSCCHEJKUVTT]ai_b\fb\__feiaYPQZ][_btps~uujfbj{kcd]__e`^cbkegfe_]fb[iggj\Y\X^VYaWVcZUWMRLJLGKPVQST=JGPT`GLEJJB<>CB;BIHEKACa@EBDBPNNTX\`W_]^c^^e]^pmja]^_Ya\Vioetx}uiccagfb_d_^bh{mbe^bablakZZ`U]]WVYWUQPJPHJMJIHKJKAGEbZWarPdnB=?<<;;A,1.*363//-+0&-02+)$&)&'($+,(,(.(,'+%'$" ')&!+" ##+-/  %! "%,/+.595:A=CEEJG@ATAB=B>:9<:<:;895-,.58842299:=:<7HI85:FA=@M>FKICECKbXMXZVZZaXZ__XXkf]\`h^hjdfci}zvlc|uohf__\_fkce^la`]bmhf^YT[TTPPLNKKJHKGJJBFKJCE@ALDNffRD=;7<697?5212163.71=0*,-)''$&#$(++,&/*0,)-)6#') *%*$$ %/!"0 ,)!!"%*+,3145E?A>JC?CABACG>>:;<96=9;:=U;3+743157:I8;<599@98@>I:EC>FD@@GFft^VVURZU[W^XZZYUi_\_W\aX`ebfsuvznlm`_`]]Vbd`aZdXjmka^aMZSQNTRcLGJIHHIGKDOJADNB;BKHSdRFC:8;::926?3:3,48F-,1&,+'*!'$$ ))/'/9/5*%*(*$('"'&$&% &2 !  #$#+1,0AE?F>A=:I;DAGD@C@?EC:=@88F87APD48/7>:<@;:?979D;FDEC=GC>LMHNBl`SOTKOPSRRUSS\Z]_ZWa_VZXZ^Yffo~h}wvvrfUaWXXbdUYWW[TOW`^smYXUNSKINGIFKODGDCCGLMJEHMIJ>DFKD^_QCG>?8:?:@f1>64M>532,)+%*408"&&#$()+P2.),+-')+*$&&!#%('!" $# & $*/2-59:9GFA><@;AGCGI=;FA=<;:;=X4CK9<2358;8576=>6=ID<:@??AB@BGINK[FMDHEJFJIYVPPPk]VWUXYVTVVXX\fc_uncmco|johl`SV[^RZY\VRP`XYXXXU_VSTJIFLPPJEDHFPG@GNFVWJ]NDCB>CADFPGCEC@=B>6BI>=5>A9D>EEA;;69;5?3:-9142/388458=;8;::98>FJ=ABG?EJ_jUCJABMLPKHVS`SQYPXMSZVXWUS^^beXYYW^cnci`\]bXXZTZQPWTgZTVSRNNNUTPPIIIGOJGEMHWFGEDCJcgigRZC@KCDB:8LJAON71.-3/54/)>8;8-3,)-12**13-*'*2,%0&'?T$"%()""!4 # "&&($)$)-/826;C=7;>EEFMB?>C9F@;99==E7=9;<1:07:82678>><@;C=E<:E?<9:=9<96BU<69C0+535'*1*/E-)3*),(*.,,0(*'*%/-%&$&.,%##"("+: # *'''!'*).86@7?>B>E>AAIJB_oA@87298;:41534146;61:83;>>AFGG><@>ECGA;EIPiC?FB;=:96:QI64;6A5390-1B3%(13-.&*3**)#,*--.-+5-%,+24)+':"#!$< 5''#!1$$#$.#+)%C<=>;>M?C=?@?=FC@@@<=:768492545559?9/>==BEJU?9;?=BKSUENKF@BEIC4;8:<588>9@31996K2.60-%))+1.'*1-0,-1-./-1+,((3--21577" 9,1!# '#!( $ !+*)#%(*./<1@<7BC9;G?FEOB@Bc<3:957CCFReXNSEB=C>DG?NhBPI>??>=CCAHDFEJZKLPFKCETmؐaROKFOYUQbZUOYSWNPPMI@CCDFJLFEI\QLC=?FG@><><9@?FEWAG;;_@<:;8;388950332260@5N71,+)./0,*,08,E:2(-50)((,.6)"%11-,'" 3G*"#"$. ) "*7*&#*((=15736;7;787FEFM9<79DN@7569569><6;=<15;EIFL|P::FF@@BJYPOE@J@56<@BNFDCFMNMTMON@Lwy[GEKFMGJOMQXZQSJHDKGFDDECIEJEELEBCG@>A?B;?99;A?>GDCEA5.8@H=CBCRBD?KB:=BE@:??RL75A?ADDAAIIIFJ_HGJKPcQUFHGIKLLPINNYNODEB?CDG@?AB@ADGGGB@CA@AG?@?@:7;98;HBI;:B;DCI?]TX?8HK@:78BE>789:?:324.39C8?B4.2.+);-$)(.CN@0,.20&'*);5()KK11L092%)$!".281!:#/,$"&!,'+5&.1H=5F7<9?=9A;@BBIIC>8@GU;;;::AEF00:<=>C>97K=?9EM=PIMGB47=@COC=CEJGDFBEXVTQ_JHSNFB<>@=@F@ADC>GJKFKDCAGJB9@787963BA>4^?66337241S7;;1+-)))(3/+/-64120+>./9)-()-'L*,/7,#"1(%0$#%#(  #")'#")%&$"%+,1127J493>979<;B@A;AB>>NEKNMGIUjFK;8@FJDCAGGIAD=>U?OEABE?D?T]hWN?MFBAH@BCDE@D>DBDFCF??B=;9?<9<>9A===TEILcE>B99?778;95;52337T823107@><4()00.2F330/93159:P62@*1()#3F%-##%#%#)"1%'#* # $$7-'/-+*12@6<@@=7=9CJn_n=GA7B95ABBD647<>J?653>47;<>BEHI@IVCI;===BRF>>D?A@Gab}~ZRCBFCA<:BB>=?>>B?5<:>:?H99<@7448?B?;==5BEE;=>E639;6;?5;57243=;2957,+1-1K:,+157X9E33414795E60,*28->84-$ "#"&((&5$+!$1%"$73,..058594;7?9>OkhjC:6A9=>?@>=E=@<8=5;7:9=;=B67;?>?=>@F=6:9KE=>DH;91765455S@93:/.-J4+5.5244@4EB8/ZB9:8;;>?;?>OD5=P=89444228<;:<=KOAB?9?>>J=K??;C@?LJ?B@CGPG>E<9?:==<==:A@Q}wZ>=B@>?88<95:>D<:8430>?96888;<9;548;15HO318M9A-&&2-'*.0362038823I=A;@BA@99<9:SPC8507;??;><46<9?;>@CED@8?B<>94D?=>BQL@TB@@GKAA>@D;86H=78>?>D\[HG77>9@J:>;:=E:N89<=;C@>KABC=??::?=17666:9<6>9<:;815;4=C63>?:C=@=866:;<C:@=HNDE?XL?7:<8CMZK>IUVD@>bAC<68AAB???7B?@;E=:8:>>@9:??C<7>BMCAA@?G>=<:?GC;7565839??C:92;A37/87THAO:M6KBG=FE=?<>?H@ArJP79B>FW[==Q:8@99;E>=>CC@EB@>U@C?=:689A>;;AAB8B>EBLDB9F?LHG>C=C8=J:47<.98>;C4;F:548<:71XA?>G;;qC;<83OI6hc8=942-3308-.429@612_*)-2-,.-*+"41)$(">?//2F#,$6& ! 2#%" #%(&',).1*237-.>bYBAB:>;:9;B7:@8>B<28=O>A:C97DJGEL<;67;9B=;DA@NJ9>FB>=4:O@?E9C9=6858>P?9>KC9<:762-=M7/66]UI>5973:D.<=@00/+.-+/7;/0.4./.-8*/1..3:23(+'"#"#++.';7')!.' &# <$%!!#+ %.0.;/=2/0<:<5?@=<9;=A6?:5<:7aC91>E>B<8HC?KB?KA:D]EF;MHTEC9PMJ>97@A>7798?:9:E:<C?>?8=>@@HDH>:?A<;::<D^ZFFA<98=87:9AA@W?=:?7=2N9-JZ3275NF;A66:368+10461:+131,>@3/.0..0)*/-23.3<8;#&'3&$(.*%*4.*A1" # '$'$$5)1161.&0>2-1/*+18>98A`C;:9419;D7A<::K=<99955>A>O>@HABPNKNF=ROE@:<7>CE??7<:=9AB8699<>986AB?9@=C?L@F;JG>98;9;D9A>=9:FJGHLI;9;?;;KhV[eK@7;8@6567785/4-,.0:219>872-.24@853=7308/2/0(-1+//-61-/>,+?(*-"#&.8)4+&90%% -*!0*(%')G;6/*60.+.33/>3>>7>=>H;5A60@;<98;;_HNVPDBDPDGS?5@:A=98:5<8==E;7>=969;D<;N;=BDGE@A??@;@?>CMXN=DD:;5@E>C?A6>>>=?M[BJ6::?BUNNZb^HB9@38<;72080/3-'./36)041<0,*=31+67.>77+5-**.->:02/+=.*34,0)' (+)8+)(:,"-!$,>&@0$(+/7L;315+.13-05155:;;:CEV?8DBL9AADE8F:ALqdTU;:86;=;IYNSRDA=KEBEC4::E<@8J1463:::554<8C;8:@=987=ESVjTB;;;>;ACALgf?=F96/53252/.251.1021.//>+591?24-.+-././/*+5/,*(-31(1(%%5-')$$8FS)&')-,!%$ %!%'))'.3*-?8.16/.738>A=>AF>:<IFOA56>Nrh?>?:5D@GP_k`G<6968;>?598\F6:>P<;?:@C6647?1=488@>?>C?97=?:997:6CEAB?>=;=8=?97;D@@9@CG?_YQC8:854.27+/-387,60695+/2,-.*01=0-+8.'1).,)-*,&&&'7),.))&'&&+"*/)5-%$+!+#!) ##% %.,',!-+;+2529/-23676B9Q=TI\DJA>_n[<36CdkRD:5;BA@>HLYZRN?979FJ;9C7A?<7;;<9EG<6C?=<7:>TNS]H6ETB=C611?;8;4?7535:8:8816=>?5<@@>=:>:77FJ=898/57:76::8DGIMK@?A6K:=7<68417;<:/:63497;732:=:7465DN3?:8>FR@V}C?F6?99;:83==XWOLCDB=73@3>.,.-0/*.823*'')56-)+*,.3%%'('(,&&-++-@38JmfD;90YI0)+*'#!'4)"#&2:3*%$%$,2$*-/(./)5-.3-:/==A@9F2>?@GCI?==?<228;=B8:?QZfo8TCk_LB9?=659241;>;?9;?3BFJ5I94N<>5569><79::;7<>C4366308;989943666>CAA\E=>:IH7BM50:DSsJ;83C8,0.,,2;:/,(.61*&'8E94,+020*+((("()05*8/*-:DIiíjVP23>/('>)-&'&#%#   2C025'*" %')-57771,.80..11K==7?GQ6;BHRA=<;6@8=8;=3<=GXuF:@yUKl9A;045-,0@DS>:964=}H8A2594247:M579759849>B9:<95667:38;;89425:@F<<[hN@>@:46;8@9UqA922824-,0-1-/34-',4.)0;482*22-(-.-,)$+-6.--;523;Fwە^U;DC21.) !(()@0$*"$+$H,&&*(&*)$&%-G2B?03655/4689<2=;8@;@=ICA469FaUG>ABNBHHXCM<9;@9308969;338:6?;B8@KO>D<>>?KH:76-748:21821/,**762+/L3:(1.,/.:265)./D3*&)*0'%&%*()*.3*/+JLTD4i]2=40%%)&,#0*)!#%+"&&:*'CR6%)++)/.04313A1588>;9;=D<7CO=9ECBeD=CSI`KpTUOHJ53239;88371<6<55A9==DoI2552635564358378C758::4??<;;79621784814:/,*+6-/3*)+15;51-.-3/)@62@.;3)&(&,,+)'G)#(/7;)%)O_9I2328/@=+4A$1?$*$'4")".(,3+!#,,*)&*A.,*?037684E:69DC:64846G=823652<9>?16HEE;:9350/685=4865:68/6;<68@A32A653=471240./+3<4202-240I3,2.((.4.(.74'6&"&'6*,3),'(148..(5(--743.,31(&;,12?+#&)($ !"!)103K-!#.(,&/8>.-+0-/27;9c61;NB>\D7LP;==:66:C974a<@:>@734697D<4486552097?:4678<756:P75CE;;5D1,675A.8@2454/6018,48717.,.,(/--,01+'&&,&&(()'$))(*.,277;0!653020/07.5-'*+//6D$"#&G,B2 !"%& $>65++(.;7/474>163I;;?<7;MR?FA<<?06;?581313963266566746;]<52797:97>C=D79~_>=:5:@CB94.14<-))@02;BA0C..56E/-32+&&0)2+&)$'/')/0+,)(3Q)23D,'/8:XSW9LX.**)0'!"!2$#-'++!-$%&$#,4)%,,+(5/2;54053?D8_;B;=>M@ARTFcy͓aiwREINaR169:579CL56`>;0,44B:Py;BB>>E6;45=5/3<<59542/5526=?HGD542?15736:<49D6M7;MQ:6:684X7>=51.-/1)4%)./.0/*.;3:4/579+&)*.2$-$2H-(075.68'(,8*' (+,EbM::6B-/)+('   #(##"&"!$%*%&.1A&'',2234@9L/;;5869BD@?E=<9;;Ab]dYynRUc\R\NL?9:<658;258;bC77-48<@W6>U=2/5:B<9<;8=9577;7:5578=R]D505?>604<57:9;O597:C-:4;;64UB\O403)12.92+2//+5.-85,.H6=7/+3.";1*(*)155KA5R31+&!+%.(181+,13A1'&+9' &6 )#0-$$,)#&')I,)($*!&0,*12057599389=>C96I9<58?>8DLPOQVUKYXSMXT3=:3<8@jTS8?;BA:?725>\=6996EF555=C<:CH]O<-'3/0/2,01'$''+*,)1K=VUD5+46Q1'$#84++")J++-$)!(P"$"!)&(.'%&$('"$$$("%),(6?J8.252=8620:@9@<8D4FF>=G?dIHJZUQYtYP_?FP8;9J;730L1035;4@/ABJ769ZGA=5032969=8/7E475,%)88<4?-74.-.0130*,,-(13c-1;5/28:16:726*2'$*/,,6;ZLPeF7.=>.,H*:*()*"#K!,<**$ -:$"&#%; .($#*%$*/$%*%$+*39.3-.46.4+9@24;B?85C??>=CTG;>CBGMTsmTMK;437=AB7,81,.=?3;57:>:D79;OG05?95696=MDA;977<588@=444727.1/047;i35:34470701/72112,,52>:22/-2.39J\kD;3/7*%')$'&1./:Z:?rUWRg%&+1+M,*LB><%(-.%#!'!#(!#"!+$(+%"%&%*8&++,1,+33.350/094/0:693;289?AG]ESE@?E@E[\J226494@]55;5532;42263332<>@7<7<<<5:13>>88?SOVUPl;F>>733<;28570:41516A?Q54?11;80O.-+52-/13.5>?GA0+2@@GˮeKA41+0'+)#+A11QQ92OA:;/<0-+0*=+68+.,)$S ,! 8#"-7.-14%$#" #$"'2(*+-()',0.2,622:7..4124831;;BGY^O@JL9BNLN`VL<07:;9BF8F-12;968747207765959;59644:C9<99FSPbl_JCCA<642066524/30*1206A8P//42.0.+),)-F,&:6658<9S;.*,=jvĦ^S:,1(-;5'&#;3C9D<0)2+4)(-()'A*4'+.2;25!! 0"  #"&( #97,5-%!$$*,.5,&,1-2.1)-.//74.123/3:3:9:BVKHWGOF:;8BD^AZ=352:68M<=40.<35?C;42538415/9HD703:FjD?A@?CZzwpLLA6765303O2763242:73>249685:-86/),3,+-3.1;,8:;=.(-QKzskfYG>*-#'8$%>./1:E;:)-31*%+&"+-8%,O.><:0' ""'!+$>$+ $(?, #$$)I*(6-+*.-($&+,3>C,13409,1:;37I;HklGJK:88BG5F8079<7306:/6=67584?24?:OcvkLA4774628,481475>;A7511A=C3611.(.8)*31())6:Ug418.+>@LOOW]J>') "%$ &*)5.bP*E1*)(%#D0'$?7I,/J/5%  2/"K%4!*!%'''#*A%,1+(052'*(*,-/a6114.8026934C6=IXOoGEB6.#)-::5500526:7F;2BA/3A47=>T=>5555>?1;=?6548@_<261H8;352:)20/1*(2DH,D3'/-9M_aRI@9-&"%%.)+''(%1^),F/1"$)&9*%<"5=#20*$$$!""%3-#*&#!"###&%(%+(-,E8,+*-//344+,6/C/,436-19:XEUIMOI::'$.092/5)/3;18:8903532:0878?;78;?5OA<5L=3:-B*3D=./,./-:,@>++3-+/*--C>J=261*)&&$ * #(" '&%/#%. #('%&(("%0%*$#& &*'!.#/38!!!" $ )(.&',(%5,**-/3(61:/,27/01340C5:LT@7?25489855=96;967755=B;66IMKMPh\BG6<9;11.45A:2/=4.823092/=-/101-52285<3900;33724,04/0,26*%$+%$ '!!1&'.$""'%*&(&++'D/&/)&" $2!&#=F89!,  '"%! , )M*'(&)+.+00*,).+3.54*?0773669A4954:=786A97.=,<5C336840)../1+*+,)()$+%$$&,!8!!(""& (%,!%>7%+.3("# $$B3" 8#!,'#*"-"#% )%$ $8+)&(0:B+04+4/514.2//59;12356;=BM=7D>@7F7DNL7-/..44/,-520*89@49EU<<1886643D51<@B>63040624,*B0G/*2/*.->OO>:H984275D636,0128@G?1-/1462,194921,n?\abc:4-02.-++3-)*%$*))'(($"*&5!& &  ((#$&,"! &$% ! 5G[5+(!!!", #).1'0.(2+.-(.2K@-*+)51621<8HM>9;>6>AE867?Zx?845667,9/2T732-7-40694>I<8>77554GKg0-3;>>E75;]@>>81Jz89P=C9CA75261**8BO?00314.,+,329K646:5~eF32<9=C2789DNUM@?;C310481713454/5/2;92/0344>H.4+19BVY810%(2,(/0-4.:5#V*"#""$ '-"$"'$ !08'*$(*''!'#$'%"')3/)$##%+)&07-!#'V84*+'")07*&8,'9 """[e)'$,#+.:]/+5*A7,**(8,1..3,.-"-.6,=G86EFcc18AOG5528-.)<8+&T<3041+**.++,27?80;I=<-5+0F9:92>7604+-'*/M0.ZkJ45j9--)+%%2<%//!+'!0')!F%)&B3MeVd?9.)+ ))BET*#""",.ei--?*7?5),33.(-1-0--'/83-4.-3;5<@5NqO9-/&0+/0+1+-5/E3*02-+-.+6<236>vggF43006,56,4199//821/127/3368<7:;68C=;3768<56F-124A2',,B8Z311*-6);!&$#'D5'hZW52F8'0$#,5a(!#(!5! !, '(!+".*?1%%0.B_01  $?5eE$ %*$"$2110^,0<0,4;rM7+,40/.&(59/7@*8;=/:,?7,543%(*3:6(2-+*-#).9*,(.13-556JmaKSC50,,;6153,..**-3*14.4,04176845@88668;2755?3.-5=2.)45/*.(--%#*A&)81()&4&.>N?BS,*%)&(%#"'3- +! ,!%31.<$&=bcܝ[S-)" !%/.V*!!#,+"&!+,+D-'8>I>O8068+-+"&16*-42CG)+=-(5+#)(04,--)!**).$$)(+4('6/@199.AUeNGK>,*(*2-&*,*-3/4.,/-./-0./646/726L5>/V33431/*0;;,8'4*,3/$"',!&,5%'%'%%+ %&3<-%D-$"&$!""1&#*! ((263:@7ICWȇnlq-H)!$ %%'"#".*"%%**()9-8Hop_M8($((%'&%%+,)-(*&6+=D+3:.+,((,*/))+$((%$-&%--3+,)%)(2:?IGIA*-)'*(+0,02*+/0+*-6:0-1.--2/324671>874445-H207510?01-%&;#$08$&%*%$$%$ ! M,3+/J$%!!7,(C*K(#9(()IQMKht3%%72!,I%Y4)%+-8@<./6?gi`GW9A-4.&/)%+)))+./,/4-+*(%23)+!"-'-/.*$%'/(%+*R&1**+1>A*029.0(,&$(4$(E.0.00*1')',1-0/O1545CB:2:."& -M1%$5<>?A,7D&&&'D)'3+%%#*,&(# '*6C,&#&$%%!$%'),+,(+)2,150;+-3$'"/(#-+>TN1,,%.I)).13B1163003592=9M>B>3?71>?>/(+./##&+%0 +6")"&'(.H'A"-"56Nd.%63C &A!'#4/CV`K35M/*>'%$$!;!&#%$+R6+ )OvG:xyVvU:1A+G*#$+&(,(##$%#"*%$$##'),*$%&+,I1)-$(%!(!#" '#()+&&($!#+%(&($"#.%+"%4_'0F.20..1/3\33bER18K9JHD?C45=294#'('$%+*'((*&5"2#)(#4 4E"")"''$#P(-XK9+E87>5IL"' "([Q'&%%)G]C:EAZbEM,:-C)("&$&!#)%% "$(.'&!'$&("'$$"&22&'**&"! ! ! ./2% &)/#!#&%2!%%,% %&$7*-;4-'0/7=0?54((&-"" !! !"&#%&V-(5#2! $$2+V 0-*38 !#G""2Z*'#),.- ,$%(M%#$$#/SH=<33gG4,+!*!%"$*%#/%( $+##$ #"%# ")(')9Q&'/*$&!$!!$*%5'$" !$'%#$( &($%%$!)0?;,';5:?2;]YdY]?71&.8..;2.-6*')"""+)*) #!$!9/$"1)*1 # :;8')/'$*;%3-%",%:c=)/"%*WOM3/4qV7( %$,(!)#&!)+"'*&)$%!#'#"""'%5#=o!$(("$") $"!!%"!!!+!&-+.($%#)"#$223iG003?F=88fN^VF/.,(7-)( (.'(,"'')+#' $$..G/)7F&"" +#,+"#&B)*!2+P;7)2(F8VFA/52:4-/%"'6*'0%!%)%++$#,( $"# %#)#&$)2' "(-&#""?5/$ )$!> %#+  -! &!2:-&""%]Z9)0',c"0K*-&!5%"##C-"7",2/+0&*!#!##'&!!$"#" !%-#'#$#"%(*%397D7,IWbF9-+ )?9C#!4,!# , $ "(/$# (+& .uf=&%&$,)G'=EG',&+ ")$"$'!!#)-A404*#'!'& #"#"&131##" $'!$  " +"!!* 3#'&%)-21ZH("+""$#7#?!#E& -+E 4J3*"'"#;.-,# )$&#!7#!!#*^1#X#!$&"!(#!!.1D1,' %&"%## "#!&#$ ( ( ,(,&'$!=+)W$7%*$")% 1, " %',C,9!"$$7,/-*$ "$ !$%&%'&:4()M(" !"%(!"$!!#*$"#$ $(% !%#)$"! ! "!%@$%$$""% )&$ 2 +% !!"# $"  !! ""$ , "#%&4(*'$-0''-1)%'>_-(+.-ARGNpZ<;G3?j:)/,.)0-/+)'2&">F'+)&(&*,'$3+*+)2%,-,++((.7,,110.-02490312J/253.0/808/8>38+1*)" %+J89-AYEA0*(.-,/('',+,(%&&%)*);>'%+,+(+(1,+-.('.,,7=301100524455>3066544;?29,,3<61*./.250#$5,,0+L?;EGA:FB@DH==@723014019-&(46B/36:457I]PEMJM?9Y?M49,.),*)F$#&)'.-$$# ('79 !"1%#3###)"7"!"  +9'*-%*('-*,;-3+1(&/&2#&#%-(-+.52/0>7?S01)')%$&&&)+*,$&&+15))(&*)''((%%(',%&,,),?@237/52,-,.+//427A:;>D8<>786;;7B52-2C487,$9?A?3878IEM_QMAGF;>06>@2,+*, %+(!"1*+.  # 4 -&#%%+ +'!(( "$ $#!%#*'):1"+(&'&!-.,7<.,/%# "+5*-)/*3/)+042;@0*+.)&%(*'+.-/0&2/$"%-G(&(%$%%''((&)+01F455212:/2-)+-/362159U=Z<:9>HC<3AHUN6../+/%-*%(*$&#$" !A"&!!( "$#$ # /$5))&+(A>==IE5/32HVJCN<1/=5009OFAONLYGJDHMYeKG@8/+*1'(/)$&'$"""%&"' -#9 0:M "!. $% #: ") #'?.4=0,P*(&--(,>&))-&/>dx,,(&#%&)+4)+,06,))*,2>FA_51/*)&(+%$*))'"*%3+=#&()($$&*')++)),-+0./+-*,./9134=814513,24F>SG=@9<9=A>A2:n==Fe=++8/7H?BBGKYr>I;ebCB=FK/-3,,-/"$$!!%,+& " ! , ;&+'&!%)0$! ()$=A%*/:1(&'')/7)5C.>/',476('&.*/*(-,/-+;.&(,'(-3PN;/,&&&(6('&)D,#%%)(*)#"&%(&&((**(+),,+'+,/-/--+=,.62519=A7-/4<@M6;75IK8L@D?8+(3]VHHE|zJTJC',5,,+(#""+,?bh?+-3*'%'/(%)-4*+-&'$%##$'5$&*)(#)*))(+,++*+3/3/.1*+2249::53-2CQ@QC?PF=K@?57479jGD:;8?64ED>DEFOJD=bISSRQ>A?<-,5@50'&&)(%8 !!"!" ) '"!,0%J.0$ ,   "! +)#%"*5H#$%:-1+.'+,**<+.03**E64').+,)'&$*,.',..,))'"+7-4i:',*%+."6?)).6-0)%'0+&%%))'(&%(+,'&'',')***-0Yb1It3,-277644/788=7>=KJGFF\_R[A754.33.32('(:9<-!"!"$  !,%*+# 9 !%"!"%!"$('=I1@N3,4L;8%..()4O($&('.'(&,=2-+%#%#()6+)+**)()##"')(%>R&#"#%&)--).)/5(($*'))'%%&$%)('%&('*',*'+,103555?20-74636328598>=?@I>A:BC?34?`7bmBzC665567//11/=?><>:=FDFj532ADF8;945::9700LZQTj|VRHE?70782/2,21/*+1/'$&#%"!# " !!"$!"'@"!# (!#. !!## "#9'3)./-,.132-%.H0/*4+'&#$!"%"!"!,-*((,(%++/)*&8&%"E&#$%>&&%$$%%%#*$%'+),)*)238(4,&*)*.-,++,).,,.6.5-010+''()010)-A^57798345.03;@A9?LA;EB>:767]LRE9;36;<59).GGPSJHRG:7487--,1<-*),*995&#%##$ %!!"" ! #&!, %%!"' . -"&D7%" %(%/"$+'+3.<93>2@,/.-+-)(.*/$"&,-"# $'%'"$('$#')$&&''')%$$%/#$'%'(*(')P'0)'=,*$$%%.k3(*-)-*/A+-5+++/16113.--:-..-043..,15102751681.335<8J;AE==H<988:8>;?:446883*#DLIdIKIQ;=@8>4,,81+*81)((4-((#%'$%8$)$"%""*37"(  =6 $#"#H#$!!'##%#)'&+:/272'$*MW6560+)+-&!()+-&%'+)%!"('%((('+(#$'&"%*-&&-%$&%%'&,/'$*'*$#(&,+..,(,.+,-23.,'.0..262255/-.,/32/,1.-=3232549440.410=FLA@;=:F?@9<56G:]E5655767-)-CKEROKNJBIE7H5<-*(+*)-,6*)&%&$'&'"%-"#!!! $#5'$'%))w .'\'%$#$! *#"$((0',+7?;.-.(BwQ-.D+)*!)$%/)(&(++5%!%('(&[('#%'%&$$$'),,,(%"(&'&($('''%$&*,01,/.**),1+*+3+/1,-1.,4+24554.07<<72319211+7<@7:546.16:K:?Q>78?A=;89I8?=558777822.7\hsXSPNHCB;20543323--:)('"&%%%$""!" "#()  **! !# &!##&"(,&# $!#%'#" "%/-(&/1-2,K;-SϗE'#*.%&)0'*'(*&(*)'+"&#'&%%'&%#"&(#%%$$ #'%%$'&')%('()(&'('&7-)),+*))*11/+.1.1:4//,0/11>:?6764--+-88DLMRLhKAQ867571.0,1>*'*'.-$%#-=+%(" "&$'&$# 6 2!l!" &7/$"!! ')!$6$&##'%b1$$!#%>5UPQ6#&#&5/%)(('+),**&&$(&!%&$&*2'()&)+%-(*+)(*'&()))*$(''&)))->2.*4383/03/9775613C.334041,00796B9?E:>;A437325104<35;:79<8C48><8=I:7:6588741()/;KLcTHLIEDT3:>5470.++%,/*(-3)'&-",%*# #" %')()%$"#. *+# &%+# %!$ *##!$%!# "/#""$$&%$%)!(007.#,3*)+(%.'.-1+/.,'##%&'(&+)&(,,($(,,&*,,)(),,+-**(',)*())+20,,*/*,0./03801/57:308;2.1+,25K79;N=20799454445434J88B?88:<846;=7@DF==A=;?:788;@;314.38KA=G`JWA93;99540*+(',*++/<5/).''&#-%(*:!#;&#$%( *%&$# "-*(**/-*)+D-*,*228*(,/,+*)&,)*,--+,-0/++,3/.,.*11-.29443?7012,162,25:WH9114308864<537676116<<;::4<3:899=AD>?:;;;:=:9AB85347:5C.*+1+&)30/1/4:<5<44314211>?=;>40207<9=JK<=<;;=>>?C:;>;:;::5@XWKbI:-,1(+--),)))29>,) %!)$'###'#",* $$5 #$"XV5 %=%-&!&! "!" ! $#$%!&&%($$%.762I^667*$)..(+)74?.+%%$(&)),**/.*,.7,---3;8+.++.391012.46-+25/+1/-1//0.D.-7406=DK5806140.12;:;D6664E30434K882=>42323ES:851..6775=?DB<:97:97>@:===:8>=ED@EEBMB;DBV=I3020-1..+*8-'2+0,%!###" #$KF*C/*#$+ ($CA4!"B%&B$!"&"#&#*%%"$%(')'$+35VsC5.0*<2&'-.+6,2**&(%,71*(*.4>20-04/+.1/1211=353B94@;4<:4/033..-.+414?9494/?MK510-700-/12175701<:9/2=4@;?426683312886590223399CDBG996;;;C=>?@D?48=HQ;<@>CRF=DHHC35550/),*,-&3l5+-'"%('% !%%*$ #'+& $-! ; 3%,"2^$(! %)" "!%"!1%##$$$*"$&()1-10;cW789,403/,.+-+'*))(0010-+,//4@0.-8695C/.2371>:<7=<;@06:<658:4=/./0-.002676F97@1113*,,1,,01:/324B9=G578<66843=:86338575A?=@AG<9@<>@9>;IA998>RCCE=A@ET^TJIA41/41/.+(,)(6a@(("($*##! !,&$.$#("#!4$ #$!"$  $ 4 /.)  ##!% )""("#&)/$%$$(& !/-4:_JJ./3/6314./))*0;-,1,/,211.*,+/00==:554225085:96S7583048510.600..02..0/14//-8<60UC:20,.-1+0/34<654A<6;DWK;7?67=<67\>66642288B@;:;?D9/.)/('ML3;####$'"$"% ."!#"#"%&%"2#  %#*(:!""" ""#!"$"##/C+%!$&%7*FW=9HKKH122.,,7<=41,-/82+*.)*634306330221650987602764JG329601212-1.b723530.0C.0,-5*,179910C829:6A52375-4469A=?C@?<>;48AA@>:88323H9;IbyceN91/32.1'+***&$%$'$%'$$&%#%$%%!!'!%'"8,-*. $+"$  !"($#$ % $.*$#"$&-?580WD9:42,-1)*07?SC?11-,2++*&/412..0,.6<455O8986564;27;30354/P2201281657;1422010--+*/3KJ63,,..)0+,.04>;&&+/58A?;>:3/734379..0L4-.2@=JBQLH;A:8<><:=99A?K3740$':;FOVrKJJ<8B30.+****$'($'/'& %## !%" &!!"((*#'%/,1!!! &$ ("!"#$ # "$$"#!*'2*5:IC53BA2*,.5@32/1410.7%*+-,)(473.021;8;=?4;=76;6:;22376632347;=9634364>768333/31/.,,32B6:b3*.>+,--26325A(*.34H7=<8><8958=<<;7=DAA<;0+(()7[kYPACA623.;/*'&%#&&%*'%&'# $%%'# ""$&($/B%&! $&$  (*! #1 -'&1&'%"! !$#&((&%-7)1-=E08@747Q984677599::<:5067957;948640496314420023/255:941334./0:G176:?L56/4<6/557?X43/F=P7)*1502J.3[>><>?<=;>8899?<:>E^FU5(&)')Wx_saM@6C3.///'2''&,"$*'*"*&'&&$#$""$&-,)M3$!"%  +(!'#$3-9#!$#( 5"!#(+# -&&0($&&#',%)2=~P4042U;:P33521333010547277<=9NA;@=86:=9969<86@?:A<::;:89:;=<747552/L17132171272;A:P>342340-0/13925,48=466516>9;032VA2+(/34302,0D@>=<>;>=:<9:@>@AACE>4.'J5(:IINLEEI29/,051*)%'")1##&&0&&*'%$$!#$(! "#$0':*/($* !!!''!(D6""$$#)#"",+'""  #%.'"$)'"&$'29:@V5446=5F40:?/.10/:2258<=;>?:?@A9:779:=F<9=:686450.32002546573>@G3?4465>.213//2704>+.281G18871769?<0-.2342610@?;;;9K?;:?9?.0.'',(F(&('()##$+*&'&&%###""-Ll2%$ "###!!$! $$+) ""#?!$93((&'2!$&!"!$$&,"*&%'-,)0;5479>1/8539C:,.362:738?@<;<>@A8>Q;@::??I;;;;>GHCJJ?<@DJ8IA;B?9543211005146163/84LPD=46?A>?51124E1(,00,/7D9.0/:36;5667F<434056-38;=;:>9?D;??B;Am*!)"" (!,&5#8#( ## "!%3:1..("" %'$,$)'('$&&()'+++,00AVR5?74722.6385;E68<;Yi?;<4=9>@44.55SI:05408D24-9-04435349=787899B30B9;;7;@;?6E?\D=?B>9;10(#+/>BNPKS=82670*..+.-+)%)&/*+$&&!"*)%&Lg%'&$&(;'! 3(>7!"$ !!!#/6;''A#$%%!! #);!"1!'()),0-5/9???@L@`JBECLIFIDLILCNHNPB;<=??9?;>9:;7777788912006?;;755;;=36277EMy56546965119590361586636=SE?5194<9:<=<;87=?B>=A<>841)%,11=BHJHH<;3341.3//',)(($,+#&%#%&$$")&+.+$&!)(" " 1!(.0"*&%% "" #%7o?)(!$"%%(3#%$"$%+!#',277M5\EK>29736668:BB:8:@99>:;@>DC?DQGAMHdXHFOAIBHMIILK?AB@BJGC=ADDA>:;;;9;8979>9><5743<@UG>==8;:854>?>A659144G3:1975>7FD>Sd<;?:?EJ618<3;?6;=7==8=C???A>939/*031LF>KNI<48705-4**4)'')-(&&"### %&'9*u=" !,0###)"!"',(% !!!"!//)/$*'-$"*%$"!# ##,+13/8:=IDA86<>8=>@E@EDELCLzO=<@K::8AHLED@AA>:<;??<@969;>?E<@;742423559377?=<9X?N;889A945BB;=96@>IGP@DBCD??9754")11.1>@D?:5645.+,7.1+*&''&+%  ##-/.8&" $,+# B##(5!!"$$ #J+2'('$$%:=''*%"$'($&)+:703:>EF;ZWH@8:A<:<854<<>=<>A?B=A@@?CAB?>ACDBG><:=@B6849432<;6:;88=IG<<@L852/>D>=::8:CFC@K@AC=@:79>"/;716A=:>987:/,120/;&&(0&&%#$"##%$$)7N($)!"" (!#(' >&&(3#&!  $2!!)'&+M('&+$"#&'&#/7:S224=:J>ES>=37:>:CD799:?=>KJH=;;?NE>ETDIAHGHCINOKMWNKEHFKG64BSZ=?INTQKIICMKLF@B>FEG?C?@DCABAFGMFJBF@H@@I;5KA:DIE>C8;;;@5==<;<9;99>B6234?>>6>>A@?B;=B?>>D@AB>>KB@N=>=6./0./(,-+#*#&%%$!""$#"'((($$"" " &' !3$!%$%###)(" !%" $ $,&;:+(334<=;A=<@AOZ9479<;A:=?A9@9/17E?79B<=@A789=89;68;97773;=NB=GCB798????KCCJo?;F=/%&18@VDDB>=83:;FC@>=CAC99:=<9@::=D=7:2D8DD<73:579;=>EACGDCCH:@,)1=8@FIHMA<2*-.0074[5&1('&"&+'"#$$#%5*%&&#")"0/!!  *'$'" "*!'#%!#&"""*'"$/.%$*91)/.,-+3;@48/214;?KH<6:J>?I]F@P>JAEMADGQEVkgyqf|urWPW_b^YLXaaeUUUMJhhlZLc`no]WTX__[WPKONXPMP[RLKILIKCEPB=11=B@FDCA;:6;B469<>=BBCB=>?>4'6F=?B?GBJH;-0;73./3,*#()%'&$+# #"!!$''&!)%!"$&$ !"% '*!#$,;(&"+$$&" )(+2.$&-2*+*,06).6S54024/,-.0/346==SpECNBAEBDBCDFQZ`eZavYd~cb`MMXLNQ`Ob|fwa[UDI[_{aUWWofcocj{a[XXT^TRPQTVUXVRKKLIGLG70.;DIPMHIAj_E:32<:@AZFCAB=<7@<>??0+/6CHC=>7;:65<9>HBEI>DF?/*1A<9AAGFJJ7D9=98/,)**,&&(%%($$$&"'#"')*$= """)! <%#$'$#1#&#""#/) ##*!&*$+'6+*+6'-11.--+/1*.097::85.522:>;??=9=B@>C>BED@GTP`\ac\WaunZ_xfX[VRLYWQPHRTSZVLRVc\bvoj[Xc\fgfndd`oeTZbcbfYTUTQNKKKQNK<:>AEKLLFMMOD?A9IY3@POFBGD?9469>?ACJGGAA1()1/K?A@EAD4<754.-+)+**%')(###$$%/"'%& %#"#%(($!&$",0H" )("%#"!%$(#$,.'+'$%./@E3-2.-,/7246515468D5:Q=597=@?>9GA@8GFIDREFM__uin\__bUYUNISCIIPHKSOTi`db^pqsa[Sd][_a_bzr`fXJKU\XYSXWNMLOUTPMH@FFHHIIN`WOT8=:D;=HLQJEEC:;@C@H<5364AADH?><;:;=@DLEHFBFAA>@./2:=DC>>98:9>;3/.-,*-,%"&&&$'('#%#,$!##!""""&$!#*!!';S# %(13628$#*%" #"$"/*+(+)'&(/*()2,0.45;50@94589?K?>;;A746;5BOW>?CDLJGFFIGWQoqSNTT[`XUNJQINLNRPRJ[[m[^heZY]ie[[\c^Z`e^l]_mhXUQPWTVTSTPYTV[WZTNNCDJKRTQO^MJJHiA;@GIECA7ADBEA;;4EI2:QEAGD<9=<8@@FEDCFKFCBd&(1768;HA<:99@885?011,0%#,(#$%%%((&'(&"!3 "#&$#$($"##"'2245ihJ('(%#38I#)=*).%*3$,0.322:9J;23958A:D946:>49923324>B?EIE27F3/?>BEEDDD<@6+('%%6=BD>;9>5;7<7F9-3'(*!& #$$)+/''*(#!!!!" #%4'#1&#!$*! ,C0(3X@%#% #'/V$(/1)1.7&0-,=-11?8GF?8;?634330.3-*EDJ[IGNFcTDTIJRZW\^dQVOMTZ\ZWLOVQTPVZTRaYUS]aea_fe`W][^c`Rjc_a[VUUSPXfTWW`W]Z^WSYNUQTT^wSSSQUIEKNLJJIC<>DADNHC@736:AVNp>::5<@8;;8>8867_:2)$&#$%%&$&$)7+*&(#"!$!#$#%3 ##",%('#L7/;6'$&&%"'""<(-),4-2-3/+/1>2K6257IK8:;;EHGA;8:763663;7-66<55FRGS]SNKINPKOROU_VUSTVINVnNLIPQ\LOTSXW]\]`dcxld_^\_a\`eba]`]VYURSSSXUWQTVnbWWNPQSURU]]QVORR[RHIJKHGIB?BCBDBAL86681.)''$#%5#$ )%,&%$#")##"#$' " $#%C+%!&B7*$.)$""#&.=),%'-*-.*,2/.207D=26EDF>846IOO;<=86425@O9>5388>BB@JJ_jPJ@HPUKJ_KOSTPWNKIKMPPP@DOTKT[j_]V\YY\c^fma^`g]abjxeaba^WVYb]RORYRRSWUWXVUYUUYZUTQLPPURJKGFHKILJAFCBDB<<;:;9ECOCEAD@;8?A@DEFIBFCLH<+0&9@@C><=>D<9784391-'(%$#+(+%9%$$"#""#$# #&"#$ !!"%$!%(!(&,-*%&'%%),-(./)/***(%++9AF;8??:8;57683145>?76,/3AH4A@EG?BFE@ESTKWPQMBLMEWRUURTOPKGJMNJON><8:<<GH9>><;68677:9T/*.,$$'&&)''*)2!(##$-4<."")" $&!%% $)))+")6)&*/*)-4()(''*028<@8:26786658474B;9513254608:AU??CCCBDKWGHMVQCBAFOHLFfMIKVFHKHDHDBIQSPa]Z[\TSWXa][^^\\]Y]]bfimcttmga^^ZZTVQQOUSTSYXYVQVX[WSYTUWSRPIRLKIFGH@EFB@CIFEBA=?979=FB@6339CMEICGD=G?76>7%HQTCCFQsYTTWBKIKNKRLATFF=HDEIIA;B>ERY\][\ZSPZc]n[]cbbg`Z^d_bhijdpkklde\WY[_STSWVW]WUORQUaZXWZZTSROMNNJFFHGA@BA@JYGECDA:35>?N8;<57>DF@FCDCNFA93?%5?<=<6625./)'*'&'*+!%!$$&,)! %/"""(&&$#%#"(.)=#!%#B''))&+%(;'&**+,052<4:8CPUC?=H?;;=;<8>6<7065419ABTNEIIUI?BAEShURPXTSISLPXQDME;6:@=AJB@=DKU^[WX[]\X^^XZZ^ixmgcm[\]acebklmtmhg`acbaZZPSUUUXWWRRUV][WU_TURSMTNLLPKHBCA?BBDCDGFLV855D;<86348441+;=9=:>;<:<3155*)(,&)&)&%#'%(+)$0-&!&$%$"%"'(# "&$(&&%"$&%8)'(:**##('$(.0.651:BGWpOA48;?G;@=8946<8.218>B:PHKMEOXIJCGGHMMK@IS`TW`ZJEIIA8269>AA>CIJMNWVYWZ]a[ZZ[V^^bhdedee][Y\checmfkfhlkjljc]\X\[VVWWSVYYZ[^ZWTTVWRRSPOQMKGEGEKIDGGDGCGA66<=:710*7=EFHFKIFE@8-,1<51>?;GS<:8832:))'6+*%##'# $$#"!%&# "$((*),EFJIGAKLQ]^aqLEHVH>:7>>85Q[CF9E;GSF>796578431+00/5>VGDSE@DH]YHNNODFUENNGV[PHIKHFAISKMIFMRGEFCEA9>;1+)19>CCBJUGC@@EM=7/*,/+3*-,(# +#%%%)92$!#("$"#-/-%&'H !&#"+$#$1#)()+%" " *1--/0225<=:>A@[J?M=@;97?8>964.1.35GC@=@=@DBGFAD>NLGDA@3;;^_QJNPHEHGE@HKKQUXRXSUXYVT[Wsusf`_]_bigc]Z_`cpsyrkl`bgimuptnlqsxfb]^`aYYd`]\bf^gVVQY\YUQQB;EMLKHHIMJHF??@A@?4*%38BGDDDGF>?@CFD3*2:87:@A<:=>GIHKIHFFBGKJJORUVSTTZWRVYbaeekfa[_db_ZY^[antqgzt~ntqgjnos|||tmrst`_\_]Yb\Y[cbgdk`WXYcW_UJDIJLMIPKKMIJDAFFFE8>-28CEGG@EIEF;?QV69NEE8?;9:668./20)%%)&%),&%))..1%('*&%(''&&26&$&*#.&(%#"$%%()+%"#'**,/02..587B9??lV@AD7?=S::66432=89?BV\CGHJDJIFFKMKHUKOKE@GHWPKQQ`XRU_bhn\`ccqlc\oqidQIRPR\amdia\[arm}{uk`k{ywhqzylffl]WZjV_Y]_eeuql_c^TMKVKEKHQOKPNPULI=@FCA>3'3@GBFFBCH=15@DBD;CEICB>FC??;47197)%'),)()%,-*,(()$$'''$'&'&*'"-0((((%+#(&+('&&)(*1)1624.@=BaI;O=AI>?G@@GBN<37756@?<44CMADFAMBW8>AJeVNIY[QNHHYSGGIHH@?=HMWNNLRSWYUY`___h`chkhpyyo]IFM^ihkszuibkikqtutpusq|rymr|qlfha\XihmaZY]`tqyt_a]UOQQEIVPNPTQMLLIH@BI<:.?B<CHI=;71++*,+%(&$),*('(*E;>'&%$+&&'&9L%&"%%(,+#'%#%!&&)-*2G199N@HtS>C;6:B;66::HEE96D?3>;:8;>?BBBIIGOBFI\QaNPMLQPBHIMVC?99@JALOMGKNP]XTOLhtdXmTTYTVZdbbbaSV^hkx{{umbejt{{x||zr{~{pifdbas_X[^[cp~udba\RRMOGGNZOLMONMHJ@@A>@>oLA?DBIDBFM<23;5644:TNI;FALLE<>=<>TBG;9>40:-,*'-,/+(*&(+-,8^@.+(#)M0''0%.''&)(3K.)$%%%(&(/+16=T6_SzlRFSB<:7;76155YEEVrulR?DGLQHGKOOL\W?GFOIACDBKFVGC945<>CBBPACGNUUUQT[UOV]QUh\\]^bfemstprxo{slr~yh{yqzwrztyu}xsoqtkfnnij`aabggmofhfh]\SOC7@HR@62/0..,51))+)&%(/++,+66+(%'+I@1$'$&$&&%&2))'&&'# %,12<7;>Tf[l}zgGC98=;9=21=:m]ry|lQONV_RXVUPidKHPYZJNEBFGADG;737?=?@FINMMU]XUXUUYVWaTZab]`^c^`bjtuqoxysx~~o|zpkjqkrplpjkkhmb`fhukgi~rd_ULD9@QPOWQQKFAGK_cFDIHDD?=@B@KLRQSX\]XV^VWYam^`oeejgde\bijnh{erwz||kdfjzxywropnrkbehjytisupc_XB69?GKTSOKEC@JXFCCEHE73??B=DIIRUPK=GBFB@GCCDAH74533<:11-*))+1((,*@37++0/@1,0:.%&'$&+)*)-*/.,%'6%,-0GADi_fbZNaoYBB?<<=F229=Kunttgpgk~\RRYIBMIIJGB@9?239AG?FKKKLUUb^[UYbUW_|enjhinnqjoghijpumht}}|xt}|~}ifiqwtrt{mqskfiqpqipk}deRB>ELKQW[LC57GGYC<>@87>?ACAACFQKRKC6)1>99P;;::;Hp|zz\UWULPIFGIIEDEG6G?FCGCEIJMPYSS^\YZ^aa`plqoqonsrvboux}gh\~~hbhjpuiv~wqryoodwqymiqrplgl[HMLXMQTRLIG:GHfNGB9>;DB@B@UMN`LMB=)#7@JMNTMCH6;9DRM:80/+))),+/-+--/;.2E**+'+1*&&)+*),-2&((+'))&-'EI?JHQ]ugaZYZ_HE_FL=8=DHGVyeWYXMGHIJHFFJT]g7J?FCFBFFKNRO[_aagkmcdnqvzpu}{krnr~j`kvrwvonst~vsitqkegqZQUUPIOLLFD6@:>@FGKXOPJROAHY?FMSGB=B?>K;Qwf5.-/*)(,1//)+*..e605)'&'*/0)+/*)))+,(-(+*,/*.01LD;S>Fpe\BP@MNRBCAA==8:=DFPXwɽǑsdbaWOJDFGGCKIH_P68;>BFC;KZVY\U]\bUhwnuzr|gs{{uz|x|ujtt|{~wyvo}oklgcjnx_SQKJEJRODELJ;BK@B<96<9:FGTTWUTQD;?@HVbqݱsfUVLIGEJB=FIBkL@DCFEIHMQTW__Z[W_bhzx~tlnnrxҵ~zurp{nx}~ztywyu{tpocedd`_jfdSVIYRSZR9KS=9AAD@4353>9>EIU]SRNLU]JIEFLGB@<EJXdnٺzaUMKKGHB;=@AECJLVRNN[`dY?LFCJA:9>?<<:44912.2524/&',*26G?Nb0'$(V2+/-.,/40()-.0))),;0+22??AA<@>F?;HNQLOm<68T97:>>IU]tïvbYUPKD<;;8;,*3GHGNMPQXV[\UWT^be_nnniqy~uqytnpznkiziktefinq~|}vmst}r~u{kkilabcmnk]WPMOTUSMJNDPaJUKF@66665BCFKPLNSYjmdMCnDC98:BG><4449K07-659=.0(*35@[qE,$%*,+/*.%(,.,*3+,*+(/4<-7,-::FU<6?JDDCDVBAC516:839>?HT[p˯{fWSUJC:;971*M>JNXRVbfecgZb^_cb\Ybqhpx{~zvsvupxwzma^cci`wwv{wwbxmyvyxjxvyzy}moea\dorf]YTRTTRPQKVIMQOQOHH;><;=@BEJQOS_^`Y\ZWB@<8;WFO?9653E00.3;4,2(.?3712CWI+#*'.,,.'-#'&(/-)((+/+.11*3=B@BB87>>A?EO?78G311246=5BpQUUbdgbiiaeje`ijhjftknr|~|{oeitzvl^afnqsqoqlso~y{gc{zzqmzz_gdcrh`a]X]XPXXVPTOLOOPLJHA>@=?D=CrMXRT[WVGHjA74;;`L@;?AA612280)279J37.11>1G-=++*/-867<63011143:9@AKT\izԶieaXPB:BDC>9DCISUX_oxpwffmb[ggdtzxvnrrxtfa]_jttrogfouvx{yqp}ouvzxre||}W}wxwrbhooic[Y^`RTU\R\QMNKURNPA>A?A>BIPKPSY_eXORDF9666F>B<o76.26517.?533J91-),:7=>2/;##'#'&"&'+.,+-).05:07>;NNETdB:;6691.1>844::BIPO\r̴|]YVLE?DLTEDIJHJQY[`luria[|{prjswpy~mvoia^kru{urvpjnxxz}yz{pzuzvxsr~xgvvxnijrm{jY[l[LVVOQTTQPNUkNMF7CCDDCLLJQZ^ma\TP4*39>95::D??@>8;H?697B+,)0823068DAEMSУp_[OF@BJKIRMONQRUV`mf}hfZZl~zyngnmcu~lX[fmohproy{||~xzx{}}xsc||{obfv}|~illmiupdY^YOLQVYhUOVT[RQPMU>FCB@FIILR][mk`_O0(/35<73EL641--2/.<.)(+82307;GCELoeoȲjb^SWKICHMKKJKQNTj{xuqjnm{|v{|wslmgv|zyuonnemlpstwz|~~~{~}i~wh[jbuʓxhntynkplg\U\n|RT^`\RRTVSQ]Lf>;:@AEHFXQdkaekfTO<4088771/)/**,-,-))46020O>>470-.?$'& !#%&'*-/..068640::833/1+*),/0/1+1;4559EBQxNKV~iZFIEHENLKKWS^_aj~rukzvuyzyn}x||zurrrt}z|}vy{~zp|zc[^vktiijllxejkZL^G[Y\XSTSONNLMNA57PPEDMQOfv{dYUrlu;57;77:>=<=>2245/*,*+-.'+/2?[484F=N49-,AX# &""($&(*/-,/3=47524AA30/0-)01000122/4/2==ZMI>`tt}|aUPI?GOKRdbchjZhslmou{r~vzzjbeefyykhtw~zzy}}~|otv_Qpt{ytmnng\bgjka]VCIV^eLGRRTWUPO@;<8CPGGCKW_fb[XVbwXM57;03;96;=89hJ9-.+.8"#'#*%&))+,,)(+038585922316.1WNNRej^[S_`lkpr}p|qyflohhkgnw{|ujryysjpz}}|~yyx}~rflx|}|kXq|n^eqibhgk|mZ\HE]hfkeSZUgjYUKCG:DGIML@OWSTd^\UXT;@C66?5401AD=gM6*-.0.#"!&,&)()*/*.81-02573607/10./))+,3/42.2,;J679DA>BECLNKTYX`WQqMJPZQZajf\h[efmt{tppnhgikajpqo~|}{z~}kxorzun|~}}||}~|~wws}rnsv}nSg~ucTdklkgvk`]\POXchkgYSXPXSTLDEFIb:HtAGLZ_jbb^LAY@446>686289;<8620+*-27522:=:o~1$EOM:E4795#"&'&%')$%6DH9371/;0;=4446+-((+)**.,+.2DD68:B?9BDBEOLOOZ\]U^Zli`VS_antsociuuxvqksd^SQS`fdqzvu}|{vswxysg}x}{|{tot{|yztuyu}ojm|i{nijlkhid[]VUagdb\^W\[SQLBFKLa[8EGHI`yi[cl_UA?@:9C<::38C989:4+0(0&-I3.3:Uc}DF:>I:X[961!!"$&&*(+(;685;MUQNQaujc[_[]o^_`jgjxhtkkpvqxyyjz\VMUVeenz~{x{zopglv}q^ryx}u{wvvssprtr{}|ow}|vu}klsy{lfhua[dZW_ch\c_f[\OSOMKKWycGO?HNYga^WUFC0DID;76;=02376:F.-**))531<5BO^F<,2K?>CG7+(!###'$))#.-03@9M7//,0,<.-12/,*)++(,/*F@0.08256.5CPTRPMI^\WbhY_ce^yyxyoxmuwpdhfprr{a[cxvxxzwwslipsj{qs_`err{wmyu}y~{|pb_l{yfbhmZ]\d[b]jX^[cdMCY[OMiy[7B9IVMTVf[[O:2SOKI?;;648/4;3710--2-40,+:@EW<*&-33;<567.*)$&$%&)('.+1BN:9349349R8,***)'#(/+/-?;.-08.-/26;HQSRVVHaSbZopeniuwaslrmgfrnx{zyrhmz}~soiimv|t~ydgrr{{szy~~uyyiq}}~qcYdiyd\UZW\fkd\abgjiVTCKOLLXoyiSQ8;?BA=QahP-Aa[HE?>75/363=;/3..,.014,3:>SA4(*&//27.2E8%"!!'$$$9zE1CLn;50>=0.111***+((%('++90..-5/-/337IJJQW[\z[W\]WdhiwmfdRdrme[_uxuo`jvuvxy}rynuckxv{vsw}}}ywnept{}yjm~|~}uu[^^ckl[Z\_gfaY\ntoszNWVSVHBRYyZ_;1-6DCSd`>9FKEOB?@523683/503,(/5<,30AFG?6KN615-)0++.+%$(($)''GP:JW>77><865//21,/).(&%&)-0+)'//.454816=CB;:4576641410/.30.8F>H=CK=4E-0,+(*+*&'+#()$.(*.,@E8=V=>W>@,//4)0)+'*-)(,5**)-:1..1631B:FFUPXiIKUMVWcu|ixp`frtrqj_ayxrumpypp_Xn~nxamou}}}xstyvv|y{{}wxphu~y{ge]^mdlxmhghk]jl|ysqhfSWLICVSO8:7*)0:99GQKLUF:=@FNU**+'),,)+)+(9"+-&(&-20/-76@CL878>.-.*-(*()$&-3,,*(,,.*)),)475=KOHQZYBAH>T[dfggbfd_dkxzmWBWu~rsnnnu}n`Tg|p`_hn]jxxzptwux|yx~wuikrx~{vrk`Zlnywgzkooo^vxpjck^VZQ^gdIC&)+'++06YGPGCVA230(2;484073=96<752E245cB>MJ7(2:*,-7)&''%)##)4&)0062/3K=?766S9410..(.,)'05.),*)'-0*%&+.677?G@FMQO=CVTcevordaZ\avimjVJEXZhhuoowymg]gngijh`kabrtxmrtxw{rmfYlyy|~pyjfd`en{|rxzlddc_gleakhcZUPRYM?E=510*/8?ELLKLQI1++49879=988@;92685(*3=Z66912*-/-/*,%"!&'%4#12.-),+),.5?62@=5M82R+<.-.*(0()))++%).*++7I<=KC?HUNUYvN^xejurkc\Y\ffg_ThjdU\tvovkrs{w}rlfcuobdqnjd\_rynirxyxztmpdqyy{|~ypni^Uhorq|lmfe^__bfg`ajbWPURTN?><@87:CQZYaY[eXtntnqib]Z^\jb^Vlr__gqmmpznolljigdmeff^eilokhspapuv}y~wi|uply}qv|yrcTewri_vpld\_^buclhpm]][SPQPE=:7V:6;:E6A0,0$#'')9+(',%,826:=AGDEF^]\fYMf`rktf^_\YYZY\Xeavkkmup{kmmfgehf]UZVq`kumqnojkegtzuxyxlgzyv{}ylw~wrl[g[\iawmtu\^bbgfrwmY\QMLOOK>;9=?GGCIQ[TQ;'0>BA@D@F:6=C7:CEH;U9H?H;bS0615*-3))($(',#$;#+H)%'.3/10:4DD:BX@:B;P>+&.1$$)'')'%)&,.;<>7GECDFQXZ[[WEVMSlhfba_]VT[WTdhbhufic|jkjjfng_]XVagluorti^_Vmvz{zxlv~yusvhqzpjqvvo\jVU`bronl``fZaqps{kVXUNIMI>;79BFJWCCGO_dF56I@?E@A@228>=dEAN>AE;;?=UB41611294/)%&($()&#)0D),1.,0/:5>BN97;7;:903,+'$''&((&(++.64>?A@GDCKMO]XQGEH`]`lb[WQUKOZRWXcc\undcfikkhhfeaQ[[fmlu{~wqj|ihiux~{xkls{~wpkv|t\nptkqpoqqkuxytoc\^`huobZNKKII8>8=9I@DPNLFQiOE=9C@;B@B312;9LiJjHDC=<:N4*,830,3<=EG<;ON620.,,.,*&&**;2//2@>@BDHJKJIJGKGDG:>]mfdf[gQKSbVV\aQYW]|deernfwfgcVQ]_lpgqwyzojsts{||wlaht||rh|~skatbqorvsux|zojzw^kiirjolaqRGE;3029<48;CYIA828@=knLE??@=6B8>>:53.+?,*(&&%$%(&#%#$#%62,-+,21.5=<)2?NOGB<5A=ULCMRG>?;;>>A@1D<2/2(($&$#&(&$$%&&"(*<9)*24I17868=8!3BPGDG=DBL^GAK>?@<8C@AL30637<,+*)&'#%$##"(&"%'.1@..X677?//,()(./94;BGFBCGBBE8+1:?BAG@;B>InA;CIB572NJMA;;?=AGHNGA?GS\]XQUdai|gg_`fnTS^S[Wavpoce`cgfcgplffi]j^c]nwwvu}oujkjmv{|}x~vm~ztwmhokkvz|vbddgikupicZPIDEC?A39?:AKCGIFIJSD=HLO`LD6;98101489;:<@5BB>=8*-'(%&*()1%#&#%$'-!"&*2)1NnAFRGCNC<5:./-2-6+(),2G::5/3RK:AB@_I?72/-@))/*)''+c776>@;>JVKNQO]^d`Rc`srxmYVUSTSWWUWXUUgu_a^dbikhxbihi`\]gc~dhl|qnovcmvu}}}x|{nz}xqumhehn}~pjifftvzhqd`VOIHGB<6>889;?E@DJJG>5FLS\OF<@@:9:,+79D5342/*-*)'$!#%#  '()1-2E\8/+5,)(%*&)**&)9I5@=GHIKHWWyYgjnpfdTTMMKNRRWRUUYkc^\ea][dmukX]f`ffrmvlY^NZmqz}~z~|ytxtvlpymlhij~z|spqghehif][SOKGECFMA58=:>@AMIQG9*?JZSK=?AB57/32377]DTKU`CA/4/1,'2,&'$%% #!$"1&()0:6>_Z97A?=B?@FON?-FJOfLGA>?62687;>;?G?PHMgE3-;/%#*,++'0&%" &$"+++,66EJgTPEH>@A;/1**)%""((..,300O@BBLGHTaU\Tl_zj]jurgaXXVMFRSXXm\`[Z_^^_W_kujknih_ejrrospsbhjtyzy||yzz{xxyx|ytgogtp_gzhjkvr`achtdd^[VTXZIJIA?=AH;<<4=@CEG61HJSMIDB<<7:78<><<>M4F@Eh8/4-)((,<0(%#$ 4#'*)/2BTcsAEI9<:GB2++.'#!(),-*+,::sA=EFHIPXOWScmne]KXmspaZUUUNRT^a~ba`pTi`q`]^c{ohhjXelikwricxfmztfs|~}|}½yxvz}{ughhzjhny{yqqmx]`euzdc\]TZbQTLFDDHGC6/.)7BDC>>9BDJGFMM=:89;EDJJEI@A4E9Nb79)/,0%(1)$!#$"!"4A+=./4<^rabM69G@931+('%!$%5((1/209?D=BPHRIKH[=QpNBNO`o_ZYWVs\\U^_pced^^\_hc^^szzP[mimfdit{gfmfjrwyd`pqz{xz»{vx|zvrhjnqhkqx|uy}qc`cxwgd`V]ulUSSD;>R=95.*.8@DE=I6>DKNITGT=466B]QE]X?97:;;;4/,*3*F0)&"!(2"$"(2,<4/BA]RECC17F?=47+%<+(#())(11@/56>9FGHCDVgo:4210/2:0*,'$$$%# ! % '58;NVEZ<35B95=3+0:0+%&%'+,0O6466STADB@AxaYUKEINM\ZT]abY^X]k]]T_Y_dd__oetbir}ss^ZWXddf_lukuedivoujygtvt~wsutyuqphhvpljlwym|zivnd|xtbbUTRQTDHC>=881<:73:<=9.0GOXNAFGB@=9FSIDFGmE:O@1U:6+-8()@(&&& "!$!##._SFJKHO5464684>21`B'$'&:/7865<:KLHE@KDPTXYiOB?HSa`]o\c_ek~`MVZSR_[X]`bigooivyrlc_OUcdbhknnyfR\eplozsxzlsĽ}x{vx{unljhlsskpg{ypwhhru|yk[XPMKJ@<:=D74016B=67;7.DBNclFCCFBD=8AKEJKJIKVBAAE-,&()#% $&# !"  2+bIl>TA764.01+4812?(+'*-7OA86FC5?aK@GQUcY\hjOLQNb_h`naSWaTQF@KYh^V`dj|gp{qnef^I\ggdelqstXTbvcsxwx|umywzy{{rhcispkhp|ts|w~znficef_UPVQMMC>=?>64141:5;CFSGFYX\YWevpVZa\i_JLVhpfqTJQMObaN]al}hgoohpWQbjjknmlrgUbovowx{|qxxy|~}~z|yvpk_ghifn|ytxoounttocdeZURVILKJ?K9@/285/4=JMH@KINSWUSCA>;A?E9=DOPjsTW?>QA%%$($"# !#*' &&68*.P2.5?9636-11B/22,..'8W?5AJB9=:=`ScgOR`\o>$$!  !&%%"68-0*.-6211@164/2/2=..1(58.1rF?<:AMHEJIX\b_hvrm[`XWTXjmhffgJJIMMLPNVV\hQWRajhibnkc`_ijpsoqefi`Omxzvx}vz~{|}~turka`fu}|t}ra[ZbnknjjaaVdOMF>;9816/1392/>DJIIMDF[W^dND=@>=989?mVPWSZQ^OC*"! %$#$'#""!35,-,+/030.1/35802236/9**0118:528:IJGNJQLYm\TbqdgXOWVY_^shz\\FUI@B915,588-:EIGGD]SLRRSWGDF;4DQVWHQx55-C&$%"#%"$&$"'#$-# 4,05?/-5/+-+&+4<5/346/)+'*,3-25C@CR@@WePLT\YceXWUSZXpW]jjozWS\hDIKUOR`Wac_]_sd`LRcm\hheorV{tjvwzv{vzz}~¾|}~}|uflstfl|~}rzk_ibr{xfcfZLGXZGA8O8469-+1;GHJPPDQHLRRJFC<;<<78412'#'"!(,&'*&%!'"!! ?V5<40,+.,+,(,0+./.,/(,,+324*07M=;HFYFQNNP^c`hkdUSo_]fjhffbNSTSTIJTZXY_bm^VGRU^W^d]][Yfhfjtkqvywx}sw{|~}vecikomw|xum`bcdldcqtkld[XQKKGB;88?8706L@9HQRRO\TNHUUOQ;78999:G?;;JMM>I70#'-+)('$$$%$$4!!6A?=-/**-,72.-0+-2-%&0+5-11S::8?N@664<>FB>GSWZx[VMQKDB;538><@@:;:;5@=GTNTTTV[by]ZVN@FP=579;;=J81)(C88-*'$$&&$$'#"##! &# 5;D4.2//22-/3.0>7%&%&+-12Fbm023066?EOLPIPPYXZj|i^U_afpqfU>?>FLYQPR[WUSFFM\c`LRSWX`gfuyre^sk\pwu|{{v}~|yrbYTYiru}~xjfhpikpehtofbXMMWG?F;46347AHCNPQU\X_\Y]cPXYYg`f|LC0:NqePW`YTYYZZQXa]ZgW[Xcg}ovwun`j|vzwyy~~|xse_dd[hsrtwrjxqsqnnx}gx{pd\]SPVQHH@963=;@C@GPTX`c\YSQVE;@J450457=??@XTUQRR_]WZTY`S__ipkSXC414))(*'''####'#! ! %&! :>21,***+5-.*0,'/)'+*+3))37:5026::=@FRMSTU\dfRQMLSY]d`d^OI@=HSDN[TZdUQQQSOPRUFMXRUcigktcZqi{|yxy{yz}yvtpl]Zdjimgl~nqut|uthee[jsbUKI>@7;4DCBKPVbVSUQJULFAGIEGLQG?D;<>66/++(((,'&&'$%"$)6 "#<% )721--1()&$(+')8<6)&$#:)*)3.975187=@RIM^UO[SVUMKGKUVZ^XTUPWSjvZHPRRWUSV^XPHKOvRQSQYcilw{~jyuw{{wttx~}qz||xsktpma]imjjrwmniz~sliecffWDCDG<::C?HESIkUUQNPTNJKHJIIHTIAA@BN=421.)+F()*'$+3%&#""%!  #!! (=A/,,+-&&"-,1,:54&&*($"%4//-5?4??;@@ULih^P<@LIJ\WOS\ae[`VPZTOZVSOZ[W_PQH_VYTTWNK^dj{t~s{|qonz~qn{~wlkmvzzskiljprw{ypppmq~zreem~d[NQ_FMD>ABHLKSRUTTQRRQB:AJ`KILNJFNKHG>6741*)))%%''++#!##"%!'!" ,%$!&,.0+0*,.('$(--,--**)4&##$%/1.1;5O99AHOdXh^H>GXUYULX]WVYWT\_slTNOVPnVZ_aTFB[M][XTR\jgmhxjzuqjnu~k{slmtwttwwr{z}ln}uy~mmkmvwokhhxaPX``NGDDIFRVVNKVSWZSJA;HFJH?GKJHBCF@A=:?500-*')(-#(# """#!% "!!' "'O -.3/21))(-(+*)+1/+,?&$%"$+7,010368=FFU[[OSdYVQga}\ZRS[NrXHGMH436@@DycZ[RYOOOOUmXY\elmpxطnnwvhevw{zuu|zwtqpnrsty}vv~splmqiamr~zqlTZZLBA99=AHWNOPSPW]ONQRTQNNKIVZTYYg]EONTA<60C(2&$&&## !$!*1$1"$$0JP:+'1$)3+*&))(E'+)$&%!''".&(04)+-/3,*/9GFEUraR^aZRM\ef]fgQQQaZHJIE<:37BHBMVRWRRIILJHV]a]c`jprѲsjw|{hZmr{xyw}yrpmxvw{{{ux}znualdnvios~}sc^IBB@@CBGJEFVSPRQUVSSSZWXMVZ]ZocTCDA;8/7/,%$&$!"$&'#(&#'&&')-^1,/-+*059/+'(&*)&3$%$%',)''&,2..2>411C9?U]|Ox`QHRec`RLMSVMKHFEE;847<@DOJLTYNM@>HDH\dVK_jo~oepmpsnZcwz}|z}~|ysrsxyyyxzwoqmfafkmonnwj`oXPI=<@HCGMHKIIROL\UffVTolWVXWQiWDA=>;810/**(!$$((&""%%&%&%^))3'81F45EE80'%'&'# &%7$'&($$('(/.3,/-.,7:6B>;>TXJ^BCX``TLQOGNJJCC?B695:=>BFMObTLGCEJIN\_UMekip_ins|jlwfqwuzzruyw|{yx{}}~v{tpdffldmoolunZXSZLGB<>EQCMFQNHOPOKUY[_W[WY__jbH?TB?=;::G/,,0-%&%%*?D'&$$&',$'#(*'(*M,JI,0,+('('((/&""$&*,$%-"/2/0+.,0C22S?=DJHOCkIFMT^`hIFLFFII>D>>=@;?>NBBEGIMPL?FQHEMRUUQcYmcsr~{~k_g}cZrhium{~~tetqx|z|~}||}vlirfafjmitmyaglh[MOHGBHD<>HOGEIEJPNNIT]blXS\^XWdXNH>===;853510-*&%&)%#V3+'*0%$#!($""!!#,,0-+0)&%$*(#$!#'6&((&#&##1-0*,,52<7AFJGKMHA7MO6@cVQcf[Xitj\hktjUcpcVrqgon|}zpoq{x}~zz}y{v}xzzyslkthlrihrqgkprXaPJFB>96??@D\GQJQMOKQLQTZY[WX[ZX`eRBG[C66542540.*%#$&'')Q3%%*%%'#$&'#')&+=1''#.%$'(%'$&"#%-%# =#+3*'*2,/,@9-)-3151D=E<62AUYha]kfTTRLCEEEC=;6;FBOGHGLG;--5FI\[XDPhypkvn`mfc\FV]ANkspdj}}|qt{|oj}~z{zxx|z||~zuv|xushkkkgkmnvpptcaYcE?:6:<==>G=@DLHHHG@:4.9_c_WXZ`yxYipc|sUTSTLK`cjbczzxtr||zyvzxx{|~uxx{~|yy}zzxy{{qjqvnjlgnpnlvgb^^^RDFFIEEFIKJK[PLLLLQLJHLPX\`_^XSRPOKN;@7933333149/&*"$!%))'!+.'+11#$(%%6+&%$(#/1$(,*+*$.,*&'$!! "&*)-))'$$*)->86>G;9JNUhl`_SMOODDFHAO81;>@;?k=ICMLTFB?N97C=OiWVZfrxhZ_ljvjgejhRbQU[oc_s}u{z}|yww{~x|z{{ty{}||~z}{v|vrqljozrlvrsnts{pm`^VJPIKHLHFQLLMMIGJHLSOSOORUX[Z]^VYRJD=9?<747E-2/4A,*%+$(%""%-()+*)%'.C0(&'#&&#(##(/-'2+',&')!!! , %$++/'&*-./446<=NLG^aUehjfbRNFFDFBCN7379@@=LAA??F@CA>A<4/>6FWWWdteSTY_liprnuo[ingflmckwxmwyzvzyz}|{|xxplqklkqmrwqommltogZJLRVJJGMJHJSOPIPMPYHALRTWUWX\[YXa~tH<;<@;3548A/,2+-)&'#''!""#$"%)9)45+:%()%'%%0)$#&1*/+'#"$/#$!"!! )$"**.*+03+//01@7=QJKLQYZb`[^_IJXBFB<;<56;;;ADBDI@@FC@HN621<,CTX\`qaWZclxpmhqigkpkmedo}y{u}pn|ww{z{~vzxuvqejijgvrzplmiloeWYRObSFFUKGFSNOIKPRTKHIOSXX_V\[WSO`^C78764543/;::+)*''$###$"#%&))'%'*+4+0Q(*(""00&''''I*($"7i*k%"#" !#/),&).;,/01596=JNGKTSfke`WVJAA<>@FD:9:@<9CMF@<9;8:AOQS\]f^hnontxkkkntvfmmhkmx~ux}|u~yw}~v|z~|muttuvurnieihnnwqgehpjeXXRRSRUJFKMRMQOQQLPpXnWSVRUe^gUW\NKDAA@>N142.31>m;*-))'("$%&&*+-4&4(-.O@.)37.(#>#!%%!0"&&$4?9'#"#(4'$)&2&-/).476D6B?<<659EjLPWYfZfxjlqjj_fyuaohlor{{|qrssvv~r|wuz~zstquyzxy{|xmijifqpsq}i_`ecX\P\TPJUJKMMOLQMRLMLWRKIKPNSYVURSNGC@::=:F755418R`h0+'(%&$)-##+*'&(5/-.5C&)&5C%""$"$$#!%*1#$"&"!&#&! (")3.48013;GDRGMcn~j\Z[P[Q;@G>ID=>9:>>=>AK<@AB>B:;89;<<=HSYZY[\VTOHB>;=648:9:8:8GJ<:4-*/(+#!$'##%(,8.3*/43$)*$ &! )((!" "$ " &"'##(G'##!#02+-S05@NCMNZYonrn\ODG7EJH>CN?:;<<:AH?AB?>8:9:56I_T^ow{kpokmorm\ddaighix~y~{}~}qtnxxxw{~|y||vs|rsqsilnlpluneab\^c^YYULMOGFOSOZlRFFDFBHRMT]`_\[ZRULIC;9959@::8<7E8E4.241.$$$$!#%8(&+0?1*8=,(%"#!,*#!(##+%! $$)"0,#%)6!$%#'(0A:8EB9;AOjiyLHA0>^C>EFR:D<<ACE;@79==HDE>9DD[LG2*-:)%%,$#"%%&')1.57.1&,##"!#+&%!('1$""$!"&"$#%AF#5'(,"(?+5>=8;76@@D6dwPG?5>YQIJMF=;:@;A=EB@GA<=<:9??9@<;EOHMovhnuu]i|kaW^ni]fjpzy}qt}{wtyv|}zyrnmmllkxmjc^]as]\ZYN_LCLLKKMWYSHCKWVQGTSWTbab\VQ]PGE<>>F@>^Wup\Je[=2,4.)&!#&*%&*)-3*.-10+G+(%)/#!)+'#' " !#"4+; '! $))`""" %& &1:`89;64P@EGDMjnl\H;6=LLJ?=?B:>A>??:DJMTNj|bfpv[`snx~}ywzvy~}y||x}yzywyrlkqppocf`er_XQSYTNGHIRMMMcKIRTkQRPYWRW\ZYTvONCB?7:@EO?WtYalH55.-&%$"&''%'*)**(0+&4,8'$+'&&$%!%)%!$% #& "$"##%'$!$""$" *2O8288I>>3??LQr``UML;?D?AO=>AJF><<>MA<:>LgVN7-+(''$'($#$0]3''+)('31",<(++%$)1""%%$5K'###3$#!!&"082713;6C@;@7@DK\PCGC=C?=9EA>;8<;9:75<;KNYV]grfa|r~~lOnsnrrggqyzxjlrurvolox~{ztntpqpc_^\mWYYRUQPKHHGDPNJNRZTZXYYX[e``fXSPthEA>E5BIG]8@HDCHE@4=8=9:7OS=O;=C9<;LEC=9A;?<9PFOWZd]in~{sfqg``Mdksovrx|}ob`vnpuzt|y~}~qykplmmrri{mg^^]TPROMKJHFKGIMGLSPjk\Y`\XVVcSPNJUeC?BK:=>FWAL7M\<7;:-/+%*'$'()+&&(+4&&'+%'&*$&'0/%$&$,3#%."$"(8;3"/#),M.' !"#)./.4348BGZIrVTNR?FKJDDHMEA1/3=A<<<:==F<9>>GCD=:@8A;7GF[Q`ksztyqdifUITqNScmzwpspp}}mrogn}zy|y}|z|{zux|yqspmloutfkwfegg[ZRVJPNLJNSLRNIJMHOY]_\aZ^pYYZUNOIPCA=@>?NDKKEC>?;/5W?(&+%$#'(/&((%+'''(&()$4%>*&",R9'+H/##/#!%&<&#5$,{B  .#3A1613>9=VSHTzXWYJQKLES[HEMV;;>69?C=89:E><9C[FJ>9B:979=EGYu~u{igmr~hHMSZQEK^|[aemmtx~svo~|}}z{}}~uvwmnpqu{~pqmvjwhphnhqqznf]fWXNLULLGFMRNmUSPJHKUS]_a\\\^^c_U`VJLAB=97:;8@S>:989>89?DRD=9;@NhxvzbXrlSV\\K?IXgh~]gjiciu|rnxw{|{}}zw|uyrplgjv}{lpwmmlcf_c\W[\[__YYJDAOOODJMKNVTOMLIORY`[[W\XXVTZUTKGG@8@79<<@?83=DJk2+(*.'(&#'&+*').(((4$%&&&%"$7>'"$7-*-'#5* $1('!! !#/$$*6-.R:=:AEHINDJFVRT_FA=;@B6-38B?DUB67;7<7:=:=JDAHN`toqVgtqvvpnc\Na[[YXeqmp^`Pdwu|oo}rty|{{~{yvy}rkkhigkohgpm{tksc`a^ZWXXURWc^RNIDILC@BHL\ROURPUX[Y\__Z`[WUThPILFEK?;<=6:=<655:8::=DHL?@Nd^QZxnl{pWANOZZ[WhlbndSGT^qqrvys{||s|{w|~nmqghjcjmkskdkablnf]dSZT[W]YaSONOTLMOJFDEP[UZPa_YY]c[da_biXRPOKGE?=8?;:=9g??B126,)0-*=-<,/2)++')&*"'&&&(%$7'(%!"$$(0%&)1-/&'."$" !; !"#&)+),32ACVAICGOIIPQTNPZEI6,-1:47:D7779;@D995:8;:@>>=9;;A>=9?DAG54711..*,,.+)+)(-(3.)'&7(*&'$' $/&1"!$##)'#('.;%2 !!!)34!&!$")(=*6675438@AI>DWQKi`y~F),C/05F=389869=DE:89;7:<=<:4@@IgJXt[anptkkWP_idc`ll[HFHR[igdkmutyuytbhgm}kc_faf^`bhz`jl}b`kYoZWQSSoYQUMKTT^VTTORLPNbSP]Z]a_`]^a]]VVTVQB@F75=>:>>;../,02*)&)*,,)-))/'*5*)&$(&.$#0$!"( "$!$*%('%!2$% (M  !$(-0FC5.16?CBDGTp~m^sV3&).-68=;63769:<>730654AG;C4;EGG^QT]dfrzmmb^^}zhffdwgwo^ZIBM^_jZ[yklyqz|mehmfiifg][p_YXb^UPTcb\YVVVXYTShie`UR[ZZTTSOUMJJNQm^`ki^_^da]UTTOI@>:::8?:::99/,/1131,11/+5'+*,*,.nC*($"%#%"%  $" #&(D7Q4(-"##'$  'E"#(*9?487.8>D;866:=@MQQSh\`ppjiltXU_[oe^zZ_jOilgj^YRTOSrfknh]akmofjjjjckcZVRLNQghyYOONMIZRXTOUWUUTW`X`[SSMPIJEPRTSY_\\ia]ZWVNFAB@[7:6:34??@CD7741/+.415-&')))))%$'$$F&$#''&%$"""!+'*LN)(%6-5)+ "  #+0+1:?HYOGGTXfYVHYP9-*)-+0W5;*(0793:6>748::A787>CJVUTHIZ[hjwta\WaY`hf^kR[V^bck\]dIWWV{W]f]bdfksogjyuqabc^YWQXTUXT]NLSLT[YZZXXe]e[^f]YWSUVV`YQOT^_betjc[SQLCBA?9A=6766:@O9>;gE553+./..+)(-3,(&("'(&'%)$'#$#""! "")&+*&&+(%)='' ##'+*43@;IJGHLQEDQfOGPBBIBD>:5//,>82/32<:645556A>83:=?CILOGLGL_aeelgS]_a]dcaf`^_mnhWXULFXTLVV]cYaZe`]_ozoy}ck[[[XULTYTRQQMN^UVWRTZ[W__cbk[[\`gUV_ha\RXi[ZZg^aQOIK@A=;:M=68225\A6FDD<436-)'*)'-(&*)((%#$#$&#*$(%$#""$#..-+*%'0+++)H)! $.#")!*((+-6F;>TAORIGJNQW[OADHAA=9<3Q34673446:760136;;:=6ABAIJOILGTqicdfbc[^Y`^Ym{gfe_}_Jm_u;JKU[Z\g^Y^_a_di}qs{lb]NQTVIWfhVQJORZb`]Xd^_\a[bc_]Ygrh[__gil[eeZ\ZTNKKHIHB:23538@74421;4>>9A[34./-*)+&%&)(('&&$$!"%%&&'(-* #&$+91?(*,1064&" $)!'!/* !')!&(.A.N9DHJNVCDVgtZTMJHJAF:@G>%(111/6/6.41746696:JG\FBVSFD?Jbl_cdepf[KNQXdmkinj^U]_iSLM@XnYMWiZW^ebfbrnyobfVHRSXN}WcTUSWSYfe{cegg^f\ibd|_lpf\qepce_ca]VQIGDHKRND6765/2=:648<8:4=8704/0*'))')1**)&&#"#%!"')$%(%)#"&A;6+7'<5'&!'% #"364$ !,+%',3A_3>GIH?VFBDJ[VMHWOFLN?>;@7*$(/5.0..-/513307845BNBIHSLQ@HS`bYidkr_ZOUMmimkszgjUSQZ\\YgIFXbTRSSRN^]aj}~bYUYUXXTSOW_^^Y[gstcgbdaffghabkbseoefingidgTEHHGHURNEC5414DGB42469<721323.-+()'&'&'&'))&-&&$/"&%"#%!"$#-$&&'#-#b+$ &'!!(N ,%(+/0?B=?D?GHCFzJDCJRSGYP<>9B53(&)(,-/6/2617;3386<37;DFLMI>GDQOU[gif\UUB;Vdde_`UY]`VGHGFRZZXWYPKMSZU_efcWSYZ]U_WTY\Y[[^\``d^\^gb`ee^hospkiiokmtihbWYLMTMFGV[JC663::3<;56-;;97307-*+-*6+,$$%&($%&''$)(''""# !"""8&%(&)."*)2%:>!# $')%&$',068<:CDEENOLXRAGSNKFLB?8;9M1/*&*10-03485566355365:BAKK^=<>MO^eYWWSJTRH6P_hr{v|\abfZRNNFMX]UWOGOOPSU[TcfYXYXXTYW`bb^`e]\Z`_XZ]ab_ajdhhljrnqohfjrd]aYOKKHKFMHG<45>;@46852169::5011/22,-1).)($*8.''# '*%*#%$$$2) %-1",+&$''!N?  0 &$&,88;@@GANUKMOCaJCOIFRJ@;9;;@65B*&'))03748467446432@B?@E8E78ACTYRPJS]VWPFVne`bpgbYosgZXWTQIH?PNUaYb_YPN`ZR_]\^]]Y]Zbdd[XYY[Z^d\[afeZ_eebdrfjplk`[f{plWTQRPLJFLV@;6>9SA35:943C99A7504CVo67J+.'*%&)*"%($(."'&$($(%&1&'40#&$#/".0" '!  !$"#**5=B9DBMOPFHKJIIEOFHEA>??:89bH)%0),04/5338BM8:=96:=APE9:0;88C>IIKVjYWjIYQ[X\YVILN[][[WWWV`F@HSelr^Pa[ZZSSdljZcdcb`a]\_[^Ucc_`_^\qqgb_hrqja``bca}`^VOLWwLRi?::@;=>?6;92958@@F;5950,0.,,*+.(%&1('%%%)j#&'&%"$%'1&)%"$#% %-./ 3! !$#))(1S82H>GCIDGRQOIER=;A@E=618B[21'%(0//1/@5257::283>@D==9GHNG<=BO>9=>B@=EA87<8:>N=F:,/1.0.3*-'$''&&'% " " %)5+$&('$%&'#" %" $"!! # "')/47A;4337EIJFJEGAA@=?A:>JJLLOXeZZZR\XVe]Xrsod[[YNQKMZNerffXahe^Z`cddcgkj_`Z]fgmfva]e[``\]_^VORNJLGPJKEEFIDEDljZ[_hH_w9;>=:99C01-)22..+-,1&)(*%!!#!!!#%&(,%&()&0'&#!!""#$ +"!!"  3!54 $#%,+08504:;@ECMME?QAF>?>=8;9=4012.$#((*+)),/0262-/CG2,4A<5;J7;RPJU]Z]]YRSWRZSwqb[`e]d`m_\`tx|sXZ_bq]midhhe``cjziZdvhbd`wup^]S_VXTWONLPLJOGKDCDBDB@?>FDM[\IB:<69375C;20/03..<-:-($##$ !%))*0)5)**(:(&'!*$&"#!(9" $2#!&!%'()0082J?==KIFHHCC@I@>=@A97>53:;S-)('#)(+-/@/34*02<308:C8I>76:?/71+/4I)(,!#$!#"$,,*2.:*&&'('#(!&$#"# !(9  !##+-&2D@AIFOERX`RSPLGQT]`b\`[QVSUbU^^ajslbU\r}~jNWQE[NOU[`^\Z]^VVVb_ZdbZYYOQIGJGHJHPHJECC<=ADEIUNJAD@D:NVJ?F<<:<=;>i6A52WI8++(%%#&0%)!$)X/*(-))$&(*)# %%#% $ $* *,&/29=>OLFDDHAEQHJG?CEC?:98:;g3?H2?/-0*)(*).43,2:>79>>:>FA@>D489IFGJLFWWHGFXUSWSVUTNNRUQU`_WkfV\dytqYIPDNQXLUTXXUVi\YV^aSUROOHHBIJHDABEFSHAEJ7GMSp`NFLAF>BAOBEDD@9@?:7?r[H9480-,/+$'"#" ;+ !"!)G+1()'$$##.7''-.[($)*("& !-!'&)1!!%&$:=8GOG@9DKAIFB?GAGHF>9>:7/@/5)0-0,&('%"*,32,/2654=AA;;CDA@AXxY:H=CHESJISQ\PP_ERORUSVWQPVX]^_[YPRdmko_ZW[OUZOVKI[\j\]`\UUNNNLLKHEACLDEBBES=FED>:MWpjbLJF<>@BACCH6@D8=E25PI:GE.,))-'*(͓-!,(!')-%&*-'((,0'%/'+Mj(%$*' &: !%&$ "!',.17T=:AD=>E>:7OsimoaGXD;9:@@IFCEGIPRFlI=8=7?:/2-*--...)'# %('0./2?>98;>@94<<@HGHGJLMNRNQZRReGAIQKHMSQU[YMRNRPKICMMSPR]KDDB>E=E;:<@=D=F@<9CL=@PAJDCEDBELKCF;?@;43/3,/45721,((.0/5C:C;<>>?7@B?I>:79;FFC340/++/291H2,30-?+(/$"#"$(# ")%'$%$%"&%&")(09.+(68A<'($ 6%.!""$ $'"&((#%*(5LIC;73035;Ii8+)(%%-27OQ@JO>:8@9;93R}HMK?=5,4?BCHDLFOdD>C8>DA@DG@>ESGC?9??@;78;::>:G=T>H=<=;=HHXDK:==o=74847.100/*-++)<,D1>1&&$"&"&$ "%&#(&!$&2)*''+2@.))4.//,%(%FS)! !3 ' "+"$"*()A87B<9CKPO=41222=@:3001&&.:O?:QeJ58CA4'.4DIF=FUqbG4.:@B?AH@9CJG@@9>CAC?BE@HDABH>9=;D99877?:=JJ??;<=@;CAR_TLYM<:88;=3.('.)$$+"! $!!-! $"" !*+2M44@C@77B>B=B@BB?>B?FT\=:G649A93=895)#+BAA>JD),99DHFE@HSD>9\ETOP?IDD;558@?>?@>@L@<::89<::8;=B:::AABAA?<;<<=89:75788:I@L>;C;F?C+ ''#" :6@((!*# !!!-+26*06WI:H2:=@<:@>@KIX>?E@;:9899654858;88=;?=;E@C@:9:9<663A>;588;C`LP@8@>D@?=;JKF=@<7<9319;8/R9-2.0-,+&J/12+'&#""!%&%'((&.,*)4,,3+0,)2.W70*;-&*52'-!$)% '&!""#%##'0369:>c28;C==;9CUF_JNML;D8FVa7410311-%7-557898419=77M>Qg?C>=>XCBCH@;A8:@79289370.+*/H/,*&((0,31)&')'%;-/)+7*.21=N614/3*,,;O.3*)&()".%/( &%!"! #7,%36:/59G89;:89=8BN|HKB=H<6C@EJ734;6:2)(&/116B=;=?7;<=BG9;JKe>4/.04::23:Crg=@4566564::7956<:8<<9:8:=536666;I48:;4386?EE<<<5:<=-2:A53894364:24/-+01*/**))+)-R='',43`JV1354324/:-+,04;/?<=1.'$"*"" ($ !3". #-4(')8?1357<<251;4?8@VvpvJ;8B;??@CBE>B;73=3(,(+45899AB8:;C?3763;BE4@4/41=<@:CHMCI@42/87<6468:75;CJ@;8<8<:582555516@7>=7:>5;7465204263792585<;?H8:>9<;7?DSG6>X613()$%*27=967GM>:<6;=:J2D6735..C??::A@ME;95298;55985::@^[H74:7332/200298278:9:6574A6;4724146:RF:9131?A:847877674267/7?I.01S55996@24>_;,2/2=>2>33;1K:_78C/-15=<./10+)0YS1.*&$ %&&#'$# "J#.#)7>==*%0)*2.879/223004RGPBAIGJ=:<99VQF71*.474/+,(472726=B@?=79>3444>:012?B7M;;;F[B<7694719923636:F9DU32404I43153=4C9=3247;8996876727=78?>55486:>=5=6=984/0956BS4026:T<E6<7@H?>4JC5./29>EV?43501252536748999639DO@:665455456IE98764639=7=6625>/0-115S651F85?c5;/-3zT0AX80LB77258264620GO4/+%('/15),*3,(-*&,)&9*,?: & )#%:'  2B+.*$$$)))+.*-/00.3//2@BBII_?Aa@?AyT=8>.053?;51,(-0642869NBL?AC79898?66g?C+15=?MI36Q83A679G7;2:98:AA>5A9G;=9E8;N8328*9495;1<=77,1862/N>74>66`K=7215770x|98876/43/901357=32.j#').0)4)0.&?7+'**94-+$/+:4K+ $2"!$!$#$,'(,,10+015*(/>A>?A>?<<@DE:AE:88;.:4B:750+.2;2F47H@FA<=A;M998899489:9?@A3974;54:77A:A:12124;[G7<>:868/23-170E7A0;784F7),A-/419-.3/2;/21(24074G//1.)E83+(*'%%'%(&0+*,06;)((@%&(.,%,14-dG# 4%&"!2'/0-++,/4/.,)),/6F:9CgI?A:56=>I=M:03F642--''145H=;>:@FMDE>8NC>=.+*-9B4:4?890:?:;;;?B=;@BB?E;>N:85;=S;:=57<799679A7;4644>A@:2`S99:;53M^M=3A3:276>2545420,0(((%,4/<=;4/,.+3CA95C?4,--/)+%')&*,(/).,:-/D+&,''%)3)2**6C4"$3 $!#$(?*(.25./.-1/.?5A=;@FEKB[BEDurKBE,05665+*󼗎X:;CD<75G=@H1,4/47-.616966A=9G68999F9:UC>>>F?;@<:4@245768AC8U373;9WLS>C=8?88.96952-3+*/*$'+-4*14/:*+)G00+970;<5.2+(&*,E>*,))<1+64-5/*$+((5-'%9)!<$#:!,!$&((8(229+/11*,0188:A:F4@57AL@570//4678DTL]Z@<4<;656/63=41*5+-2145658279>E>?@@B8;B@E:77>?>4:;HKSY<=89?D98<898J6/8GDAA<575<.24847EgG75:23111/23-+-.-----0+016&-5->0.-0./10.2-(+:0,)()))&1*%$9'*&)':VX&*&&!!!"!#$$$#!&-,.>6,/2,*426;DDFJQE<=CI\D=?D@P=-/25aFJk77;,,;;AGaxq?513--6>743;P5,48=49998=3/987367T[K<17221+07+,*/31/1.7/2),,*+))./80,+6-(3*+)(4/+%##$*")-)%&/'%,#*0.9-&"-(#  .*%+.+=+24280,-/237NDWLqNsKLDT@JM`bI4*-1ODB607>E51/G@X`8699552683@CYA//0541,*0++&--**-85D5+)6&(&.*,./+4+()+*(/+*)-&$)#%#+-$+'&)&%$#)(%%*'"" %$!& !#)'($/+*.,1.15E-+/2:HK]GGQCB<7WCFnRVM>37?54B=?>?^W@26ARWpL>5622.0O99E<;;>5..9;44.372.0476464364:37:D=?<4<:A>B43=4L4;--'2),)1.1,4/R/=+))1-1,,.-,59,%%+((-(((%*.$)))"##,&*&8"")%%#/*#!!!3#%%)&&$/9./)4..708/125NSAB>D=7;:SJGSH>2R4414B?EB=7lL7.02.455746;<<89-,12005343/552131668100.JK6A;>:5-..,022031.0+*4B`>?XxY4>F6845730175VRBB6=A:0*;/7*),--*)-2)5-+*055141/..4*&'$#$(&&($(%/$'5,S,*(-+WA,&+4('$+4*%#!11*$#$&32#-.(*+,0@.-2.<5GFIA:O5E4525456624516699TE:BH0.54JSs7.:2?*$**..*/@+'')<-'%,>N:3-1450(-%%'%((12':.)&)/54WvA+:U+.9,')M,1'''$'#"89/2%(!"$'(-8814.--4/0/6:ZLD?@>X?AMOT@8594=759?>7@DJOII712TF7T544.04+*.CGVC/2/.-A+(8*071.069K1472343/4;?5550,.1,-,,3+3.1,-,3<41=J;:8DBF@B;1.421.?P0.,..&+%).+*,4.1+'*.+)9B;<5*43-(),*(&'*&*((+?-'%&)1jL//1?>(-**#$(*%F,)'"##M)$&&%#(%"#(,J->5,.136/38@B@7A;@JCFAHB=,34>DF>>DHZQGD],2.4(*,,22;/11-36@LZ=.+2:1+%"+-/2<752I3051-4705?74565816/,*..+.5-024.53:1@VC9BFD?AE@60/(/002-,.*)'#$'2/*)2Q-8&-'-09I:64-+.@-&%('.'#&!$"&)(%$+$+Pg05*,jR(D61$'+%' //* $$%&A/&?T3(%*))*+,13.1726?>@A>DDU?>LS>5GBBWL@?G\NkDrB=;6."##-/45115/:5;V1-0,,*)-,,+.03-,/91+.754?8<;803/-.0,.2,.0)%"%-'+,'+)2-52/+-+1.,742;)?4%"#$+'&$"8$!&):' &L`/.-/%.,@;03T(+2#*(1:!##:(+:5'(0)+(%)C&(,K221382O>5;SIAH:@FWI:DOKg<>H8BB4K^VrA6B&#'1465492697>>=23601,:_:1*+434/327G81,-,.-447;0125B53-*+))))-8.2/./3--37918B@3370/)1..*.*&&(&+*-++/.40-:/*0+((.3/*-62'7$!#%$#%'""!%%'%&(;,(*2-+,.02((?4/.*&$''&"#!$"&010I-$#/%/(-5M)((310126:y80BYDH^KBFGB==HHk9;6:>@Dsn`eN@>-).01<447=51;F8221042-@:5>&'.11-2C560]15..0-,0021C51+-0.,)(**01-..(+,-05L1+BN9929,(/,-?+3F-,./(+.*0+49923*)+**/,,+,5+'$!')%&&$!!# "&$(1762+=6:+.4..4-5%#"((*AQ#""Q:=2$#%'(%&;6D*'$*?:0,441./,,+5%)*-(*6));621/+-:-'('-0(0%"'%%#-8(/-K3*(#-.66E=02'& )"$$% &$)1!#&+"&#&&%(0@#&$+0/24A:O.7+).+/,+$NP4((5000:584//33752200+***))+.U/&+('-,(('.+-00.<,0-0.&-)2575[Pcf48;,*,+02)-)/*1.(/,$*K/B0,*4.&:)'&#%)-+.-*D70:)#2/62@E3,.60G*! 5&(#-,$!%)($$&'P2,$$$#7++*746348:8=;IJM@>QEC;?@;,*4E59BL?WF=T639&//-56?<071>)+*,-40-0,+++5;95<9676D525/2MF/-)64.0112,-051)+'++/0<4104,*)%!"-/12@I=7;;-0,++**'.0+-?+*:,6((-*/02*/,&$&$'')(.-*QJL4+4GU4+)":I4-")F/)*"0 !)'() &$#') !##")*)*JP=-4:6F:;7:DGA><:J=I:?890K*9?LSDHFI>J*/?'.0I830/D*+*/278++.:+&0ZI?MA:4;B:1-1.OP681>158866655:7.(*+0-12011C1-$$2371C6@5552238-'((**1-o//9/+(*-'/19/70-***.'',5IGP{X4,GC,*;)/%&.-,$J$*B$!&  $"%J *%)('$&"%&$$"&*'*G372.36113?:D=7A@DPB/265@CAJq_:@.0,.-4..+,/..C".410/24H523?058/)/,)6-+,'+,--,.6..-+04,'%%&,&.+*46>PdHly""&'(>%$GWU:"%)+#!!& #$ $&-/""#$'*7'/(('(073-27124<:23<6A;;1<4@BTiWa=849,:Hm;2'('+6+2V/)5121191./0,**$.553651B?10*-::64@R?=@OvCW;:4125?50.-+20-0-1<3c@,.405682h3,6:722+4,,2760)()11-=E2-,+/+:)**'-910DkK=?S299-6*1'+)@11S,-/2.1-+0-*8T.+@25093/L1&&%-ZL@H05&'1'0>/#&'.2C2472,,&.(*,%(*S46+7G::.(* " !""=C.+! #!$ "$'(.*%)/-303,/121:8102226?6>B>IhZUkPQ8,1/44>+L1+*(2?9R8722.;37?C4100/3,0419?C<4273f:7;>CLQd^Vm+*$+H-6%%*#$+#$%(>F(4]AT@:#+ #8)*"0- #$!'J#$3*))0,*&(,-5CE+/282:.4<>7F9032G=9/:..,*/:.-63-..+1:C*'2$#4+35*18)+!#!")&'1FG# R!$#($@-)-SLM?Qc:2 ,* J") % $#"%""B!$+&%)-0,.)(-43b4004.929796)C<(! "$!50"%*!"#""#"%#,(&&H7,/).11543,,3.O50/2915;CgP\RME617 "*-,*3)+-849AAB87341423446749A@SA;69@jC91L41GG32.--/;/AF28A201(*)9,;,(0-+$)# ##" -+ ($&/-&)%)5-)#&& #%0,*9 !""$( & *(/$%$/(*+/17*7141,07552531F5BdeF745;76776>:768=38/-(0(,..+)$'"#"',"#) '!&%#+.-*G4+1"  - (!!;N5= 1 &"$"!!*!/$"'%(*+-01.-*.+0*37,M>6556??L>CF5B9101239=/-+.-240-85630P5>7=^9765::521<@;6=L82545DE<9ODxI72=3265<0368AIH;<5:857.6/2851-1O;69O4A078;938=9.31,/--*.+)'("""' $*% #"%)$"41'/('! %(S?#8 !)&#(%$"+&'1! #(/9B,052G1-/.(*-0AE>35589@BIR@7L;:4B8?JY-&.,*13//*7/1.:7;6>JD68OD<@4788880E,(23U@>4;-C467D5<85=8?A4=306/32)C.--4$'*%(!!!%+!,1,!$$$% ! !"&&)'")#5" 0 E" %$*)13A)1ZD1+.,)((-11384WBB9C@?99=<7:;>@??-)2-4/3,'2(:0*0./.,BW\87U?815<6D605%,.-18>629049:=96MX-/1462?DA88M28@33-.;E6/2:8;650rAEG[MA8,/5..'(?4)0$$(#$"!##%''J%$)!!*!3(B4 #"  -#!%'!(*+?:64'06WQ)'*$*,/6:I;RB?96>8GIF=?5B]}H70-/32-:/3A-,,'7-+,1:;BF:B<30557INT@,+,3;476.0-=GT7:3I?*(/3:B::A?316M762779JGVE=6@542Z@FdkV<@119+,'&.+@<(%$##'' )$B"!'":%*  "%#@T-"!!$ " &! !#'"%(@M?M;/23()),%%+*225>=GT71525fAITES==<42-56.,5>I4-(,,:/.--559J;;85661572MBA0/459>030.2:?727=C*+).45823113154384.41=92:?*60/7=K{H;13,-.,$))*8(@8*g( !!#$!$#&""# 2+#"$#!! #,Y+"'$#%# '$8Q:,ZV;O,3,*+.+>9(#6##42W7Gm5;<5Y9/53FD68/,42O1, !$81"2,5##!%D*%'(#" & " 9GK')3&6\(&.0P80++,A.20.4#%$"3.7+682/AGmFK\hd6435.-,E:,+@99561.)*.,-/.?K822@A253,)1023,+-1)061,,.+.920*.,133@1/22/=<<262D?33?OD?12,0J6;:3;,5(3*-&)+R327@C/0p=+($("%BW!&.) !%0%&%+'F #%D-<)&,#'$ ) ('=1&&#bj&'2%1=/&+/0.,02,/"'!*10-4+++;;98I/377?3*-)93U1523(1'="""%E1'TI?1>fI)( '6m+'%+!>!!$,%$&!''B=/)$&&4P7DB%#!",(O &&&)&:'0.%%+>`D9.1,-'#),,>>.:EC1?3VPB=2'#&)6>8,;()+/'*+=+*+117,..03iC<*$&$%D6166,*,'&+1)1204+.00355/3?14878F897:?5.01;,.*7-()-*3.%#'<&(6+%')3&+@@6Dc0&"($'''(9';*##1& 1#",-+J,+DN6Rd7(' #%/:!  "'H$&68A3Aq6998)$%()*0)>F,/H207.'&#.-(1..%)&).())&/6+-/.H+0,),?oK1.'%'%)45))(&+1,9/.0,/1/0-,015,5;4U:C5f564773*1@0/4--$!24'&')%)>(%#'&"%"&!(>58)4.)!$!'%$ "/(!)#1"*+"28B==AR9J}T/'H1H&!% '$ &%""3(2?CILA1*&"& !##)%*%(&91IN/1<2++)())3/,(%"$'(-(&./3),+&))-,35&'&$'%$()-/++-*))*..068/20,,-0+75=884AD@:7214Y70553:@21''$:#".;%'(*&%!""!""$Y-$6).O$(&"'!!*+"#(?$S&&;.28``ROPIk7RP$ #.J#S3!!$**,"&+3R~VJIe4A)2*!&$&%&').*)193+))'.9'&!"-*.,)'"&'+($+)Z*/+/).02"% "$('%&+;$'C*-)&,+2'(&*1+.-H1018N<4;5T6/SR>O=21,Ia?/,-%)+-.6C(%'*,2#%#!"$!$0'"%%(2AP*%+48/-! '3!%#!%o.EjrGM'&%&%$$"#*,+)(.'(&,$%3)'#)*!)$)#$+'&11&*+%*J'$014:-/72:1075799SOV>4<0/:8A3-.R0&,/DE6% #+V%%%$%#*&,+( #%6X-*.""4AT'/--# #'%G+]CCM/fhX:,M&<;=## %#$%#%%$##&"!%$)''&#.&'$%/,""**(#"#!,+'!"!$,!& %&&#&)+A+%2,*&%*1;7TDRodE0))-*5F^BH0C20(%'/!"##!" $"!"#'"%"F"*>19$;)##+& `#9/,(:"$$"@$%-2%)3$ -}] !#!%>,(%#%z5>&-+* "!$,"!,$(#,!%"%$#'&"&+')&1L"##/'"""# !  !<$!$   ! #%%'&-7>:('5(*124cnvg[/-.$)5&+/)0/8%&&#%$,**'#! 65)#3% .$!)"#"(.#'#$&('$$!#!$#!)%=&3^"#+'! ( " $* /$ +%! "$3<;mM*.,2/1..uaeD3*))%6)"!"'2%,6%+'&&&$# "!$.!6J85@I* &!!!(!".'))(%&"&).,#"1#2*;0/ !#* $2(%0$$',(&%! ,(!&"" '%(%%#)& $!&*%!!"!A""# "!"!<'5&)#,0%&'3/WIW.%$$&.'6&'%01-O@3& %"("" )#.&%$#M-,*!4! )!!"!,#-s0YC '+$-T~q?$ "!%###)'#+*#'(""( !%&"#8#$! 2 ""  #"$-"$!$!"!;$!.>A2NDo'&#%&)',# #+/-87e" ,#"-,)%7#8%&3E"'%&*""2*!1i155+!'/F.QH5*&%# #%)*$"$,("#/)%!&#$&&*% !%!% !!$'!! -!!E&)%*).J0PNQ7"""01=&".($E%&'4 )!'5$"#(""$3-#!"/?'($&j&2G+" :!'%!"$80-C169.$)#&" $ $ '% "%#!!!'#%!& #)% &-:,6#".CZWV#. 6H18+ ,8.!!1 $  %#* )#  ."#&    NC*#!)(Y(27="'"2!$ +$%")*%$1@N?B+! "#%%!*!$2!$""#!%!! ,  )!2"$#! x;"#* "% *8&"L "+#5$!0   Q 4?)!#& 6)!#<$%/ !#" 3#$$#/U?2H !$!"%!#!)/// '# %!!"% !!,#!"2 " 8%*_(0 $$!&,!$ /&!(" ((;F0;#",)+'$!! %! #&'%$"&@2,-F## #""%!# ("#!!'!  ( ""*E!'!&%(!/  &#"!$""*! # $%!"!&%##%%&"$&%%! $#!!-!#$$#('8(#*$-.')./+(/1T(%,1-;ADUy\;9>3FoA+++-(-,/((%2 6=))&'&$#((&/+*(',"'(*($$%,/&)'&+&()/15/21-<&-.1/.)0/4.8A74),$%"#';L/17C=9<2:>2496'.020:=*,23/1*'/'''34%'" !!$+#")%! "$" ! &!% 0%#%&# #"$- #,"!!#("%#$&"&)+)5-0"(?,)'++#-))#/)4-1,1.-824,)0+*)5+./501.,)/(&*$!+32&23N84I4MNI=I?>;;/74*,/574.#$5,*.-UDAIIE=GGELSBD?CP9@4+.-11*,1'/)*,(&%! " " *E""(%!! %#!"!*&$$&!! $'&)!!'&&2.)'%#$((%+*%/-(-.(57/3/5-+%>?,,0*"'(,.4L[408UlJM20//-74(++,'*&$#$"+%+-+'$&0$(*%+'++''(+350-3/+0)(%$+,-78737A988:2:8395C:31./,,15)%#17C038=69C2;IF8.,*.!%&("#1).3 !#4  5+'-  1%! '% "! #! #*-!$) ''')%.,/@- -*''&!/2/<@,'1#" +?-,33+62(,/04?D0*+1*'#%*(+-,-,#/.# "*E&"#!"#"$'%!#'*+>0000,,5(,#"'(+,.(,38Q:[:77>E?<29E59+6[?K9,@-*(/,?>MRQRIELZJSBDU=DR`43.(+(-$+$*%% "!! -  !#%%!%'"&!"" "*!)-!(.'%/"+%+)*-94*&%-2*)%&@?EgL-$!!$!&2>&-(-)0(/+-350,-).-,,')*--+A2.%#$" !!$*"!$$$&)"&&&$,*$(,)(*+0'!,.4,10*(-0PFEHF?I;=<:F@+(+GI=6G[2"(50)06,-4JFFSQSZJNKJR`k[R@:0.+-&'1*#&(%##%$$#&!/+%;# 0;M%%&) 1!$$& ()!#  "!$$$>#$',"#)B3:B3-R1.(.103B*++0'3>/-)$!$&(/4*++28-*,-/4HSMf<1.+)(()$&)()% )!7*: #"$%" $&"'+%#&&**(&*&%$$#&8,-097*03++#*+HBWK@B?@8:?>A.3|B=@22FFAIHL\RFDjJXY[NA@CC/.7K:1*$#(',B  ! $"#'"$+)'! 5:,Q4%# ?1 "!9-%#%!&"'"$-/'*'.;M()'B5:+0+13+/B.138.1G95),/0/+('#&/1+./.0,*$ ,=/9zF(+*"++ >J')*6.5%#%0)$$&'%#%$"%()%"$#,#$$%$&*Wf*L{0**/431-0*378<7?>TP@CLQ8T3/1VJH;L{6.@JRFh\ZVJEKJNflbiG<77.68098)#'95@/ #!!!!%. $"$!"" !!%-65#&##*"8!$'&-)%# !$$'#%)+*CN?O=A;DDA2/>f9@P^6*,D?;h{JE?DFRdY|rC9I>@>46@9,+,0-0%#"!"" $$$%"!!"#)" "!!7+1%',3,/'(&)*"-'# *#"0*%,&$8,1,;D-B9:>TE/&##&2u1((0(')'(6O(#&('*6*+*((."" !#! !&?&"&$%0//05#0.?'&%#1()*%$%%&'$)%&(&&'(%$!!$+'.-3-17/8/110/-(/0J:;=9G9?BCA>75698:PNM>-43=@JeSeHABVU`~qL>22<=L:88/-8033,&# #'%< !"&,%"   "$ ) &# !$%, " "$%&&*($ "# ##(%*.D'(7#!('+*+3..719ONY(F(&"!''&,$&' *!$'(%D(,3C*-(;4(*) )&%$$%#!!; !+'1*...,,&7*=()&!%.+((")0-%%&)'"(&*'+%#" ($)G1LEH123401..+,+)474:B<>QNH;:3/49BAE@7804:88LJYpLV[\MTMJC44::=712-((.07/"%#$)",+"%%!#%#%#"$$%%!*2 %$) &*%# "!!$&)'(4,$/+(0-*.357/028GT*74.(-'$  !$$#"$!$%(+',-(*/@X()-E'%$(#!+#$%%'&"%$((3'()9.%,<('""&*&+0'-&)(&&'')1*0,+.(&"$)-,(/55A654212(+***:>=::7?GDDf30.>KG5<74.8:62+.D^Zewa[MIA:2992.2,/--)+34($%"&$##$"$! #!&! #%"*.G(#""'# " $&9%$$""&"$#&!:.<,47/254730$-O47.60*'%#!"##""!#-/0)+2&%,-0**.E)"$A!"$%B!%" #$ '#'#(*(+*'876$3)&*&+-,,*++',-/.5,3*),+%!#"",+*$%;a20054/0. (.:C@7ATA9BA96217^KVG78029;03%'NNX\SMUL97387,,*39,&(,*?=6$!###$ ##%(!!!"!!$0/%2$$,'#!!' *#$$9#!2$(I;(( "),);',**375@=6J4@)87--/*+0-1$!(,-"%"()'(#&*'%%),%)(,()*$"!%2""&&%#(&%(O&0)%@*' "'%0m2*+-+0(.?()8*+*-.3..1+"(:%*)&,2,*(%/2))+31-1-*'--095N;@C9:C961466=:?710355-"FKRhPSPX<>>6?3*+>1/(=2,%&/,&&$"'!(<&+'#'"# $5$<>/-&"#  !# $%$%#>2.#$)*)$Q((!$$!$*'*-(,*+2@8482'$-el6553-//2(!)+,0'%.+($"!")''+,****%$(% %04%$*'"&""%&&1(")*'$#'$,*+--(*--**/++))-10/110+//**,)',--)-('>',*+342-.+(,)-;GH>@=97E>?34-2J6^E211121.%#*CPMXTQVMEKG:H7>0+*,**0-/)($$&%'!("",%%"!" "&&41(.-3:!  %! !$!$$4.n32"(""%&$"#"$*!'&)/,4,228?=--0+Ja3-J0--!*&-1+*(*,*>%#$+'()d))&$'"#"#"#&-)%$)$%$#%#"&%()%"")(.2+1+)'((*(')4*-/**/-/3(15.12,+3:@4,/+:1+)%37<43/.0&*/5M:@S915@?7555L4?;6.33445,,+4pwwbYQVMGE;30556038..@+%%$'&$#$ ""#!%#',&% ..&#.#" '"!#+(*).*,>.$##)"$'#!(&,%$''%&(,00.)12/63N<2a],#,2'&*1),,..+**+(,$%#.+%''(%$#&($$%##!!$($$%#!#&((''%#%3+&(*()*'&,2.*.0.030)0--,00:K.255543.3385./-20727817=332.27<<41=?8478345:C:89621.)01`{_RP][VUMC;N52<4CjH.4_*-*2.)#""+F,%",!$#("$'%)%# !(%# "%*W$:5%$,,W01'"%&"&$"#6-&N&)#((,3,55-*,&8E.[mp9&$/*&#'0*,.84*+)''%-%#*6(&#&'&%&!%$%&&#$#-' "'&,% "")+%,5*)7**+&(,(&-7041/4.,6/..*-.,*153=317067744/021-0512;1;=6346/8:9436B2>/02./20.16.1776780?/2;:69H=L8;66?643115440)"#)6KPq_MQSPJ\8;B:76/-*(#-0++04,&&,%*(+$#$# #),0$$'+0!$#'>$.3($&.+,*'+!$"%",,)&()%'%'3(&')*+*'&+ &1/6/',6(),**0+31209//*$"&#*%%+*')*/+''-/&(**)&'+'(*%($&-''&''+1,.-),'(,+-//4/0176=2-5E4/-((/3H6::U@0/2600414-/./3L43B@2568/+58:3DE@=<=;3:97646<9.,/&.8LC?JfKcE@/98=;2.*)(&()),/<7/)-'))'-'*)>$#% 9&&) !! .-! ?](.&&-0(/"''$ /)*!$'&$ "&)(&,+.'$$'%$#'''.*4F:1(3,+/.0*031B-$)$!!-((*+1/*,0E.,))238,'-.-.*%$&++*++)*-,-*++0++)*'0.)+,9633A8/01,/40*/2:SG=3-/1-6675?103313,/2;6843*3+4248=9F><96875888?@501-4=6D=I\[N@7B8GCB;43>+(+4,&-C1$A@,*)(-,&%#%&!#.4#&!$&"3 !!/92'')(51+!'"''!&2''%"%" '##&4)(&*%"(,)'$)*%"32:W>8D4%37//.-027.()+"'$)'&*+(+0+25-)-,1-/01,.)&6,-,(*-+.)(('+,,,&+&)(2+,003d=65@A4.0,4/))@:22<9B3+../39<7;343.-,-0??97:-'+(1488,-,(,/.)-+,(4CH/.#%"*'(""(,*(01#&,/ "!$"'($SR8%*<-)0/&")" !$#'#& "!'(&%&$,(&)''%2463Yt839+$-0+',,86A/*%&$($)).)*-.(-/7/10/4=;.2+,/4@5/21/06,*11,*,**.1/-)@*+=314@CM:6.402--+,9=:A4315E1/502G860<>/+/-.GX530-''/203:?F@7<93686==8:;=53:?FG>KICNC>DD_BO202,,2//*,6+#3.4-&#$$%#! #%ID0H:0'+.%#"!!" !*&JMA'+H,/T," !!!!&)"&#&,)+&$)&(**.*&/45^L5/3.C3#%,1-=-3),&)$)50)*(,/A330010-.323453>735G<4E>8;94002.*(*.)0.2:75:1-B[M80+-9..-*-3/:240.;46.39/@8<1164402.0:3113'*+),33?B=B792889C?>/1,>q*0% "&)## #"")%$2*$&*)'-&(*+-4.44Bwl?=<3613./2-3,&(.((100.+,+2/3E-//;;;5C0/1651?>B:?<=D27:963371=-+,+**//1666F1;B0./1(*(.*&*,9,0.CF375<0<5;F367@356408544+*/+--<88*%'(($&#"'-&#C#42(.#$% *% '%"+%%'%$*19*+%'+'##1.6?mɱ`W00<2646<3.+))1;++3,212/-/+)*001@C<487426265<=4X84930252.+*2.-*(-.-,-,-/+*(364-SA7..()(*$,),7F=32A937EWP75C82><32\=32.+('01<7Y778::;;>8638::D886QB6=N2:@fhVK3208;7/.0+$(SS>A%(&%&$"'#! 0*)%*"(&+..#! !$$*(0,=%#()$$#" %'"$&# "%&'((9Z.)&'''=+HW=:Q_WJ9201..=B@97,.0B2**-&*720106211332894:<:516976KI7.20+,0/-+--]1/.10**1D/+(*1$$1=@9,,88*,%.&+OE8>H*%301329FA:393/233A2-0-/%---4=9:E99:6::95,4::>9534/.0E88IfwwS<4023.1%,*&((#)&*%&(&&'$''#'&&"'$+"%+2*6).""",.$'.(!%"( ###'# %% $!#"('(&$)'/8,**&*+3L8<6jT=?43..0+/4?C[NE251.8++*%/303-/3.-5;869S;:67788:69>3-/0.,N-//-15/1514.001...(''&*4YQ32&')*#*&&(,3;4!!&+57?8:B7/)400.16*'+E+#%)>%*).1)$9830234;77=45:4<;421653.,,367876///2262350..-0.,)&%15@:/3180($&%*3$%94CI<@E=:94613856638>8?;8,%$3`~jYBCC6-509.&#&&!'('+("%(#!%(%(!"%)*)+3I*'&!!'*&#!!$&(7'(&&%9$- #3(1&+*'#!&(%)(+,*'%4;*63CK/A/C;AHB<0.3401()),'5+*0034:;UA89669S86469:5;<=<>91*39833352510--320.11.-.2.)/0.6=462//)++6J2578@H97-2:41424>Y1*-K9I/ "-0+/B'.W<>:;8598<5/47:769C\AX/"#!%\tgNA8B3./-/'3&'&-$%+()"+&(((#"#"!%)1-3]=&#$$%##"4)""#!)')98I-'*'-!$# G$!%*1%#"1()7.&(("%*$'2CV:375UG?]75;3471220,216339=;K>WA11/-2-,..,+711%08=145710854+10O6,#!(,/.(+&)C@:99=777555878;>?B@;-'O1!9KSUSJGJ2<0*/32-)%*#*2$#)'0')*(&&" $%*$'&%*/%3-1-%'-!"!!$#%'-+%1OD%!((#!&!($+%%.1+%#!!!'+4.+'*$ %%)8HJL\98;;F>R94=A0-010:323<=>;;CACF=DBC96=:87<>BBPH?D<=C:259C9376130.0+).*+,.001154BCF4F/..4;*./--)/2*6?'+47-F/43-.042:6'$&+0-..*':;3683D747=4<:9=@?D92+'2PI3T6AVPH]=7/-.*=01-&)-)H((,*++&#(+,&)%$&&'&$$-Qx7+)$&"!&!)'&).)%)+;8 "%'#1 "&G?0..+7$'%!"")+./&"-'&(..-9C?:==E614:39E9,,292;90:???<@CDE:@M>C;;=@ALIGRL=9;@E7I?:A;401.+.**+//11.1/+20OOHA22:?;=1-*-/F-$%/-)-5E4+)*>-25022.=2..0+00&)16972628=587A9@<<@2%,1$56:XB?NfJM@7267*1/+K((0*)'('+)'''0('(23-%&&%$%D|+',&# % #0&11?0@*0((!!!"'"#''9F:13+(##(&%.(-,.+%**,-(-/0178HPQ9B<8524.2269;I36B:`d?),'4'&(401/-2:345655<*(=57537>380A:::926)*"&,=@RSRT=:0351&.0-2+*((+(/(*"''#%,*&*Nh)*)!'(,@)%## ! -.%#KE&%%)#%#"%%%!"$&=@:.0L&!%$%"&'$%5""0#(),.15163=;D:98<<9;C>AEBE@>HGNKPIMADI>aS@LHNSJMDOJMGPHOP@57;>=4<7957811111220),&)2=55.-3858.2111B\831.35/1,,4,/-01+/40504=RG8,)2/60479;423=>>88:761.)"',+9GLQLF9;123+,4/.'+%(($*+#&%#%&$%$.-/0,'((,*$%#! 3"&048&.*.*$!!#&#%"'(AJ,,*)%((+=)'($%#,!#(,588R9`ANA5?=7?88:9?C:8C=>CEJJCHUG?PJhaJHPIPJKNNJRM>CF@@IC@:E425)20A+7*:/0=5CJ6Qd85<6;DD.+37.47/363<74:@<79;:/+2'").+WI=KTD;38415-1&+4*&&%,(%%"#$#%&)>,|>#!&/5&%%# $! $+=&%#"#$.)%&&%&$$$##'?L+;*/,1'%.,'&%&#!'#-+3:67@CWNG=9@B:>Z@>J783??AACBHHHMAN^B>@OJMHQNGJ_@@GB99M932;LIE?>;;:679B943?@:03.-7;99887593/37:966014:KBL==570*./"*,),9:36<FB>@=63<;>=dQiFO?EGGJFGIJUSNQQPPIMA;27E@J7?MORUDYF=F;<;6:=<@F864869999=<=89;:=?J<;67<>11-0,,(48/681/7BA=87658.,1/..7&%(3'''## " %$%1:R,'*!$##0"% )(!"&&!A-(#!,;*)$&%" '?%#!)2/*.X0+).&##'*&!2;Be34;>SJEJWCHEKKIDNRQROfVRFIJMD31?Pd>KJQE=<8FB@7=>;>>9=872658GC86>?;::9341")27./21@I6D9+(.41,;" !%$&(!#"&1#%#/40*3&*&#!#'  %#-#&$$7($).8$%$$%##!! #!$*.4,.0-.(*)(5(%,79D@=<8EL]YEG>38697<8>=?YLBACNny?=9?BEFLVmbLOaOJe__XZNKLHMRHDOWMZUQONZ`Q[VJZSKICA:BC@N?;B7;G?>>D?EFECA:D34SB15=D9/043333512430104208652K766<>;A:JM>4-08<;??70+0' ,//98796.*++7/<*'%''&!!%"&-"%'.)0''%%" #$$!!$## (--+'/&%&&(#%%(!#$6)##$%)&3.&,&(/26085:<:;>:9NMg@ALCDQLMZ_dVMJW_ZbW_\PNJPOYPoKQZ_\{}Rfc`WUU^QLSHAHA=@ELDE638AG9=@47:88:@=>=;46?*#%3.8KCBS=9;3++.+.)*-,#&$#(%%!!#&'$))))''"$"" !!! "'(%&(C.(!*($)'')*) ## ('"$$ (2,?5,+52:AEAGFEGKadB8>@A89B<:;;>;?1/!&0?6,1:58;3-.17345.5240-/*28P?5A>=-0368:;F>@Fq:5D5!)3;KFE=;4-$)*--/N--#%%&$%#&%*'"&A&,-)-!*(""#,#%!"(5#&/,,%&,$,$'0'%%#!"$!$%'&"&$(-87.3/2-59QL>9;<>Lsa=9630:9<20235384:7>202-?4FC4-(0++347;=;HCFTmLD\ACFMZHIJQJaľ|ywtZT^dmc`P_gfqTVVMIjrv`Jaiy{_WUV`][RMLLLWKKLXNJGCBCD89E4(#&078=5790?KA:62,88<;:67;23497:4479@68<:3-38%/2586?>\JJRCBKJKFGEMVkovhpɁdunliONaOSUh[drd_U@D\djXXUokeuhg}a]UUT^QLLOQRPSQLFAC@:B<)" 25&"2*8?YF:8965.89::8*#*2FHAIVOjhqtccnebr_`YUQZYTTHRZW][KQUa_g|xr^S_Zlpend`_ocNU`g_kWQPOKGDCDGCA,+/6:BAE=DHMA67'9S'4QSA<>>85A<<<5-)$3G@D9?2,62,-358==G@B>:) (*A5;?AA=/6623-/1**'("''(&"&$$+"(&& &""$'*'&"$$*0&7&8O%"#')#%#''%.#)$'.2//(#'42KO3+000/2767:736697?8D]G9@7?>@B7FF>G=?7:(')09A>9;9357@;4/4*)(/)&"&$#$))%$'$-"!##!$! !#" %/#'D[%#'-6/;5;))/*&&(%&$1.+0.+'&+20,+4)1287>:5G634<;AMCB?=C:/481DT_=>@ELFDFFDIaYYXYYbea\PHTLQMLSQSG[]o\^li[W_icXS[c[V`f^mZ]pmSNGHRPSQPOISFOSOVL??9:=ALMLK[F:ACc9/7CEB?:301*HC)1DB:?A7157497B>=>AHC?9f$/-37EB9446@866@0/0/1'$)'"$'&'((')-(#3!"!#%*)!', $** (&8<=DxrU0,/)%>CF%,?.+0%+=&-5+211:9\J8482=??EFPA@LSdWSWU^a\WKO]WTSPMOTDV\VRW_q`J[\bk^]b_^S^\VXO\a[[QJONTPNTNQNTTTXKMFB?BEJM_NJMdB@?>::@D==5,6<7EC=(0K($3:JN?LH/.5769:>;>>B?79, /7@E98594:8;9I7,0%%'% "#(,*.&(.)$$$" " "#%8*&3'%%')""4M9/=oM-($ &12Z(.2-+519'6/.L,.1A:KQM8=EDGM?L6B@;742011*.&"@BFQQGPFpYHRHKPaZcbfSWOMW]_]UJMVLLLUXPP`[UN[df_ahf`RYW]``Pf]Y[WPSPNFM[HLO[OWU_QJQGIGPS^rJNRLK>>>?CB?A<63:9?LB?>,*-08r=Py@34/4:7@@AA@B74# "#07<;3663<;379c=3(#$#%&$%)&$*6*+'%$%"$$ #&#%5! $$2')%#O;2H@-'*+)%%''?.1148+2163*+,>2P5148JQ??>?OOWJC?=874561A:.64:13FYL`kYROQROLOORXeVUVXZFP[m}HFDLLWILTRVV[ZZ^ei|me`_[`fY^b]\X[WPSOKKJIKLMHHM_WLMJGJKMIOYUIMKOM[N;@BDBAC686<;@?5B4/*/9Ln>AC@:4569:;9?E?D;69% 03639A89=K88:;6-)'(%"$1$%!+(1'&'"#'$%!!$) ! !&$&J-(!'G:0)2-%%$#(0@.0))0/11/072-/.9EC56NLIC=78LYTD@B:9805AQ8C6.48=417121:4B>@60;<8:<=A;<7C8- (.6:<8889A?<959491-'&%)$.(.(;'$!!%!" %$ #$&#$#" %&&$%)#..11-*++((/14+13,2.*)+)--8AI>:BA;:@798963:FEQIADGHAFTXPfTRHAHKD\Ta]PROPMHEIGFJJ1BECF\[VZUUSUVnYetuf_Z\]lZ]eckjZTNSVTRMDEB@ABEFGJHGOKNUOPPKGGNKI@H=>.+23(,-8,))()+057>B;;37;=677;;<7A@=73303484>EMKNEaHEFR@AGAAB;7?ROH^^XXXNRUV[_\`_^^ZY]Xa`hjexul^_]\USJLHDDFCHHPPPMHKPVOLSKTRNKH?LC??=<>5<<;:>DDA<:471-25A>:.(*5=J5D;8759:5630($$%)-(&)&&$,,"!"+" !%C% "''"$'+ "("#'$2(--.*)-*+$H.1).*+549578:G69E967IKVRNB?BBGUw`WXVDH?NRNYLD:3744+/79G223+.6?@:>641-106<>O:;8772433,+)")($#.,"%$#$'*(!$!#, "!%'-&$$ !")/';"!)(O'*+-*/();'*1+'+253?8?;OSUGI?JA<9@>@=>9=809512>EBXTAPL\J?@BF[pZRKY[PLWQR[RAIB2.03/7E=34;CM_]WVZ`[V[\QWW^jpmgjWWY\_daflpuhdfW\`[XQNFHJHILOKFJNQUUQQZMLIJCHFCBG@?57729;=:<@AIR0+,;63.-*)12H>?@??B<47%)!,68:4788:70,44($&,%)()$&%&$&-+$.3&#" "%#"',&$##&&0&&&')*)G+,.?-0%$)+((/0/895BMToxfG:>?BK>@C;=7<<8/116=DATMQRFTcQJGJJKYQKAL\dZWm^OBGG;0*,+27759BCHIST[VZ`c\UYVR[_blfeac`VSRU\g`]ogjadijihf^SSOTQLJNRJKNNOTVROOMOMJNKJGJGD99;9@C>BABD?C>/*160.,#!15?C@@CC?;6.&!#1,-:96AO:;36108&&$+()$!$($!%$&$ $&#!!#*.-*/A!#&"1'?4#'*+-*1+2+8.)"$'(**/7H866;;koM_GAGLUbmr~LFFRC5/,4649:CNJMKYPPTefdo]\eg`hqoogicc`[TVbnrpejlcdjlowwk`[aYVPQORQLMOMUXRQRQKKMLOKJRQG8-9IIGGCG?DG?>8-.55)' ('5;<;;AFG3203-1=/+0776E=;42.+)))$&)&+" $! "# &#$"&!'%%&,))%"*#!&0&#*++)$+2G'%+$%#!,/+HFA=72?L>;ABGTWLSV[[QTdrdrZdw]afojead__XXXhqkceeaelmihlilqa[NUQWQNQROKRVZiQMLRNVNLF<0/:JDHF?FIA@B>=9282("'08;<=DQA>;6>E21;5$F55:765:1*')*(.(.&$! &"!#'(>3""&)##"$-2-&(&I#'*#.(()8)+,.*%#  ,3../449:?EBJJLf]KQ>=+37ccWOLJB=?B@9CFENSPNVPQSTRPXX{~uh^b]]agge[VY\_nq}”nef`^_ejpkqhgkptdXRQWTMNYTQUZ`WbNOHQVROHG7-6ADD>?AHFB@7799:<-!).9>>>=?@997?@DCEKKQSPRR]UNRU]`crlc_Z^_]XQNVSWlrmhxto}onddgnpyxwngfsoTRPPPNYONSZabZf\RQR\V^LB69?@D>GCGJED<;??AF4:%)-=M=BN}cNHM=BAQ=<47:63>86=I=DA@C@@SLB;AA^ZCKENBHH@>GIGFSJKD@>BCSMENM]VOTaafl\bgbtxfXm{ocKDIGJS\fah\UV\ojxzrjVfq|xsagtve_YfQKM^MQMTY_`xsh]_YMF>M=8?8&+8G=??;>@5-,7>;78>?J=A;BB9:8-3.65'"%'+)+*$)/,,'+)%&+)+%,)(&+($01*+-,)-)0(.--&'++-2)2A993KFNlXBPHKPGCOEAOBN967>54>?<36HUIED@NEY8<@F_\UG\aWQEJ^SDCDCF<97FJSJEDLPVWPWc\]`f__jhmu|w]@;CVdehqxta[`\fkspoejmqnrfl~~hd_aYSFd`dPRPY^usztY]XLGEE:>LBJIMJFFGBC7:B00(4>728:?<>=50+9A9CKNINN=;IL:?CB:83/)&())%'%$'.-&)(+F>D**)(,'%(&9J(+&(',31&,'''#'&+//6P7?=`IVaHKD?BHC;8>@KFG97K@4>:86:=?CCAFIHTACFTYgPULI^TCGGOS=857:D;GMLBIOJTVRNLptgWhTOTSSXajb^ZLNYde~zp`Y^ejuxqwuzypxv{kc\WUTkz|TLQVQarx\b`VLGAE@9AWHDGFHFEB63719;sN86?=B=<@B-&(-@GB4RMJA=5269?B=<6F?4/<2)'$#+%&-.1/./P5)&.+,+*#%),*$(''3:2*$"!'$'(,@/1976CFTpTIN@EA:6478PID>GAMKF<<@:=@BDNFKSRKPsX^XcTVGNVa\cb]\^icpm|utcspfl|}wqlp~ys{wqgcXc_cZe`WUW[__failgXPLGAH16aNHHOLNWF6/A8TI]:><;@BL>>,*'#CRRN7JZOJ?95995:()($,-,((,(*//5@cA/+&#)M6)(0%5))(',=R2)%%)%'%'2,48@f;afχcU_G@A?:86152VFEVolcJDEPE;BBAGBXGB7,+06<:9L9=;;62/+JlTCHGQSE>>5<4=IQ>42//.-+2,+,-&$%,4//10;3()')0SM2&0&)(('+.;0,&&',$"$+45=:AH^fpȐ|VK?8?>>@20=:eYnvw{iNRPW^WUSTO`^IDPZYKOD@E@;B@7*)-48=9ABFFFO]VRSQNWVT^SZ\^Z\Xa[Y]kwrqgrupr~evwvsob`lhmhbhbhcafWW^frhdn}paXNG=,6JDGMHLCA<=Cgj=8@A?A654:88FBCZNKIAOQL=>=90&3692AHILPJE9B?C>=B@?BBF1.311>>42-),-.0(,2/I:6-.53M>39B/*(&#+*---,*/,)#(6(.,4HJHzvsw`xlKEC><>I90>?EvosscrgmwbXR[KAMMHFC<868').@GGFJTR`^ZRYfPT_}eskfmllqhnecfjpqifq{y{vp}z~x]^]dqohlv|hmoa`enmphjkbdG70:CBHOLC7+->EaC247.+248=<>@BMFLF>1!,58AAI>C?60.AK-2/0/-+,.,,,321+08/380FP0&[1-+#+"(5E--)1*+"%-/*/3FDHdgtuSRED:=P<;8AFBRFGOI@?>.>AeH?8,43:688D>=GPGU~n\\XMGIHIDGDGPa}.K6>EBF?=.52Fu=78<4/54<@FWLLHFQ<FPVa|öqfgdYQIDHGEAHDBjX-449;B<6CVQTYR]\dPk|sx~we||~{qsnox}~xyovkcikuuxyvrlldke]dk\IF?<<@JG=C0)+)+?5.)3,((-&2GCD6/(11587+1T322-2726//..+=-37HI@@HsZOJFODKRUODJB====@LZp|ԨvjUZPJEDI<;CIDuN;@BDHYePLJJVYGM=>FA@=74?24677:,*,(F9.2**++.5CCAC1$!.D;40,-06341.466/./-,/1?>HROL`YQGHIFVP_WOD>K@99=DLZn{ղzeTPOKGG@59;GI;E^GIGLLTMQ`YWZTV[^gex}{upxrq}m|uxerxphiqzxntkqWxyvnhuovxycghna]cZ]VXUFDFEILLF<@0#/@C9:.**%+06AJLXRII]hbZ=E==E@62:@<9754=-2/09731*+.-97QNUw:$#'X4,11//295.-462*,-0=.,26GKIKGHGTJATa]Z]C<=W85:7*--,-6462@I8;12/5L4;-98:;15*.6>HV`tݾxeWRVLD3441+!H=JN[UWhkmgn]da_gd]Ybtft|~un}moohfkn_OLMOQIggipitlWjelhpzsbnzrwvvyhlZXW\np`VPKEIGGFH@SALPQSK>?/4224;6>FFIPVUG?AZ330048?@CIXl״u^[NI=77750=wQVVfmvkrsfljg`kpknizqqx|tsvc[arlm\MORY^c_Z\\rx}zf_n{khXTpln}zgf{x{~tUWcbki[WRNQLCJLOIPKHFFHCA==6815A5>lKSRTa^UGQpA@4011A)(4;9S;90/2A1E.C)/-4-?1))"%&+.,/(/2+0003;=`8E>EAFL>C>=9?860/1/46<;BAKW]fq˦jdfUK<6?@>60=DHRW[e|wkmrg_mpcw~{tt~jon]QIM_gga]TSaefegc^^qtwy\acotcadVsqqqK}~|{t}xtlZahjbWLLQTCHLOFXSFECSOIL@056843E156J9:+)-;7;C:1@&%(',.*,)17/+.+35;A48>@1.1E7689=FQOOYiũz^[ZLC>>PSB?EJBHQ\`gtwjc`vvpwwqz~nu}y]XSMZdejedc[W]iijuonjnlnbilbf_avjet~|~qWl}{wtfbgnfnYJRbQ:OKAGJLHJHShGHA,9<6AC]=40-6.+52/4P5213*'1>9@B59?='+)(+,)(9...0.;:@A596FHEACME9<>N,**5<33167DBHMOy|“f]^KF?@IKFOIMMRUUVeskol^\u~}olqndv~kRPYafZgcckloruhjdklx{oqqytllukttvnfjssfTjpw|kk^QXkwvx^cgidnhYLRNB>FNN^OJNQWNKMJL7<>46>EFKR__pngdG(#(/5--7AEP@AC@C&'#(.&(,*/117,4<@=E9611414G*)*)763,3:HDFPhZc{̾^^YTYLH@AKEIELPKWo}vntu{{{pnixztlbi`Yfbgigklomnqqwwoq}zssmjdw|sskoUqyqfqSLYSn|ܚqcin|zlejjaTGS^sDITY\LKTVRT_J`75558>DAVShpimojOK3'(596-,;K@:8569-.$0+**./+.*190)/U=@:8421K()(!#&(').15402<>865A>>6436,++040+,+:C2207FDOP?NpjmYEFEABIJNK[V`a_nyyq~}ztx}}rlgimjy{rprw{sefiqxtrruvw{z|qneruzyvw`|owxjSKRpcncededwcgjR=O=PORSJKPMIIIFH=//HK>?GONim]Wrn4./31-.7:9:<.122,(,+*02'')1Hf541NFV9=0-@c*$%$'-()-242.06B;9764DF5047/,40/0-//0,3+.<>XOL8Nkj}{h\jlhVMC<>MKRijkmnZmput{u|nfbab~vgb|il~zw~|qkjelqqlppoclvtxx{zzyzw{uvZiy}tGAcj|vkhphaU[flh^RH1DOZaEAMMRXSMD922.>OA@oj7>}WA3,,2>)&(*0**--620,+-05;6:3=6843<23@\/+,1/\2../8OlB?>8GHR^YPKDYTzdMH?9G:2./24/3,.,).,4///EY;96@;ACEMLHIJCPLkS:;9YRMQjk\YWc`qtvx|xijphijcl{zzkaivmbfqx|}{{qmnlnljfa]^bfpsooowx|wxz|wlhn[PWhmn}~mYDg}wmNYk`U`ahxhOQ86ZidibOOHglUQA>>/;A@EE;OUOSc_]PWa7;>-.5*-)2AH;=474/+-+(',-.;O`Mn>Cw^9)++07$%'21,+,+.5./61.248=596>3532,**+/3/1,)0+@N164@B;;BAHIFS\VaSOmJHMdW\gqpdl\giv|zzurnhhbkooo{}zyzbrhkskcstrv{soqpmiifjf`\gglkfmx{tosuxyz{|}vfYW\`n|ypq_?\zsRFXaegcwdTVPCCP^iniTKRITOMF;89B]4Ao:9ABDDMJKOZag[^ZkmeYUdnx|thlwyuqyeZMKO^beu{swzyrpuvupX~soyw{qiomeW]wdjii_jtrvvt{~zyy|ww|{xe^YYa^vytm`[ey~{\rhcehebd]QRJM^bdbW\RUULKJ49AIb\2>>II`zn\dp\S;7621:558/4@6432/*.$$",D/+3?^oH2:EO:9;762$$**,)-/.0@NB@?67761?<8462+),+&*,*,-(*@:10+:6/62;NTSQSbzu_TX^_w^dcrlot}pms{q|ZUHOQd^o~}qyxlgcfpwoTfqwexiqibfa_ZYZY\frvpuy}}}|}xz~{wokcVckhttqgdqxiajuve`aoZQ[PPZ^gU\`aURBLGAB>TyeBT8@JXig^XW<=(>F<10..1*.0413?)+'&%&;:1<:I[iK9+/U?<.68-+*),*-).,$4169I?Z<77681F3056-.,)),&)/)E<.*,2---)2@RYRQME`fYhf^adad~qstjnkzys_Xctvyzzvvpgallcnz{ahwLLP]]qmfqjkljpnl|}{{xt~|{rrwrmcYkeenkpotufUParsaR`bQVPZU^\_LVT`^A7XWGHo~_4>4?RCKNn\[P0,NJIC840,+3*,4,0,*(*1+2.),>@IZ>)$.218?)--)+2*)((),+)717N^KD?GGGVynLO496:44R`hL&8d`F@76./(//0:6-.)+),000*5=G]E3%&'-+/7('2)**'&*'%)DK>O^~H?7EF401160,--((&'(+*8.+-)3&&)-.3FIFUU^\}c_ZWYgmnujg[etsh^d{sqYhxvvvy}zq}gmY]r{nwiehomqgdeZR\`inpmml{|~}zmngmunehcT]lpwtw}ikROPY_fLMOS_aYUXktssvHNNHO=7QWRa0) *7=Je]/->HAO=87+)+142.2-.&%,1=,0.FJOH;LK8./+(+&&'%*+-3&3*,]\B_kMBCED?A8//37/1-1++(&(00)&#.,(0-/1+07@EQQR`вa]hSP[iryi^ccinioxjjΥtu{QSQsvz~}koqvjx{jbhjlkoogpl[Zflntywy}}}}skaemioh]WUdk|ewyytxvuZURhXTUX[dhvc]QegssyTaPR?D@:NCKSB8A10-(''%&#)0),&&2+-05KOGN_JG\DG1044/1+.*.,+(+1-+-*8-+(,1,';3?IRPZpNKQMTVgo}diuzxtl_`z~zxpu|mjUOngvUjimyz|ysfhlfhjospcbgdgnqv{}yulhhjvl_`WQfufw|z|~w`UNNaTdqgaehjUgizrofePRA=\::;33+-0,.+-$#!&()'(=?5100-+.5@I?=JFCZA1S/>3..)&0*,+(,*#''!%$/D:?MC5BOSU^Ldcsyni]Z^hdf^QgjdRXvxu{otu|oh_ZjeW\hjxeZNRajaY`dihltyxvz||~{wo}{qt~`XUL`mmossoc]YMD_`ngzgg_\UU``ab\ao`UKMQOF31/2,,.3B:@HCDG@4""41319/,152/28@=4-)1CJFB6;M4,,,"(%)"%&&)(=3/5-31:22/<6<=@YPFL=SEC:>M:U@B9<8<(1/%$%*$G*''"(A6/-.766035AK=?PkL=C@N>F9--""&%&:,#!)$&6-/8?AABAAb_cn`Logtp~n``_[WTVXTcdomryvqood`ad\TISLhS`qddcaXZSPbkbhhcROgipsr{}wtprnnxe`fkupl`hvj`[JZKK]Tqjw|UW\[`cr~nRSLBEJKC21067BB=FLQPL5&2;8:>:@403A49@CK=b>QEU?iT5819*/7))&%)%,'&9&2J1-+57466E:LKFUjMAKG_B1*-/"#*(%+'%'"''86;6LGDDDP\bhf\BWHToljbbacVSYUOaiclkjholli`j^UQPE\bgsfjg\NNC]emhgdT\eoso|}zwwuoqmd_\aYagaXfgedL\IETRmnhn\[bT]pt{gQNRCDF>61+/:CJQ>1((#&+%),'(.5E.2;11;8B:DF_FEF?FFB35+,&"%'')(&()(&10:?C>GADILOh^X>:D^_jvg_XQYJNYMUXbiYtdcgfjhgf^]VCOTajhoy|pi`sa_WgjsqkTXZ_equ~}yxwuqnnf`Z`hqi`H^bd]dbgiebzuv{k\RV[jzp`UH@C=@08-/*E<>EDF?LXGI7.<<1><@-*)68NqSoLIIC=9XDX>6.-1..2,'&&,07&-#-<+=;6,0@>45=GDSNE@WYA45.+,/+*$(+)>2/.,?>ADEEFKJHJJND?D9?iuokk_kSHSaVV^fRX\iiefonezd`WIFPVgkdlqvuf`klcnslgXJN\bdnu~wwvqnnomg\YmqgWThS`bijptrvsll~uZkagqjpm]nO:=2,#%2,*328>=@EH?EL6(56=SC<4)2>@zQDBGDH7@=EE=42-)?**)&()*')($)-**(:34206?88ABLDNK]QA3B.1+*+/45+-9727:RKJIMNPOKXRF;>@9FFpqwy^^YLRbZY\]YXdcdukaf^rrfIFIOQW]tiyxswlg_`lol]hZNO[kpuywuppqlote\[aaWe`_gcsh}|snboghfcdnpeiWF]0)"",/.4F78>A;:9=C6(9IHC=6/;>WVFRRJFHH>CVAGEJNPVLKeSXKG8g~Wfxqkjbft`_`njab_flc`^Xa[pi`TMPG_\ZaohmwhZf[\_akl\_KINduu}~~wrnouq|e``]okfoiicfzoj`lslfinxgdRG<3:)"#*,9>A:4:;::68/&;.((*&%$%&$#&+*%%)18A12CPX=D:DHPFDAPDGEKILPTTVRBEgnnz|kuc\^]__`n\ipjl][\_cd]^TOL_Z[X`Zcqrsre\TY_`a]caTILRjuv}{xqovoeYepj_fnmdbev{nnj^hubgpl{joKC<>=4*+1.;:;45:<8:<0 )+6@?C96>QN5;G4.)),,0#%'+%$ --)&"$4-7L;?BK\QGOBSJM?F6>8-/**125[aI?HDEFLlPAJEERVMT[efj{}^esY[hii\omefhjobgtbh_^OFY]]XPdototysd`V\^hhekaVSfksw~{{spqoqpeZsplbkhbXbj~sz[[a_l|ts_TFE:=50*)/3544989?;CA7'98GHE:24@;GD:38B;;87:cN@9;/1'%+,+,*('" )P4*'$+(-:4KQH>YjhjE?E:@834=L2.))0/FbN??ABGLMRMB@IT_^YS[iiqokb`qrWX\P^Ups|gfaflecgsffbaR^V]R`wysuidYXUcgmllwiutw|~}uwonmnpc[{rmjf_Z\__mz{_\\bimvqh^TG>79<44(0516D<>=>BBSA4;@PbI@.142/.+/278=B89MC>?<*,(&$()+(/&&'$$'#1#%-3807SvNUjPP]PH;?49571:-(&-9YA>@DHE?QRQONXS^blY?avkqnr]hdf^cXMWbUbudcubjkeqnfa\i_YY]UM[p{wp`ebfogiouow{v|yw|~~yvu{uojhdfkjj|gh_NTYl}rYZ\]pi|~laZP:64G73()/641<9O@ADE;79ABX\P@/6986&!)1=H85252/(.-($#"&'!! "-/0528BIGCOemKIPe@608.,&"*&+/+*'8O;L?EIMPM___in{}upSXKMHPRRVTTW]ugd`fcb^fqsePT]Y`\prseRWCM`eotrzpejw~{|~yywpsqgd_ece]\k``XYb|}~posdb`dfaW[NE===7AM:+16178;JCI=/!9HVXJ66<=02'-(177gKhSjlJK3343-'6,%&!#'#$%#2+222=?MmhP`W[OFJ]8=70,)&()*/,+.50B>CKGHJWbrcgɞwtyqlR]KIHURWe]aY`Zao^g`Xc}pf]SUU\g{pgfZJPXdkmmqslkZbyz{}|}ywurlxkcca^bf[`ZrgP_oq}jZY`Y^sida]XGGIA>=?50,*984966AHE5"AHPgGA8;;3..40=@@ETIQQd~Q;2B2%$--*(%0)*%&$)4220>DY\yb^RRGJD@23.-+&#$)*32-385WHFHYNN_o\h_uhix{tgZ\XJETQXVubc\\dcfcVak~nimfbR[`nrhogwfU\_kliimljggdsvz|yqmosebeglncW]UkdN\z`adspZ[_hua_WSJJVZDCA7<38A0.8(49=?@-'AFRKF;;<;26559>;BCL8OIMv@04-'%&-@.%%&'6)-1,6@QfqPSQ@>CRI4-.5+%!+*5/-,,BHzKFLSSOW_R]XktyqiM^p|{i]X[YQQT]ighgyVqeyh\aetcfdS`gbdumaVnXbuiZflpmknimoty{xuopqedbipjeVVZr]ZcuwuigfwXZbr{c_SVISfLNHB;?A=<,$# ,9<<71-9@ACBML;7648A?FQTNCE9T;cbA7(1,-"&/'#"%) #9K.@47@Ktx{ZKOduf_\YYz_\Vafyipjceacpe^^~{JRe]k`^`ow_]f\_dchTO]cfkgcnrx}xtpomnhbejkgbV[bi\^epwstvm]W^r{f_VMZ|vYOR@35J11,"#,7;=4?-7@GNGVBT>127A`TNi]F87;<>6=0*06+E0*&!"*6#&".>/@?7RRgYUS9@WHD9=-)>++"-+0)73D5>;@?G`y]nH<>E@=B:/2803,&%,216V<9<;PeJO@ACjbWPFEMM`[Uaigdf]cpbZR]`fkmdbwixgtw|v`MLKaV_WgsenWY`pafYnvRcqaappxƿzuqnmkb_begda^W[jf`]fnsi||`oic}yv]^NKMLN?A:45/*#3-,(-22/%'?LVL=C>B;43?ZRLKQM?WC6H;1(,:,-A*&(%#!%!!&(0neW_cU[><;:9F7=42^C()*+>4?@C?A;\OQ@AIHR\]boSF>HRfecveibljcNS_NRa_\_cjnq{tzj^SCMZ[[acl_vaDR_`\^}natjmS]jsw{ľ{yrtrkdgfhlbb[][]hi^gxcy}nvjenxgZTLKBD61259-%"%(80)/2(#7;IcoE=>C=<66BNFMNRTQcPMKP-*%',%( "%$"$# 8/{QPhWB>624919446A)4*/4=SI;DQGT_a\aiosqJATeThmjoj`ZqrzyyýzuuwshdjimqbWLYgeb`dno|zxytcfZhbZQLTLHF;8654)&$&#-+,=BP4>FJWUH>FA6M;B;1-9,3+(+24=L;CgSVDLJ`aga_nxZ^_aqdLNZoznuSFPKNcbQ`kzrnymglQEWbeeilku^HQ_h_kopqegfghmtxx{þyuvvjijjijlaVJV[XT`|t{rwejsjusm\c_TRORC@AB9J-4$+*!*5DHB4BBHRXSM?:96A;H78:054L/45046,>YH>7DM>CK=;Wa`hl{wck\fflt{cc`TgOPPPWa`S[Rdpuvbc^WQmolouwjU_\Rdtmo`fbhdqy{}zxvopmnohqjUMRTFDRyxsyuf_ZT[bfnrpX^SXKJ==60+$-$ ,)"/AEB>46CLU\XD<5;G=6839kdurehsd+  !$(+$" $?J,7/24<677M3950553@/06*=E7/cHL=BEVNJOIghfhw~ehZ[W`nxmommEFDLJJJJTX^qUVP`zkmciiYTWaemxoo]`aYC_lqpp|qagnrejvx~~wvnonkhkpnghcXOLSdxypvhVMNWgkggf\]P[IH82.,,%' $',%#3AJC@K9>TWbfJ<4:64248:aXh`eao`8.#%"&+$!$%"6A.3./37:619045828556->./:@6@C;7=CQTKRNRRdyg]h{pk`V^[_cg}ubRDUL=9BHQ[RSTL_dgxpedAHQ[Pcusa[idObgrppfVakoo}yry|ſ}vuijmgglto`e}VW{maQNR[mpx]UXYE;JJB33+&*$*-1"/?@AFH5088120)-4:1/.492+1,18:247NKJZCDaiYV]b`jmca^]a^z[cutwIPdnBBEXRT_Yh^f]\^WCEUcRfaejsIxl]llqlypdhmqpv{{wsghgijnviRZflVayeseVcZn{vc\bTB?SP?7)L+'-0#")2DGGNMBLAGQPIB=:5276G<5+-1126-//+),'.4+-0/<7;/5:[I@SM`SVYVSdjgsvn_\xfeqsolllFRQOPGHU_V[agr\UCRNXNPZVVTQ`g``qgflqkmsweilhpzww~}wqmoljkreRNX^_`oyuqdTUT[g_`qujnaRPHBF=90,.4-+")C50AOQKMYOGESRIM332/6;=LA?AR[UBX>2#')-'*) +"'&"4#%"?MFH14,-24=:3/1-13/-(2-8106J<@>K[DFOZMIVWgqj_igk_[okgshhkALQ;IMVMOOOYUa^^pw`NHN[ORnTM^\dWZ\dWVkxorujknowvz{swyytljrsrl|UPOWX_k{|vulYaTgbaqjrneZlITe^B?2>J1+('.5>98DSSY_PKPG@=97,0@>BE:C@:647832;/.1,-+)$+.15;+)8F6;BGINKSUMJV[g]Ybadb\mqo|ns`)*79HMUPW]JRf^cf]jYOBNTYPlO\pleY\g[Diu|rqqmnosxxsuy|z~|xqmlnrknlUBMGZcl~tpastU^ecepsk_VNIHJM?++00//)63COHQVSP]gd[QI7JN7//48?BP7/&'D:A,+,'$#" #'" !! &$"FXgiv}|sx_Wdkdhjbesma]SH@NA8:/,*$&*2:?DGKMQZ^RecTD0.-9>@8:;9<86=G-$--/.+0(#%&$("#!")  VM68H6106G@:9/2/72*38601oA96::GIPLXY[\j^gg`jkW__`rkoH@&4KzePUa]WZXYYNZa[[hRQM[egrnrj[b{qwkszxzpwlz|qqrpw|~zrlurl`^LBKM?Xffioj`lhidafu{dw{o`WYEFPJ=@2,+)..496FOQT\b]WRKQA585:AB==99146?:;./*&*,*+$ 0*"!#" "  !$#nXG@L>2-,?561A-++10)-;5+8GT=;59:=EFEKbb_Y\\gi`_\chXidqwoPU<6IVSMN\[XWaX\[oY[QWTMGLeebotphxLedqru|zyyjis|||~{xrooz}{srorpe^[ROIDBY`a[RU~zprkbjymerpme^WPSPkOA;831247<8MNRXUY`JBAEFA?9ABH=D:376BG576*&&(')$!!")&%  #%!BL?:6---*A69252(2-'(,0;/-6><425=;BBEM]V\`amllTTMQ[[hljkbOC86GVCLZW]kXRVORNMQS>IQJPab`jiVNh`t~xvuikrxx{ylkmgly}~|wrqlohedZYRCAMVX^U\|~}klqq{tqfcc[ny]TDB76-2)<<5GLY^VPRLENF?9@BD::638//'#%%*%%$'!$'%,7!! ;$) ;8:114,-&'/5..HC=.'!$B+(.71=8728CE?ED]Vu{lY=?NMQd]QXgdjaaYTeZO`[WYacWdMNG_VWRPQEAT[cuwph{|zmus`b`lqyyv[Ugfn{|~|{{tkqvn_ZZV_ej`VTXWcet}wnkiiq~q_cpbZGNaBI=7;AGIFOMTQUVNLI?/2BYBDHOLFRPJG;4:4,)(''&$%#*+ "$##'" *&'%.15504.270,#+13/394.'<+#'*&8545@5Q>=GOZhh|bM>FWX`]Obf`]`[]_eZNOZUw^gadS>BWEYXQLESeaht|q\qcrj`Z`esy{upTakuv{~z|xsrqqj[WX^aaefealju_ezqw|gfekrzrlefZITelJ>=?GBNX[MFSOUYPC;/;=E@:CIMLCEI>A;=H@DDNMJKNKKBBGFC/:)$$%!!%!! !#$ !#%KA3'/88846.3/0/128@ELMNZ`cZb\GRYDJKE\^qjoÔ|ppqqibVVbqvkyTWki}}zxxuvwyzxphgaVbf\\fluzsmov{yscffeamvlqkni~li`fBQE/;85;@nLIdVTSYUICJHKJ?:NNJQ`>DCB?L;i?@:6,%)%")#-**' "%! ##&';*)(@7:<<2<22At@-A>,).A(,"/1,>884A\Jh\dl~rsx`f{|{zd\XTqghREGQG.?>68::BD?DQRQRMOURRSRVUIXXhbzl]JNB>>3=1( "((*-$%$$2%")),2-/G;<1-69EN70%=2+**.,*8&/)(63+-++6;59:A<93HBKdq\iFKUutl`YXXZTSKJIF64,41=DZHMX]RL:9@>>[aOG\ahm{aUehig`KVfjnq{zxikvz}prx~{|}{vonig^`[VYjmfin~y|zrmg]e_Zagirkoe[|\V929:F=>KBGGFQQKWOffURku_Z[[SyoNF9A=<61/))+$&+/-& +*''.'e,3J1:6O>>W[P9+(0--(")-E(()-2//)*22:2933.:<>QIAOdaTaA@_op_Q`VGRRK@EBB3206bKFBI<>P80.-/'(&)0FI()$*(-6*.)1-+-5]4XZDMCCFHMTUH7DTC?H?:C==5662-.)()+)X<21/8)))(($%,*)/;9=<:2,(*&5+(&#$'<),31)(,/?8:01.;=GADGS[HIWKJNL_dgaSMEHUEO[DC<>0697<;:BHKJMOJ96IK.8[RHceOYaqiUbekeEZnXJbbW]^quzw}ynrw}pnwwx~|xz}yrqaZWWdaknijtv{qnulmntvib`oZipbcpmdgotS[HC:@922;7=DaIRFRCIHOHPV\ZcY_c]`gkWGL^C984503>54+! #(-+)Q61)/'&*'*#+#'1)5J32...*&(,)0""!'&3&' C.>+))5/31GBCPQL~_BX?BK_svjaUTfJMPZbA=WaA/3442+-K00.=2:]VEHD=68E`ejdhXRRHLNUJBGH946178<:=@FFHLKA5$.3J?NMACa|xfVHQWkL`R?DZkcPju{vmqx|f^^gqv}{}qoqpqtnrmms|qfggkkmlujxkfxg^`TZba}|othnTWGB<=636UHCAFFPRPLKC??OJOQWk[Z`]]_iUc??50://5.24,-'%!$#(%"#'//)/*//#5"#%.%&#)(.21($&#&!%-+-%)$ $"!''&60(.2285F@E<1,DZcpgmzpY[UMEGECD;:168C48B:H?KFECHD4$"(7>QVO9Em|rhwmYhaYP;EK/9]c\O\t}qsx~{wlY]crvntwuyyqqifZXkmij{sxodmprrsyrmovxrle[`cd^gemzuvu_[S]917@@:>eW\IKKDGNG>EDHJMOU\c[]a]ZXUGH@:2/3505-0--+) 5#!$$#''%4*(+:#*2(((((%+).(-0&&*%(3,<9'"# %#!"*/<%3.'%&**29>8523FPudsecSQRLFAAC=?2-186309432000546))& &*+')0+.42$$+&(6))&(%':;$-/)0/-1/.+&$#"!$(0*1,')) %&-472MIKON@@CEGJFLMORUW\``aWVRKF>:>:76780-&1);MPPd|cIHT[ihmnjrfRhdZY\bP]x|v{qjvs~tvvxrulndW`bedihjmsnnz{rr}~~fagchcngqxmmmnitmbQFIIUE>:EHDHXKKHJHGYC2BJVUTRYcb`\b{kC<98<<2436<.+4/.)'%$''! #"$$%)>+88,D)1(%*'(;4+ )7.1,*%("8&%$&#!!($"+..,&,6/2212A8A]VOSWeirnhjfSJ\CFA=;:2668:?GHEP@?=;@C<+)&4$8WQXat_KT_hvmognigce`cVZfyyvz|r{sixyv|xyysnpqsb]kffmlursxos}rmnc__^a]p}uzmloflqgVYMIeN@?NEF>SNKFEHLRH@AHPUT\Ya_c\S_UA976846330<5<-*,+)%!"!$!$&).+)'(-.947U0.,&%35&(**&O-+'"?s.x)%'! %/,) %-;//.1668=GZGR^ct{ugb\P??9?BEA658?9::@KBBA@CI>7300.3=MSQZYd]hutkt{lnjlyxaedbmbmztrsrx}gwmksuqs}wvw{lrp{uv~orqwfknrkjpjiaXabmq{rfanqneTRQNNMTC?CHOLNJIHEJdKnPPRNVjeiW]fTN?=E?=L.24066Dy<(.-)))"'&(*-$-&4+16^D8)3:4-# C#)'#1%(&(?UG+&$!"'3&&&$3)*.-+367@9;DTOTcmd\][PMAPOG:D7497776>C==?64:841,-3AuPOURe\m}itvjeYa|oWicfihxutmekgjkwtfwwyy}trpjzzwvshlflsq{wwtx|se_bd`nnss|i^^laTVO]RJFRBEFIOJLGKEGDSHFCHNMSX\XSTUOI;88=:F78736ATpu.,**)($*,#%)(%0%7412=I-)):L'#""#%$('("&19"#!)# #"$"&'',5+5<3/1=JATJSr~~ldcY`X<>M9EC=>78<988BL;:<@9:33003539;CUYaoxpkpqh]ggq]d^oso{kvqrzyjuvzfv}ytolkmjhefhdpjlo}}ox|tli_okrlulhzoba\`TMSSLWpH?FISSXTJCA?7DQYZZb^YXVO@;7:328:9:A@?SO>>:-,7()'$%'#$)&2A49/3=?'--($#& &$(),%%!$'!#! "!)#+""(U( "#'1-/0],2BUEOS^_}haJM3DYG;AU9;6575>K;5<6B:9<9921.2--D^Rav|ilongkjgW_^Wa\`cu~z~t{xtxrw|{fjelqxoryrspxr{~wluurokkcfklnpxnb]\[Z^TUVPLLI@=GNL[pI><=@;=8:ADD4;7?80*/-,CKG[|ylwqsRssqhxaLPaeT_o}rywzwt|~}p{jn~xw}xuuywqotxnmngekmnmsqj]W]b^Y`cURWFADDHGM_dSE9;BNKU]WYdgh][YV[VKN8258?KGGGCJQvbI5-.E)%")(#!%$&+057?;24(1$*$%#0*(%.*3'%$%## )")%$,0"2+'.#'C)4=>:@58@<7S@CGFZ{eI3.8kWIGYFB;:?B@>;OPL<88=57?<5608FEMJnhos~TXjlktzw{~qst{q{~~x}|p{}v{rx{yuklvssrcc`iufSKMUQLCDGLEIGiA@JMeNPNZYRV^_bZ\NA>:58@IP=Zorz[<700#$%$&&*&'+,*.-25,8-9)&.*)),/&*1&$)%%%)"&& &#'(! #"&"!-4Z?4=OXunp`UM79<=BZ;OB?>67911B@FQbi}PewƇbpzknt[ntzoa}wmmokio}~|~{n|sw|nmzotcaZdSPSPQIYJDGPLOAJVUPJJRZ_ie[d]\maw`K:N><=>QD16AT|\M<'.&&&$'*(&%.`4,,-0,.;0$#8A*.1+-.=$$&)*#,b- '""3($ !%!861=78@6FBBC3AJPdUHEA9B<<6D>;959;A]KNQTjB>FGDDIL@097<767VX=U8=H9>7TIE:5>1781LBIOTeakwvhkeVXD]mttwrw{~j[Zvgiqqm|}~|}o~gooqpwynnkWWYOKKGEAAB?EC?A=EKOemXZb^\YYdWTQPWoA:?H7@>KcCP7Wj?@B8*-)%&$#%')*,(+.7')),&()+&')45,'*.58$&-#'%/C<7(3%;b72!"%63/0747DOLCIKPE@2,19A2=99;9A;7=?NFE<6:1<30@FUOVmx~|ykjcN=NnEK^h{pmot~ufsndf|{w~{}u|~uxt{ysrqnmsyppkkiiRSLNFHFECFJGNHADEDIRW_[a^`t\[^WOUIOFA>AC=]LSTIA?A=29YH%%)#$ #+1*))(/,,(**--&.(8.((2\D03Q=("-+%*/C+%!5"0R '!0R7616B;?@9JGG:>AAHTRIJFCJLWa[_\cY\WY`ZYJEI@:B68?@BB:4?TPu1)&)+(&%$%#+*+-4+&)6'&&)%%#%38%'70-1.)<. "+=-) ##"#%:& ,=//X?;=EJMOYEHE^UXeHC46:A3%08@?PhD6283=29=87595=87R?;CQf|om[l}u{~vl[R=VRZTV[ohoVVH^zv~kl~r{{v{}}~{z{ogefe_cwggtn}vhte_bcXUUUSNU_YNIC:@B828@H]JLMRPQT^Y\Zh^gb[RVkUKMFFM?/)23A;;?=53;=D7;:23293;>7CHQ:=Mi_T[}utsS6FFUVUSdd]n^E=FRtpjqzv|~s{zpihdfh]chhsnafa\ind]bNWQVUWRbTQKGPFCFB=8+&# "%',3*101280-$;)%%""E#$#! " �--((45KI_@DEKTGHUXXQTcMO8((.<43;N6347>@?6316565B@;:368?NsrUpanusznF7k_lVPdyjfI2DKnffxs}x~{w}uljkqheh\gckaddrxxmoq[Wbt_POOUSYKDGJIFHFHNMTB=HUQIKQYec^ffcha^^YiQQDD;:@>A8?A=H52?031*&*-/,),)).):**((;)''+)*!"'5'/"$('&.-,-.5?1:"'%$"+7"<&!!%!$#-,='4995158@ELAB\VLphK))A.0.J=345544>IG9657487=761:9H^EZ{^huvzmkREZjdbaknSF8?7+.,136),%**-*(-).0(-6)(&$*&2'%3%"%% $%"%1-.)(%:*'"!"$ ,[" $ %&(/,KK7/15AFEHH\vu\7'&*)1:<@1-335;>?=./710BH7>.7<@CcSZ`jhvppbUVoiecvnuWTA4ASVdRTij{t~riemehkffXTs[UX^YTKO^\ZYSSQMWHJkee\RNXXTNKOIMFGFGMhZ^qj`bagfaVSURL?=88::J;8=;5-,.343/.32/-:(*+.*+)sH('$%&&,#'" $!#%''B=X=+1'%,*$ #!(Y% #&':C2668?zSMOY~oprvi<,*/(!30243-647<ILRLYiuddphWaY22+.&&.1/0468;E95C)2;B:51.6:=GVUSjYcwtpoptVN_Xkb\~[XdIhjpe^YLJFKiejmfY_pssinkmqil_YUIFHNfgVJDCB=VKOOIOPRUNTZT[YQPKKCB:JRPPX]]_qe\Y\XKAB>A[4:7:22CDLGL;843-(+3480()*-)++'&'&'O)$"'&&%%#! "**/QQ/1(05B+2"# $&## '0'.@@EMFCJ\QHLXguh^QdX9&$"***V4:'&.17185A51368?244:>CVZX?JX`pnybYUaS\gg[nKQK]afe\Yf@LKLsX[aY\belrpoq~{]b[[SRJQKQTQZGEIDMZUXZTTc]b\Xd_XUOOVV`WNJQ\bdhwrnbWSI@>=:8A818638AU>B02##"!#(,*.0C@LOJPS^DFVsTNUDEGHNPHJFN]dfjngPZY`W_b_d_]VmrhVWOJ?TK?MRW_RVYcdaaohlZPPSPFOSMMMQEDVNORPSYYU]`ccj[]Y^eRVdnd]PRi`]amdiVSFI;=945O6/8308]I@PND:508-))..,.&#)(','#$!!$ )%)&%%"$&#./11-)*63135[0$!!%!1##+),+(+1J@CZGTXQKNOWfhSCGK??86?5Q(-4206/19032*-0:>5:3CA>KHNGIDPmlbfigcTWVYWXi|iecd~^Frk/@@TWYXk`R_^b`dlttn`ZELOSBPmlSLBFKV^[WRg\a[`[ce_YWjzlY^emytVjg\\aWRIJEEE?4--,+4>24533>5FB7@]55/1.-+/'$%'&')%'$$"&$''+'-*#'&/F8C.2699=>0&$$$),%' &1)# $%)$))0?1XBKLUU^F?`kWTQNOEQAFMC"#.0,*0)/)/,3.03929KLdCBTSGC>Ldm]egjo`P@BBPbppkrq[U\YrYAE8XhJEUi]TXi]ddvp}sioSCMPWH}SfXTQTPTjjwdihiTm\mdebvyj^vqjidiigVPCEAIJMQD22.1..7:739>793=9;1610***.&*3()'&$ ##$!#'+()&$&$!#*N@92@-O@..''3-# &$:9=!+ $:8%&-3B^2F?I[YU\VIGKNXRdijdSPRT_Q\TQXWUVWWW`^b]XZe``hfco}xvrs|qtusmcdKMTIIH_fTE3124727:54,9;9:0190,.-*;.*"#+)-)#%%(%'*)+&%" #""!>(),*,4&-,=-=K"%!'+ ))*&),28;=;ILLJTSP[VFM\QTOSD@=::I11(!&/+,-42620210311529ACKI]449FO^lZZRK/K[guY\b_UMH@=FS[UYQ?JIOOQSQ^gYXRVSOSS^^`]\b^\Y^^ZZ[`cadmgjouuzyyqns}rkn]PLJKLHPJD914A7B55423479=73243.25,03)+$&&%=,&')#)+*/%%##'3&" '02&.-)%,/"N@" "$# 8&(%)=>>AGMGUVNPSHiKHTOVdT=:;;;G77H&#!$".063222212123,9F;=[C558714C;>=8934Cc{::J*,$+(")("&&#(/%)'$('+,(<)*82'*'&,%04'"%(+ ##"!$"!"#%$)9=D;GFSTWKMTRPPITLLJD=;G=;BwU*#.$(,2.5434>K55>539;=NC43*953;7>GFPiVTh@NGUUVQPCEGTXXVPSNM`>9>Kbp|\HdYWVOSdunXcddgccb\a__Uaa_`d`\uukeesreddjhgkf]QMaPTkC88E=?I>595/7:5HEI;9=5405/-0)',*+'2+(&%$)j%)+(($)')?*.*%')'&(',3 %8&$#!  *#($%0X@3K@IAMHM]VXNKVA@@@D=33JgV9:7533@42BCFHA@F/.-22,+&"%)%,)$"#$$#(/(#$''&&'+-*,')2$!#'#!+$ $% ,%(*'+(->EBR6=0;IXFNPPDHBCLC=;<8?P=#'($%,K/)%-.121.+-1843vP=HE9EB:9>===bAE<431+//=,/&$*+%)(#!  '+>0$)''&'*-+##(&#"!(()"!!""! ! $" "%)*08:E=4525EINHNJVCB>ECE:@=GJ3,(#%.,%.&')-*)32)%-83,2I?CJ8;d;:126GGIJKVgXWYSPQN_][qtud[VTEDDHUOl{ckU^o`]Ybfgmhgqm^^Z]hipm}ecmaeaf_fcYPVRHNLRNQFFFIDGGxwhb_[E\z@@<><:;J5//-54/.-4,2(%$'"!!"!",**4&(%.-7*,*$&$&&&#$0($%!&%# $5&@9"'#'-/1=71499@JISRJHZBIAC?C:>9=3.-/, &!#'#$'*)/6.''AAAECMW~UEE<>697<;ID411151/;/;,$! ! &,125-<,*),?-('#0&*$%$%.?("&7$& #($&'*,.4?5L@=:OOKMMKDCNGC>JI98A5177`.+%#$#$%(:)/.#)+4F>9?;:8;,DRINGUV_Y_NX[MWZXba\_LU^T`icagsXbirj\ndwylb[KRYh`hmt\[nlkksngTZQLUSVgKJSLNNKIF@XGBFEF>DXD=ctOG@?9==>IAID=1:8/24E**+"("&%(/3+22G-),)*+&+%)')$$!)1>#% ! #!$#-1)8F@DNFFEFXEPMaZICFHDC<>L85F2.26>&'#))#%/,41)$(G7?@=95DA7?HOB9ID9@KAR[gTOMH?IQ^^^[_]LSNTaR]Tbmyg^KVrpMVJBVFJNW_]`^adWWVkgcic`b`QQJGGEEKJPLMIFC:>FJOP^VOFFFE5@ID@G<=9AAGEt=A76_[D)*+'$ +5%*"(,b1-)/-,)'-.. &#(1(&#(!"&!'!" %* ,.)43E3<,'*$%#+1.'+0?66<=7<@;>DD<=D/56HEDFIGT[ED=LPNOORORIHNRJR``QmaOXc~~sXEJ?NLVGQQZZX[qc[Z_dWVQNRJHCIJFBBAFETNDFN4ER_~mXOXJL?DBO@EEF@8AL>?GnT;6=2*..*&& # !<&!*J.5+(('('$0A('42c1+,-,'-"%&3#+!-12!#&%$9>:NYSD:LTIOIHJPFQNMD>B>9/D/4%/,/*!"%.,'),435<@;7:ADBA;^Z9G>BGEUKGSPZKMU=IJKPPSUNJTSZZ][SJNdurvbZRXGU[OTEAabm^_hd[WRTQKJEFB=@JBCBA?S=CJE>4PcnWNH>BCF?BEK8CG;DQ:9cQBHC0/*+.&&!# 0892*($).'&&-')*-7+-2)6Wo3,%.+%'! !!# >, (**"!!*++36DOOF?FPNPPXQILYGMCCJ;84.(3)19*-$ &.')/566:@:5:8>=@=EQ]929CE@MHKNUFIA9/9AIIMQKKPfUGhSGEKE=Nie\gdYRPWUOLHHRRU\g]]\PJID??QT6<@=:;?A73X1*0E-(,&("(I-)')& #((&&+&((,&5/,((0640+($%$ %!$$ '#"#$(1,09AA@MFMKHHMM[ZPwPA:>:C>/0*&/.,++" -**0B778;;82/;?9@IJk=)*5EC@KDGVJ@9327A?DEMNMMPLN[OQjD7@OFFJQQO[UJPKQNDD=LQVSSfM?B?8C7?97489A;C;:=?:;2GM`HW_J?=E@4V@00253;IOGIXHNIMOLBGUQKE>FF?82/1,16;;1.&$!(),?;E767<;6U/:EMCVIa?0%0OSKFHIFMZ?2-1@HNA9@PVCJI?FJUG?=563EDFPW>A>BAAGEGN`PPZ\E=>==>8?71794>A:N@4:><@OC.0*#212 "#"*(""')&''$'+.=HICHC?LOLLP@FWeLDBSPH>;933.AOm:*% #.1MR@KU?5:>7@-,TOMG?>/&.9CFMFUIVhB46:A>=8LmW<9=8@@EC;C<=?A?N@E>9:07D<=CF>:6<==723978>:I8UAI?>?=BMM`KMAAH{@9975=-1230,--,,C,K4?5$## "'!""'$(+#!#4.+)(.7B3/4B7265+-,V[.&$#!"  $=$$*"%"$#,,/FB..+,)9Q@@]iV/4BA><7H^\eI@A4 (1=CZHJ`]WH;8<798I:9686@7;:@EU30/*.3,H633/9:H=.8$)"!""0""<\%%#/0+'+44:D>:iW@=6.,31()/') '"%!&$/" %#""&%/.4P;8BJB;:GBFDDFCLC?I@GbsD@N93:C;0A57, $:G9=97O36:H=:6:CFCB=EC%'6NINEAF@JBF?Z[aFGYLS?958E610+08863..-1@7331&&# #"#&;72&//1(,04KM8?oi7?P>;F1*-.&)" )C9E'"!"!*%"!%$2.6638>^M=N6;AD@9;823-.#.6788128213W=:8SSBYSI72$%7DEF:CUMfH=9=EKA42=>430,0J:/4.05.,'S1570**$!!'((%')(----1(48370-;<`B8/K1,0;A--&( ##$#,'#'(,"!&%)'&(9??>?Ei58>D<<=P39/76207GU==0:)./'2*1%,#&$"!"( ')#$ $8/(5@K68BP;799;>B:BQWINIQ>:KDFM745:28,$#%*-14@:5A=597=D;89OUzC1**'3:I[S>SqKL913//<;19B5;/)5@}B=-,/6,105626117538;59;<=263256OC<8>7Ic~WB>GACDAFFNFF?:2;.$'#'/79;8AD8::C=.11/7CL0?.*+-;AI9=U`HR@/3-308545397188917929//11/-5=3;:48:3;7361.064739:45:2:AES>?@@9<<=D@;987C;9FOH87.-,-+,)87339/40P<08097:Db,88:?8=987>261322@LX\FDFD@=;4BKYJ8Gb5-0%$&/2E924HM<884?=:O4C63,+'*@CF78>BSH<:3278:40845;=@ilS<592.-.0/,.122,2695<4341=450112406=^R;<,.121/5XYcIGQQRC:><>bSJ:5*.352*$(%13.1.3=GD=<87=0761>3,*,AC9B:;:JpN;359272:;-0534:EDKV/25-2F21-33/.B5:5-16==7634033/5=8=EC;:2;:?CCD|=7/1+7=&***6*#.%)"%]#! #K42>>$<??B7<82935./+9yCJQXJBEMNA?olWO6+3-3:0.+'.11,-0=@M?BDAF5;6BK>@3GI5*.060B30,/,4031053668001=LXE=54/1285>8MM>=><8;59>:@9947F.-+57?R374Q;:@a;=578g7F^@7ZOCA=<99D?=54OU<50*(&849.5283.1.180+<.0OH#3, )$/@+ ">U5:/)((3++57/.300/3/+1DIHJTkFI_ILH]C:2*,,2?92)('+.0//65D@O>BX@598+7388>5A:;9*,?=82N?>8>7@kWD@=A?><46;4;87870750L@2-/3=920*4=LHd0('0!$(8&%#"&&)0*+0,34.124*)/FIBBC@EBGBJNBGF?91>/B3I:51()(+4/C26H@FB;>G>J=PNK:9LR81'.=E;G@9?:::9=8?MA3959\K=><68/8>9645;637<2-22:@IRK:?6062-2<640),)'1=?(.02./?J89@=2+,-80-'A,AW;;#'% !!"]*'$)(,#&--2H1?24-=2@*4>>?9<<69@>BL>@?_=>:8>=699:6:B?3>62722:40-156>nK8GD;9>=027026/@6D37<;3H6).G-4928.22/2:14=,793<;M4396-D;:/&(')))()-10-09@F110I-*/6/'5<>>~\+("!!"&=.&$$0&03/-10./23**(-6=M=BNAP805N632('#"+/3F=9<:@9C:C=>=AFGBAOGJ@F=?M955:@66=89967>@8:2416BDJ76nc>5>?65QqQ>3C29369K2955212.2(%&'/A6BAFROZJkQMIXID.15641$*%!.+02564N59CE@9;J=BM.&0,02.)511453=D9N:>:<@J=>XFDDEKA>@D<;;KDD==Q:@8C@:68,'(,-IB)/*.<6/>B4870)-1,:0+->2/G""$"D%$"%&&*:*45B.200*,37<:?F@GUYhXK[UsOF@@K2<85;SE480,.2467EYXpnG=6;<341)83:2/(-()1.0188;4::?J>?DEE>8:@F;<>897P4/?KGBED583?037::;SyK=;<3452202:5-2/.12-32,477(+51F34.208:7250,-C8//,,*'/:1-,C,3./,<^d00*##% ($ # &&%""(1.0>:.//()748@NKKS]PEFOO[SGGFI_@*-./pKT}<9F'*8:CJoH941(-6<3989]1(.7Y25810J;87;?471?:A6?ERF>:>NB8><>7IFFSB:=:949=777D6FAC7@@89<50E:545;_vP;05374-09-1-5:2272D9;,.../,)35=0-/=2.6./-+>51*&$%+'.0/-,3-,3)0<:A)()>$, %  "7.%* 00@,3649/)/104:ZQfZTvTPIPGU\maM5(*.QKD71@?Q72.821JB==A7555/1.<79241>A124>9657<467QD91;?>4417'&-;@G4>AODF25@6T5>/.&4,0)6/82;3Z6>.2-=160/111>A/%(*,-2-..)*6++&1%+(...-F(/,)((30)#+"/*('.*)%0=17.4/-80C/14CTPKfNF9W8625;DKC>HVrMY}DD6mR:011,369529;?=::+'*/.-0/45.6451137442/,)KM8TEC@6.**'/22/,,+,&%/Fn?A`f6BO9;;7743367^ZIF6HFB2,>0;,(+51*(74-:1)418=77=9638-**"#),-+-(-+1)-61T-'440\E/,/D0-*47/+""!$;64+%&)58(01,,,/2I1-30@W7J?NIVRK3D?;501;HA6;WqfT583`~B9.5645702/>C9L8/-#$@$8(K40965846254331079@CO-25/*+/-1204''.('/3G=E}~oSBDA[B@JGL>O93.441,H[30./1()%(-).0836/00100@N@E80783-2.-)-++*,+(-B1(((*1vZ06:HA01/.)./0,D5.-#$%Z0&*,,','&%0.L0A333475.6=EHE>I@DPILGNIB(55ADJ?AKUn`UNr+304%')*13<.3/+86CThH.'/6/+ (+..:520J5283,85-2E64638=.4(&&,)(+1&/0728,5.CbB:DIKCCFB501*-..0/.-*&% #%3-+-7Z3?/3*/5D\F<8.,0B2%'//7+&(%#"&+,*&/*3[t9>07kM,J>;,.2)&'635$%(+3I0'6V6--0++**+25/2547AAEIFKR[EGTWD9LGF^XGAJdW}QyG@=6-!+1551/;/?6>uJO4-*')5*'*'),24/7H7001,'91;;Di0**)('&+*)'/.50.+9/+0;43B=C>;1102,.,-0.4,*" !%'*+*0-;0453.01434951;,E:&#$*3,*($-"!')1B/(._yA817.-1MA;>m0//*..>:!!&(N63<7,)5,/*%)E%',P652594XA7D[OGMAFI[U?MVRm<@G=HE>_q[D5I '40231775;9CD9/03-/*74995/.-,10+G94@"#)*-*/E553c-7*)%'-.+1.G3)')**,&#)&+)*-)$$')-4K/*KV?:37/'2+*A.2R-+-0'+.+1+2;=<1)+0,.1,./5<0++&++&'($" "##$()-;DI2?>;;=4?($$',.DV+$"%TCD4)'&-+'(1;S*(%-B?5/7HO:;9@BDIKLI\ULHLFKF@:87HjgkOaOB=58..02/074;2''9'),5//3+5=P#"=)2BH/1?2#(422//,)#?.$%))*-*)(+*h/(#'$$(//9>2G56[E22)-C?PF=75.0G'%*S537@@1H-1>>H*&11+,.1,;/&&%$"#"&&"%(*F^:PDV81GCQ\T`>8L($'.3,5*"8$*=553(*)()'$+9( .,.*0.:@85.8A=FIN[MGE`LPg_?/C7bSdw;1*+*0-'9+*?O/:7I=@KYdOFbKOIIA3*c-8)JLDR\C8>KD+234//3910(&@%#%+-'*!RV,$$2+33:7;6.,227411/*+&(&$%!&[4%+&$+*$%"/)+//,>*/)+,#,)/68;adpv?=B..0/1;,-.2*41+1*)(]1J91,62)=+*-)()/041&\?O/%#%G% )%/-*%-/-)%'-S:3""$ $?,+.;::14:565E0.603QI./(42(-//23*-42'%"&*//54103()'$!),.0AQD.5F>R>F@BOOGEE;PFR6B1,*@%'&*,17.++8)!)_KDM>>3@F;2102UT5:3=469816635>B-%&&,.70/5/C.,% 0272G>F7=B879<2+)&+-85q2/<2-%(-,5:C679.00+/+,.>VOi@5WJ2/>.5))>=9+T-2M'$ "&%(%J$,*22+*/$#%&$%"%)',T>7424;<28>F8<<<93&0,%,/8/73/*0&+3@;E96>;YY23;63-539A;?95<46/84IG31(..4-.*)-/1H!*510066Q=8:L=9A304--7..,)-,+0//:2302590,'$(/,212@-513@;:0m?3AE?693@1/7=6+&("*;-FK13-021B-+.)1=::PNDWp>JJ29.5/4.D;W_<4.'&C$" .%! (#)4:AF7.''&!(#!"$/+*0)*&.4B671:32W`>787;A?:>ECElubLN>&3CPdP>6+%),-:5C6=)0342221-2/(***-43:539>9+&1253;QsYJ_\ZC@A>65.2022,,,33223.5H4Y16.45:0.134B]7/C646D74R1%*$(aZPO/:'+4*4H5%((28M<><59?*:2.0(,2Z;;;H_HH80#%$ .%&#"&!&KU3,&&&"$$(*5-(//3526/1543;=:15857G;AHCTziXx`]<.0-06A+J+'&%.B@R=7261<56;;13-312,.606?I@7586h6;;@LYYxlbyCH<8325306R,243048@<275>D=14@.57431A620618746125$%&/;I[M/4**)/"%4%%B*,'-S78,)4,)5*)+,HP3LnWqTJ3"#" #),/-2$'1! $$!'N%&7.))11/(-108CE*05;2?35=?:@_O^}}VME+-%$%#+#$)-1.3479D23-7?5<.047?=@463772353/4.65094>GBL927:TD7/A420-2C85<4246,7BiT148;BNt]fVVI:/7 &)*(0(*,769MJL=:65152162:873<ܑO68247-*-)/623/BB`HC>2C3-16.),'$"% !+#""!2#-+*-:1/117<88*,/$') (!"" " 3".0D!$!"&,%'"/(-!"%%#2)-.2=<.=55603=6::<73J=JmuTBC?J.-1++.+0.*+%.026rIC;7G634;F82;=:8:::D>86;BA33;962+IyÛMNEB4N7/*,-537?A8BH6?9>A=93G9=9253;<<@>R=E>6BHA{A;:<<=956EG=:EU91778IH<>KK}Q62;5993E3/59EOZ>C=?;8C7:07;8817WC=EY57<8>LPT]F;UCB4G;DPX+ 2-+/3..(713.:4:C3:;9<<4J-(57^A@5C?<[26==F62383H8@QOE=<=@I;<<+XBB2K3=AL=DB?HDPP?H<;@8:8,L642C)+,*,"$#"(/%$# !155((()"#%##! '#16%$$7!) "&5!4$#."  !G% "!%%15E>O@>DA;=CEHD>,*5-4-4*&3)5/,5243/I^i;@[B?69>8F83:%/1-09=64:07;=@51KS+01596MNMABT;=I<820AR=67@AC><9sJOMeRR>25=95-1J;/2+()*,%$$'(.,(S", )##0''%&1 !!% !!!!!61N7%&"$##/%!"'' &-4QSA=-5=__1(*$(,5>COASH?:8B@TKLCF7JcI;1.050.8/7B-**.9/)15>AMJ?KA:387:IOZC*+/3C659,1.GOf99,A9((43>F:=?C639T@>788?QUbJ@=I9:B1:84;F^L89A3440*/,,=3GJ4j/%%# #*&%%(,-&$##"7-*!! "#(! &"# !" #%#1_1*/'#)%#""(&?\C.WhB]4@3..52=A*&>$(:8`98M/6@EvoKs}t@@85/20-X0*7.++9@5A9=/217)+23$26D@52189-5,0327>99IG;kA29;LK>@44:9O4Hb9B75>92+)+3*,-2,/5GL5&#" $*G:+A1A&$$%%;-(0,%"#&-$# "#; " """RS+#+&=(>l-,-6_?;1.4K34148'$&#<7>-6:--MU}Z\q|y=86<3//ME//96;:=75*,0//10GP<77OL.43*%1232-/-0(,7.+*-*.3-2*/0434B2/863HHC;;:PE07FRIF<734M.% %"jo,./"5B4),.00/08..%)!*7507/+-LDOSY|^8(%--10,8/.F:C7,080-05/<@=974_\0('%(,%-/);.:0(+6-/3242.144362:549==A;11+89X;F=?.9/?"('('J;0b^=9O_70&%,Bw6530$J&'-6)%&#"!,1SUC6-('EX5BA#%!!&3,Z #$'-.)%35)*/?S:B860.$ #,0DR4@PL8H>pdTI8&")-?I;1?+,/1(*-<,,.637--704}P?+## #L7484+*3&#.1*3326224364?09E4;B>>S>B@IF=216@511=.(.5-;9-&(D%.9+%'-=%/L?:[w?/),'-5-4H.@+'$,+9.'";%'689b==Z[A^f3.(#& & %2 ;# <"%"!#(V''7@F2?a6GD8,"$$$1,1HO44K74;0)&$0-+504+1)*2)**(/6-/41I/-,*+I_4,)"$%+8<*,.*00);323/3;21435643>D8]DJ?l@A>B=>/3K66:32(%69,5-.!%/H.+'+-($%,'3IFL0391%+%2+(#%&14)7+;!&0/(;F^PKU^Lcb9,L;O# ,&#$!!#.,"$'')6*6J?@;3-/*#' $!-()%''?5TP47C4.+)'--5.1''#&)(-+(024,10(+0.'7;+'# ('&),50(1/-)((3139:44/60260A=FDG@FOHCB:3@`@9;<&"1@'(,0-)$&&$&*&*e=-<27T-1-((3&(00&-1F! +V*1>>>P~{hk]_|>MM&'!'1'!#")G%eC! "#(+2%)-7\dJGh>O+4%!& &#%&(1/&2>741.*29&'#$/,.+-(%()*'$-(d45,8/0/.%# ()+('/>'&F-0(),.6+-),3-20J886/C9&!%5),'% ,;3%&$*.(./4&H3:8%"$G/0O;@#/  #8;4*#%!YD+#$RNJ2W,CGA%*#(''&('$#!#&!!('*+,+%4('&(18%"(-+%%!$$ -,$ #!&- #%%$&$&%+3>L.,2/,(,,4E?gRaO4.06.@TgMX7J34++)4'(+)""$&&)* " ""%&"0#&,):/7J<>)?-*"$-$!c&*A483>#&(($@/1(9;-?9*"&"3b!"%" #G2+!"$8O.56$3%%"&2%%0()#)"*'&%$+,'--(-*2W&$%5'##$&" " <%"!&$$"$#( #'(/04?JC--7.-2<;{ug?24+0C*03197>#$('*(/+-.""" #%"! '.$8 ##(1.G:;A.*$ # ,./#)*N@,)&./))70 ")"-%+6V9+9%! M/%GN78%"!! 1.#,%%'/6%)%$%%((($&)+%#+%A(9m!&-( #,%"$ +!$ 2,"!/&#$)>GG\1:023638xnR3.-.(8.(&%.6,2<,2('% +$! %"$)#! %*(#*.+ARA?RS-%+'$"$%(%(*)2+++1#'!-3;8*'3";0@/5!'( %2%,2&).4**'#$.)&$%#&&+(*(*$((!')(##"! > % #!!%" !"$$%&A0@)6(3/'*.A>oci<*$%(3/<$,)141UF>,%"+% ! #"$#'+/(#7&,*.X:=7)$<* !($ !%2+%&",)!1 *   '\zO$!&%'$.(&.2))*%&0$" $%&$(=(*"! 9%"!  "  "#%#'!% #$(%$<&##!-FPA_M~,'$'')-6)"'.85A?k($%-&' )!"%#<$ #..#!"#;(9.,;O)%#((""#41&%&5),$!"#!""ABBD2)0-U4`bA4$ ! #% $*-/*()0,((8.("&""'*+'$$&##!%# !"%&#!!" ! .%'L/#$/'+/9S8[Tb8& $2>D&*!! $5+)K..-&9#$  "4*$$&)-$ &%5(*,(!! )&$("&30'%'"":M*#+!#.1~0BV6!  <*$ #$255K:A@7&'&)#"!'!%!"))!#&($ !!#" % & +$&" (+%+4A2=&$%Gdpo.0#(FX0-1"0:1$"!! )7!!"(###".'/!(/*(##!';-# &( %Z>3")*2/o/6LK')$7$'$ #,'*)0-&+9S`LZ1 #$#'#!+# $6&('$#"!"!$ $$0"! !, %7')" %)H#'+ "2'2I((Y$%!-$*"('&%''#4!'%"#''&W!#(+";O3)0*%&D9&-S*"&9 &$# $ $"#8'++%9PV?A !"!$$!'#%!(87<%%## " "  )!"#&!.&))=#!!9'"4^/5(%%&""# #"! ""!+7####$ !!+'" 3$ $("%  %+(#34L[;?0(77 $,$##$# % )!""((*+$)$D556J$$"!###"$%$'%""!!'!!$ !)" !"%.I #%(# ("(&.*$ %&-"(&" ! #%&&  "(!.'"%"&#&"+"$ \ No newline at end of file diff --git a/data/fits/NGC3344.Color.F32.fits b/data/fits/NGC3344.Color.F32.fits deleted file mode 100644 index 53200d029..000000000 Binary files a/data/fits/NGC3344.Color.F32.fits and /dev/null differ diff --git a/data/fits/NGC3344.Color.F64.fits b/data/fits/NGC3344.Color.F64.fits deleted file mode 100644 index 7b2c8dde2..000000000 --- a/data/fits/NGC3344.Color.F64.fits +++ /dev/null @@ -1 +0,0 @@ -SIMPLE = T / file does conform to FITS standard BITPIX = -64 / number of bits per data pixel NAXIS = 3 / number of data axes NAXIS1 = 256 / length of data axis 1 NAXIS2 = 256 / length of data axis 2 NAXIS3 = 4 / length of data axis 3 EXTEND = T / FITS dataset may contain extensions COMMENT FITS (Flexible Image Transport System) format is defined in 'AstronomyCOMMENT and Astrophysics', volume 376, page 359; bibcode: 2001A&A...376..359H PROGRAM = 'PixInsight 1.8.9-2' / Software that created this HDU COMMENT PixInsight Class Library: PCL 2.6.1 COMMENT FITS module version 1.2.0 ROWORDER= 'TOP-DOWN' / Order of pixel rows stored in the image array END ?????????????????????’?????????????????????????????Ĕ?’?????????Ɩ?Ó???Ɩ??Ĕ???????Ǘ??Ɩ???ə??ə?ʚ?ʚ?WWWWWW?______???VVVVVV?֖????Ɩ??ח?̜?Ó???Ș?Ɩ?Ș?Ɩ???ʚ?Ǘ???Ĕ?QQQQQQ??Ș???ə?Ș?ʚ?????Ș?Ș?ə?ə????ə?????ə????͝???̜?̜?̜?˛?ə?˛?ϟ???Ξ?͝?̜?XXXXXX????̜?˛?̜??ϟ???ə???????ʚ?????˛?PPPPPP???̜?ϟ?ё??А?Ξ?˛?͝?Ξ?˛?ʚ?ə?˛?????ə?????Ξ?˛??˛?Ș???Ĕ?Ó?????Ó?Ĕ??????’???????????????????????????????????????Ǘ?????????????????Ó???’?ŕ??????ʚ??????????????Ĕ????’?Ĕ??????Ĕ??’?????Ș???ŕ?PPPPPP?ŕ?Ĕ????????Ĕ????˛??䴴?֖?SSSSSS?ۛ???ʚ???ϟ?????Ɩ??Ș???ϟ??Ș????’?Ǘ??ə?Ǘ??Ș????Ǘ??Ɩ???Ș???Ș?Ǘ???ʚ??ə?ə?̜?͝??ʚ?ʚ???????͝?͝???ʚ??͝?ϟ?̜?????ʚ?PPPPPP??ə??ʚ??ə?˛??Ǘ??ə?????Ș?ϟ??Ș??Ξ???ʚ??ʚ??SSSSSS????͝?̜?͝?????˛???Ș?ŕ??Ș?ʚ??????’???Ó??’?????????????????????????????????????????????????????????????????????Ó?’?????????Ĕ??????????’?????Ó?????Ó?Ó????ʚ??ŕ?Ǘ???TTTTTT??ə?ʚ?’??Ĕ?Ǘ?ŕ????PPPPPP?Ԕ?????ʚ?ŕ?А???Ș??ŕ?Ɩ?Ǘ?Ǘ?Ǘ??ŕ?Ɩ???Ɩ??????ŕ?Ɩ????QQQQQQ?Ǘ?Ɩ??ʚ??ə???ʚ??Ǘ??˛?????Ș???̜?˛??̜?̜?PPPPPP?ϟ??̜??Ξ?ϟ?А?͝???????????Ǘ?Ǘ?Ș???ə?????ə???Ș??͝????Ɩ?ϟ?͝???А???Ξ??˛?ϟ????????ə?Ɩ??Ɩ?Ɩ??Ș?Ĕ??Ɩ??Ǘ?Ó?’???Ĕ?ŕ?Ó??????’?????????????????????????????Ș???????????????????????????????????’??????’?????Ó???˛??Ĕ?Ó???????Ó????ŕ?Ĕ??Ĕ????????Ĕ??ŕ??˛????’?Ó?ŕ?Ɩ?Ș??˛???ʚ?Ș??ϟ?͝?Ɩ?Ξ?Ș???Ǘ?Ș?Ș??ŕ?Ǘ?Ɩ?????Ó?Ĕ???Ɩ?Ǘ?ʚ??Ș???Ǘ?Ș?ŕ?ŕ???Ɩ??ʚ??ə?????ϟ?˛???˛?˛??̜?˛?˛?ʚ??̜??ϟ???͝?͝??????????????ʚ?̜???˛????˛?ə?ʚ?Ξ?QQQQQQ?ϟ????˛????͝?Ԕ??QQQQQQ?ё?????Օ??̜?Ɩ???Ǘ?Ɩ?Ǘ??ŕ?PPPPPP?Ó?Ĕ??Ɩ???Ǘ??Ĕ????????Ĕ?Ó??’?????????????????’?????????????????????????????????????????Ș?????????????ŕ???’?Ș????????Ĕ???ŕ?Ɩ??????Ĕ??ϟ???̜????А?Ǘ?Ș?Ó?ŕ???Ș?ŕ??Ɩ?˛?QQQQQQ?͝??˛?Ξ??RRRRRR?TTTTTT????ŕ?Ɩ?Ĕ?ŕ???????Ǘ?ŕ?Ĕ?ŕ??ʚ?̜??Ǘ????Ș????Ǘ????????????ё?QQQQQQ?͝??͝????̜???̜?˛?̜?Ξ??˛?ϟ???PPPPPP?PPPPPP???Ξ?А?͝???Ξ?Ξ????͝?̜?̜???А?ϟ???А???QQQQQQ?̜????PPPPPP????RRRRRR?ё??PPPPPP??????̜?ϟ????Ɩ???Ĕ?ŕ?Ǘ?Ó??Ș??ŕ?????Ó??????????????Ș??????????ŕ?Ĕ?’???????????????????????????Ĕ?????????????Ǘ?Ĕ??????????????Ó???’??????????Ó?̜?Ǘ??Ɩ??Ĕ???ŕ????YYYYYY??А?͝???Ĕ??????Ș?Ǘ?Ș?ŕ??˛????ə?Ș?̜??ə???????Ɩ?Ɩ??Ɩ??Ș??Ș?ŕ????Ș?????Ɩ?Ɩ?Ǘ????ə?Ș???????̜??̜?͝?Ξ??̜??ϟ???????̜?ϟ?PPPPPP?͝?̜????PPPPPP?VVVVVV?ϟ?ϟ?PPPPPP?PPPPPP??PPPPPP??̜?Ξ?ϟ?̜?ϟ??А?TTTTTT?А?Ԕ?RRRRRR?ϟ??PPPPPP??ϟ?????ϟ??PPPPPP?ё?А?А??TTTTTT?PPPPPP?PPPPPP?˛?̜????RRRRRR?ӓ?Ș?ə????Ɩ?ə?Ĕ?ŕ?Ó??Ĕ?’?’?’???????????????????????????????????????????????????????????????????????????????Ó??Ó?ŕ???’???Ș????Ș?????ŕ?’?????ŕ?ŕ??????TTTTTT?㓓??ϟ????????Ԕ?Ɩ?ʚ??ə?Ǘ??ʚ?Ĕ????̜??˛?ϟ?͝???Ǘ?А?ə??ŕ?????Ș???Ǘ???Ǘ?????ə?Ɩ?Ǘ??Ɩ???ə???ʚ?Ș??̜????̜??̜???ϟ?̜??͝??ϟ?̜?͝??̜?̜???֖????RRRRRR??QQQQQQ?ϟ??Ξ?ϟ?А???ə?˛?QQQQQQ??RRRRRR????А?˛?͝?Ғ???͝?????ӓ?UUUUUU?RRRRRR?Ғ?ё?ӓ?А?˛?͝?̜????PPPPPP????Ǘ?ə?ə??Ș????Ĕ?????Ó??????????????????????????????PPPPPP???????????????????????????ŕ?????Ó??????????????Ĕ????Ó??’??????Ș??Ĕ??Ĕ???Օ?˛?ə??Ǘ?Ó???Ǘ??QQQQQQ?ؘ?444444?䔔???ʚ??Ș??Ó?Ó?Ĕ???Ɩ?Ș?Ǘ??Ș???ŕ??Ǘ??PPPPPP??͝?А???Ǘ?Ɩ?ʚ??Ș????ə?ŕ?Ĕ?Ǘ???ŕ?ŕ?Ș?Ǘ?ŕ?ŕ?Ș?˛?ŕ?Ɩ???ə??????ʚ??̜??˛??ə???˛??Ξ?̜?˛???͝???QQQQQQ???̜?̜?RRRRRR??Ғ?ݝ?????Ξ?͝??ё?PPPPPP?ʚ?̜?Ξ?ϟ??TTTTTT?ח??ٙ???ϟ?ؘ??̜????RRRRRR?ё?SSSSSS???XXXXXX?֖???Օ???֖??????Ǘ????ŕ??Ǘ??Ĕ?Ĕ?????ŕ?Ĕ?’?Ĕ???????????????ŕ?????????̜?’?????????????͝????????????????????Ó????????????????Ș?????Ɩ????͝?Ĕ??????Ó?ŕ?????Ĕ?͝?Ó????А?XXXXXX?ᱱ??斖?Օ?ə?Ǘ?ŕ?????Ɩ??Ɩ??Ǘ??ʚ???Ĕ?Ĕ?ə??PPPPPP?͝??Ԕ??ə????Ĕ?Ǘ?Ǘ?’?Ó?Ɩ?ŕ?Ɩ????ə?????????ŕ??Ǘ????ə??ʚ?Ș?Ș?????͝?˛??͝?????А???QQQQQQ?ϟ????Ξ?А??QQQQQQ?PPPPPP?Ғ?ϟ???͝?͝??PPPPPP?̜??А??А????ޞ?ӓ??ӓ????͝?А?͝??SSSSSS?????rrrrrr??]]]]]]?ݝ??ؘ?QQQQQQ?UUUUUU??͝??ϟ??SSSSSS??ə?˛?ʚ??Ǘ??’?Ó??’??Ĕ?ə??Ó???????????????????????????????????????’???Ó???Ĕ??????Ĕ?’?????????????Ó??????????Ó??????’???А?PPPPPP??Ĕ???Ș????’??ŕ?̜????ŕ?????ᱱ??ޞ?Ξ?ə?Ɩ?Ș??Ɩ?ŕ?Ĕ?Ǘ??ə??ŕ??Ș?Ɩ?ə?????ʚ??ϟ?\\\\\\?Ș?Ș??ŕ???Ǘ?͝?Ǘ?ŕ?ŕ???Ǘ??ŕ??Ɩ?˛??Ǘ?ŕ??ŕ??ə???Ɩ?Ǘ???ə???ʚ?ə?ʚ???ə?ʚ??ϟ?͝???WWWWWW?Ξ?ϟ?Ξ?Ξ?ϟ????Ғ???Ξ????UUUUUU????ϟ????TTTTTT??PPPPPP?Ξ????Ғ??PPPPPP??А?ϟ????Ԕ?ӓ?Օ?UUUUUU??⒒?UUUUUU?ZZZZZZ??333333?YYYYYY?WWWWWW?QQQQQQ??????ʚ??????Ș?Ɩ?Ș??ŕ?????Ó??’?’?’??????????????????????????????????????????TTTTTT????’?????’??????????????Ó???????’??Ĕ?Ɩ?ə?Ó?Ɩ???Ĕ?Ĕ?????Ĕ?Ɩ??ŕ????ʚ?Ǘ?Ș??Ξ?ə??ʚ??ə??XXXXXX?????ŕ?Ɩ?ŕ???Ĕ?Ɩ??ŕ?Ș?Ɩ??Ǘ?ŕ?Ɩ?Ǘ?Ɩ?ə??ё??ח?̜????Ǘ??ŕ??ʚ??Ĕ?Ɩ?Ș?͝?Ɩ?Ǘ?Ǘ??Ɩ??ŕ?Ó?ŕ?ŕ?Ș???ŕ?Ɩ??Ǘ?ŕ?ə??????ʚ??ʚ?ə??Ξ??ϟ??ϟ?RRRRRR??????ϟ?А??ϟ?PPPPPP?Ξ?PPPPPP??[[[[[[?Ξ???Ξ?PPPPPP??̜???ϟ??Ξ???Ԕ????͝?????Ξ?Ғ?ё?А?ӓ???ݝ?֖??֖?ܜ?SSSSSS?ӓ?ӓ???ϟ??ϟ????Ș?͝?ə?Ș??Ɩ?ŕ???ŕ?͝?????Ĕ??????????Ó???????????????????????????ŕ????Ĕ?TTTTTT?ə??????????Ɩ???????????????????????ə?Ǘ???Ó??Ș??????Ó???Ș?ϟ??ʚ?Ș???Ó?PPPPPP??͝??ŕ?ə?̜?͝?ʚ?????Ǘ?ə?????Ǘ?Ɩ?Ɩ?ŕ?Ĕ?Ó???Ĕ???Ș???ϟ?Ǘ??Ǘ?Ɩ??ə????Ǘ?Ș???Ș??ə???˛????Ĕ?Ɩ?Ș???Ɩ?ŕ?Ǘ??Ș????ə?ʚ?Ǘ?Ǘ?ʚ?????Ԕ?WWWWWW?Ξ??ర?ח????ϟ?PPPPPP?А?А??̜??TTTTTT???͝???????????̜??QQQQQQ??ё?PPPPPP??SSSSSS????PPPPPP??RRRRRR?Ԕ?ח??ӓ??А?ϟ???QQQQQQ??VVVVVV??SSSSSS????˛?Ș?͝??Ǘ?ʚ??Ǘ?????ё???Ó?Ó???Ĕ?Ĕ??’????ŕ???????????????????????????????????Ó???????????????????????’????????ŕ???Ș??????А?????˛?Ǘ??͝?______?А??Ĕ?ŕ?????Ĕ?????ə?????Ɩ??˛?Ĕ??Ĕ??Ǘ?ŕ??ə?ŕ?Ɩ?Ó??Ĕ?ŕ??Ș?Ɩ?Ó?ё???Ĕ?Ĕ????ə??Ș??Ș??Ǘ?Ș?Ɩ??Ĕ??Ɩ?Ǘ?Ɩ?ŕ?Ĕ?Ĕ?ŕ??ŕ?Ɩ?Ɩ??Ɩ?Ǘ??ə????ə?ə?????͝?А???֖??ё???ϟ?Ξ??ϟ???QQQQQQ?А?QQQQQQ?PPPPPP???ϟ?А?RRRRRR?PPPPPP?А?Ξ??А????TTTTTT?⒒?ݝ?Ξ?ϟ??UUUUUU??˛??QQQQQQ?PPPPPP?ϟ??WWWWWW?А?[[[[[[?А?ϟ?ё??????VVVVVV?ϟ????Ξ?˛?Ș???ʚ?ə????Ș??ŕ??Ĕ??Ĕ?Ĕ??’??????????????????????’???????????????????????????Ɩ??????????????’??Ó?ʚ??Ó???Ǘ?Ɩ??Ǘ?ʚ???Ԕ??TTTTTT???PPPPPP??Ǘ??Ĕ?Ǘ?QQQQQQ???Ó??Ĕ?’?????ŕ???ϟ?Ғ?Ĕ?’?Ĕ?Ĕ?ŕ?ŕ?Ɩ?Ĕ??Ǘ??ŕ???????Ó?ŕ??ŕ?Ɩ?Ɩ?ŕ????Ǘ???’?Ș??̜?Ɩ?Ǘ?Ɩ???͝?Ɩ??Ɩ??͝?Ǘ??Ǘ?Ǘ??????Ɩ?????Ș?Ǘ?Ș??ə?????˛?ʚ?Ξ?Ξ?ё?ϟ???ϟ???̜???ϟ?PPPPPP?̜?ϟ?ϟ?RRRRRR?ϟ????QQQQQQ?Ξ?PPPPPP?????Ξ??QQQQQQ?QQQQQQ???ё?ϟ??Ξ??ϟ?͝????Ԕ?QQQQQQ?TTTTTT????Ғ??????Ξ?˛??А?QQQQQQ??????ə?ʚ????Ș?Ǘ?ŕ?Ĕ??????????Ɩ?Ĕ????????????Ĕ??????????’????????Ó?????????????’????????????????ʚ???Ó??Ǘ??̜?ə?Ĕ????QQQQQQ??000000???????Ó???ŕ????Ɩ??????ŕ???Ɩ?Ĕ?Ó??Ó?ŕ?Ǘ?̜?Ĕ???Ș??Ĕ?Ĕ???ŕ?˛??????Ș??Ǘ?͝?Ĕ????ŕ?Ɩ??˛??Ɩ?Ɩ???ŕ??Ɩ???ŕ?Ɩ??Ǘ???Ĕ?Ǘ?̜?ə???Ș?ə?ʚ?Ǘ?ə?Ș???˛?ə??ə?ʚ?ʚ????˛?SSSSSS?А?ё??̜???̜????Ξ?Ξ?Ξ?͝?А???Ξ?QQQQQQ?А???????Ξ?̜?Ξ?А?ё?ё???????͝????Ғ?Ғ?֖??Օ??֖???ё????̜????˛?ə??̜??ŕ????˛?Ɩ??Ĕ???Ĕ?Ɩ??Ĕ???Ĕ???Ó????????????????????’?ə?????????????Ǘ?Ó?RRRRRR?????ʚ???????????????’??Ĕ??Ĕ??Ɩ????Ɩ?Ǘ??Ș???TTTTTT?]]]]]]?\\\\\\??А?А?͝????ŕ??????Ș?’??Ĕ??’??Ó?Ĕ?ŕ?Ɩ???Ó?Ɩ?QQQQQQ?Ғ?Ó???˛?’??ŕ????ŕ??Ɩ??Ș?ʚ?????Ɩ?ŕ?Ĕ?Ĕ?Ĕ?ə??ʚ?ə???Ɩ?Ǘ??Ɩ?Ǘ?Ɩ?Ɩ?????ʚ?ŕ????????Ǘ?Ș?̜??̜???͝?˛?ʚ?ə?ə?ʚ??̜?˛??ϟ????ϟ??Ξ?͝?͝?Ξ???Ξ?͝??PPPPPP???Ξ?PPPPPP??͝??QQQQQQ???ϟ?????Ғ???ϟ??͝?Ξ?Ξ????QQQQQQ?WWWWWW????VVVVVV?ښ??SSSSSS?ё??ё?Ξ???Ξ?˛?Ș??Ș?͝???Ș??Ǘ?Ș?Ɩ??Ɩ?Ĕ?Ĕ???Ó?Ó????’???????????????????̜???Ɩ????????????????͝?????Ó?ŕ????????????????Ó?’??’?ə??̜?Ǘ?ə????̜?̜?RRRRRR?QQQQQQ??UUUUUU??????Ɩ??ŕ?ŕ?’?’??Ɩ?Ó?????Ǘ???ŕ??Ɩ?ŕ??ŕ??Ɩ?Ĕ????Ó?ŕ?Ǘ?ϟ?????͝?ŕ?Ǘ?Ș?Ǘ???Ɩ?Ǘ?Ĕ?Ɩ???ŕ??????ŕ?Ș?ə?ʚ?Ɩ?̜?ə?Ǘ??Ɩ??Ș????ʚ?ʚ?ʚ??Ș???????̜?ə?Ξ??ʚ?ʚ??ʚ?˛???ʚ???㓓???PPPPPP?ϟ??͝??А??͝?Ξ?Ξ?А??Ξ?PPPPPP?А?PPPPPP?PPPPPP?Ғ?????ё????Ғ?А???˛?PPPPPP?А?А?Ξ?QQQQQQ??ӓ??ӓ?Ғ?SSSSSS?ܜ?RRRRRR?А?ӓ?QQQQQQ?PPPPPP??Ξ???????Ξ???Ǘ?Ǘ?Ǘ?ʚ???Ɩ????Ó??Ó??????’???????????????’??????????????Ó?????’???Ĕ????????????˛?Ó??????????Ó?Ó?Ɩ?Ɩ???Ɩ?ϟ??А?QQQQQQ????Ғ??WWWWWW???˛??Ǘ?Ĕ?Ǘ???ŕ?Ǘ??Ó?’???Ó??Ĕ???????’?Ó??Ó?????Ǘ?Ĕ?Ĕ?Ɩ??Ǘ??Ĕ???Ǘ??Ș?Ș?Ɩ??UUUUUU?????͝??Ǘ?Ɩ?Ɩ?Ș??Ǘ??Ș?ə???Ǘ?ə?Ǘ?Ș?QQQQQQ?ə??˛?ʚ?Ǘ????ʚ????????˛?ϟ??ʚ?ə??Ξ??̜?ϟ?ӓ?ؘ?А???ϟ??͝?А?Ξ???PPPPPP?ϟ?ϟ??А?ё?͝??RRRRRR?ё?RRRRRR??QQQQQQ?????ё?QQQQQQ????ϟ?Ξ?Ξ?Ξ??͝???Ǘ?SSSSSS?ё?RRRRRR???????ϟ?А?Ξ??̜????˛????Ș?Ĕ?Ș?Ɩ?PPPPPP?ə?Ǘ?Ɩ????Ǘ???Ș?ϟ??ŕ????’??????????ə?????????????????????????Ɩ?̜???????Ó???????????’???Ó?Ĕ?’??Ɩ???Ș??͝?Ș??QQQQQQ?֖?ܜ??XXXXXX?Ғ?А?ʚ?Ɩ?ŕ?Ɩ?ŕ?Ó?Ɩ??ŕ???’??Ɩ??Ó?????Ĕ?Ó????Ó?Ɩ????ŕ??’?Ĕ?ŕ?Ɩ?Ș??ʚ?ŕ??ŕ?ŕ??Ǘ?Ɩ?Ș?ə?ŕ???Ɩ?Ɩ?ŕ??Ǘ??ʚ?Ɩ?ə?ə?Ș??Ɩ?ʚ?????͝??Ș??ə?˛?????̜?ʚ???˛?ʚ?˛??͝?̜?ʚ?ʚ?ə?Ξ?ʚ???А?͝?Ξ??͝?Ξ??͝???ϟ?QQQQQQ??͝??ё????͝?PPPPPP?PPPPPP??QQQQQQ?ϟ??QQQQQQ?PPPPPP??TTTTTT?PPPPPP?XXXXXX?Ғ??Ξ???Ξ???͝???SSSSSS?Ԕ?Ғ??ӓ?SSSSSS?????Ғ?Ξ?????Ǘ???Ɩ??Ș?ə?QQQQQQ???ŕ?Ĕ?Ó??ŕ?Ĕ?’?Ɩ?ə?Ɩ?Ǘ?Ɩ????????Ó??PPPPPP???????[[[[[[??????????’????????????Ξ?????????’???????’??’????Ĕ??Ó?ŕ??̜?PPPPPP?ϟ?̜??̜?ϟ?000000????????Ĕ?Ǘ????ŕ?Ǘ?’???Ó?Ĕ?Ĕ???ŕ?’?Ĕ??ŕ???????ŕ???Ɩ?Ĕ??Ĕ?Ɩ????͝????ŕ??Ɩ??Ɩ??Ɩ?????Ɩ?????̜?Ǘ??ə???ʚ?ʚ?˛?Ǘ?Ș??˛?Ș??ʚ?Ǘ??ʚ?Ș???Ǘ?˛???͝?Ξ?????????????̜?̜?ϟ?????PPPPPP??А????????Ғ???PPPPPP???ϟ?А?PPPPPP?PPPPPP?Ԕ?А?QQQQQQ??Ξ??А??Ξ?͝????͝?ח?ٙ?ؘ?ښ?UUUUUU??Ԕ??А??PPPPPP?̜??˛???ə?˛??͝?ə??ϟ?Ɩ??Ɩ?Ó?Ĕ????Ș??Ɩ??ŕ???Ĕ?ŕ??????????????????????????????????????’???????’????’?????????Ĕ??Ó???Ɩ?ə??̜?Ξ????Ⲳ?鹹?UUUUUU?111111?XXXXXX?PPPPPP????Ĕ?Ǘ??Ĕ?Ĕ?Ó?’???Ĕ??Ĕ???ŕ?Ĕ?Ó?Ĕ??Ĕ?ŕ?Ĕ????Ĕ?Ĕ?ŕ????Ɩ?Ǘ?ŕ????Ǘ??????ŕ??Ș?Ș?Ǘ???Ɩ?Ǘ?Ɩ?Ɩ?˛??Ș???ə???ə??А??̜???ʚ??˛?ё?ϟ?̜????˛???ϟ?QQQQQQ??̜??͝?˛??̜????Ξ????͝??QQQQQQ???QQQQQQ?Ξ????Ξ???ϟ?ё?PPPPPP?ϟ???Ξ?QQQQQQ?ё?Ξ????ϟ?PPPPPP?PPPPPP??SSSSSS??ё?QQQQQQ?ϟ???̜?̜??ӓ??ZZZZZZ?UUUUUU?SSSSSS??TTTTTT?SSSSSS?QQQQQQ???PPPPPP?QQQQQQ??͝??????ϟ??ё????Ɩ?Ǘ????ŕ?????Ĕ??Ó??’????’??’??????????Ó????????????ӓ??????Ó?Ĕ??????????????Ĕ??????’???Ĕ??Ó?Ș?ŕ?Ó?Ĕ?Ĕ?̜?SSSSSS?ۛ?wwwwww?qqqqqq?TTTTTT?陙??UUUUUU?RRRRRR?PPPPPP???Ĕ??Ș?Ĕ?Ĕ??ə??ŕ?Ĕ?Ĕ?Ĕ?Ĕ???Ɩ????ŕ?ŕ?Ó?Ó????Ĕ?’?ŕ?Ĕ??Ɩ????ə??Ș?????Ǘ?Ǘ?ŕ??ŕ???Ɩ??˛?Ș??ϟ?????ʚ?͝?̜?ʚ?̜????̜?ə?̜?Ș?Ș??͝??˛?˛??͝?ʚ?????ϟ??̜?Ξ??ϟ?͝?͝??͝?˛?Ξ??Ξ?˛?????RRRRRR?ϟ?ϟ??А??PPPPPP???QQQQQQ?ё?А???Ξ???Ԕ??UUUUUU?ӓ?????ё???͝???̜?͝??PPPPPP?TTTTTT??????RRRRRR??RRRRRR??TTTTTT??ϟ?????˛??͝??͝?????Ó??Ș???Ɩ??VVVVVV?Ɩ?Ó?Ĕ?’????’??’?Ó????????????????????????????????Ǘ?????????????ŕ??ŕ?ϟ?’?Ó???’???????Ó???ۛ??斖?888888??ӓ?UUUUUU??PPPPPP??͝??Ș?ŕ?Ĕ????ŕ?ŕ???Ĕ?Ĕ????Ĕ?ŕ?’??????Ɩ?ŕ?Ɩ?Ǘ?ŕ??Ɩ???????Ɩ?Ș?Ǘ???????Ɩ??Ǘ??Ǘ?Ș???ə??̜?????˛?Ξ???ё?ϟ??А??͝??ə??ϟ??ʚ???ə??̜??ϟ???ϟ?QQQQQQ?RRRRRR?А??QQQQQQ??̜?̜???̜?Ξ??˛??͝?͝??ϟ??Ξ????????ϟ?Ξ??????Ξ????А?PPPPPP?Ξ?̜?Ξ?ϟ??PPPPPP?А??̜?̜????֖?VVVVVV?SSSSSS???RRRRRR??Ғ??͝??А?͝???˛?͝????Ș???Ș?????Ǘ??ŕ?Ɩ?ŕ????????????????????????????’???????????????????????????????Ǘ??????????ŕ?Ó???]]]]]]?????XXXXXX?QQQQQQ?????ə???Ɩ??Ǘ?ŕ??Ɩ???Ɩ??Ɩ???ŕ?Ɩ?ŕ?Ɩ??Ɩ????????ŕ?Ɩ?Ǘ?Ɩ???Ș??ə?Ș?ə?Ș?ə???Ș?Ɩ?Ǘ?Ɩ??ə???ʚ??ʚ?ə?˛??ʚ?ə??˛?̜?͝???̜?ʚ?ʚ?˛?Ξ??˛??Ξ???͝??͝???ӓ?Ξ????А?̜?̜?ϟ?Ξ???˛?˛???Ξ?͝?̜?̜?ё??ϟ?ё?PPPPPP??ϟ?А????А?QQQQQQ???QQQQQQ?PPPPPP?Ғ?А?Ξ??QQQQQQ?PPPPPP??????QQQQQQ?ё??Ξ??А???А?Ғ???RRRRRR?VVVVVV????А??PPPPPP????˛??ə?ə?Ș??Ș?ŕ?Ș?Ǘ???˛??Ǘ?????Ĕ????ə?̜???’????’??????Ó?Ĕ?????????????????’??????????Ɩ??Ó?????????????’?Ĕ???????Ó??Ș?͝??RRRRRR??Օ??????̜???Ɩ??Ó?Ɩ???͝?ŕ?Ĕ??Ĕ??Ĕ?ŕ???Ǘ?????Ɩ?ŕ??Ξ?Ɩ?Ɩ?????˛?Ǘ?Ș?Ǘ??????????Ɩ?Ǘ?ə?ə???ʚ?ʚ??ə???͝?̜??ʚ?ə????????ə??QQQQQQ?̜?ə?ə??ʚ?ʚ?͝?Ξ?̜??˛?ϟ?TTTTTT??͝??˛?͝?̜?ʚ?Ξ?͝?͝??ϟ??͝?ϟ??˛?Ξ?̜??Ξ???А?А?QQQQQQ?PPPPPP??Ξ??А?QQQQQQ?????QQQQQQ?PPPPPP?ϟ?ϟ?ϟ?А?PPPPPP?QQQQQQ?PPPPPP?PPPPPP??QQQQQQ??????А??RRRRRR?Ξ?ё?RRRRRR???QQQQQQ?Ξ?Ғ???ё?QQQQQQ????͝?̜?ʚ?ə????Ɩ??Ξ???А?ʚ??????Ĕ???Ĕ?’???Ș?̜??????????????????Ĕ?Ó??Ó????Ș??????????????????Ó????ə??’??Ó???’?????ŕ?Ǘ???RRRRRR???ٙ???TTTTTT????̜?̜?˛?Ǘ??Ș?Ǘ???????Ɩ?Ĕ??Ĕ????Ǘ?Ɩ?Ș???ə???Ș?Ǘ?Ș??Ɩ?????Ș?Ɩ?Ξ??Ș?Ǘ?Ɩ??Ɩ????ə?ʚ?Ș?Ș???ə???Ɩ?Ǘ??˛????????͝?̜?ϟ?̜?˛?ʚ?ə?????????̜?Ξ????̜???ə???ϟ??PPPPPP??????Ξ???А??????Ξ??͝??PPPPPP?ϟ?PPPPPP?RRRRRR????ϟ?А?PPPPPP??QQQQQQ?ё????Ξ?????PPPPPP???ё???RRRRRR?WWWWWW??ϟ?QQQQQQ?ϟ?ё??Ξ?PPPPPP???ʚ??Ș??Ș?ə?Ɩ????ϟ?֖?֖?SSSSSS?̜?Ɩ?Ĕ???Ĕ?’??Ĕ????????????ϟ???????????Ó??’??Ԕ?ə???А???Ó????’??????????Ĕ????????’?Ó??Ó?Ĕ?’??Ó??Ĕ????YYYYYY?ZZZZZZ?RRRRRR??ٙ?^^^^^^?????ϟ??Ǘ??Ǘ??ə??Ɩ?ŕ?Ó??Ĕ??ŕ????ŕ???Ș??Ǘ??Ξ??Ɩ?Ǘ?Ɩ?????Ǘ?Ɩ?ŕ??ʚ?ʚ?ʚ???ʚ?Ș?Ș??Ǘ???˛?˛?Ș????ʚ???ʚ???ə????Ξ?͝?ϟ?Ғ?ӓ???ə??ə?˛??˛?̜?̜???А??͝?˛?̜?̜?Ξ?˛??̜??̜???ϟ?Ξ???͝??PPPPPP????TTTTTT??ϟ?Ξ??Ξ?Ξ?ϟ?ё?А??А??QQQQQQ?ё?А??А??PPPPPP?ϟ??А?ё?А?PPPPPP?PPPPPP??PPPPPP?А????ё?А????SSSSSS???TTTTTT??Ғ?Ξ??˛?̜???ə?ʚ?Ș?ə??Ǘ?ϟ?͝?SSSSSS???QQQQQQ?Ξ?????Ó?’????Ó????Ĕ?Ξ?Ǘ??Ó??????????????Ĕ??А?͝?ə???Ξ?????????????????Ó???’???Ó??ŕ??’???Ó???ŕ?Ĕ????ؘ?PPPPPP???QQQQQQ??PPPPPP??RRRRRR?ښ???Ĕ??Ɩ???Ǘ?Ș??Ș?Ĕ??Ĕ???PPPPPP?????ʚ?А?̜???ʚ?˛???Ǘ?ʚ?????Ș???????˛?͝??ʚ???˛?ʚ?˛????͝??ə?ə??͝?̜?ё??̜???????͝?̜?˛???ʚ?????ϟ??PPPPPP?Ξ??̜?̜???Ξ?ə???Ξ?QQQQQQ?ϟ?ё?Ξ??Ξ?Ξ?ϟ????̜?ϟ?А?А?PPPPPP?QQQQQQ?PPPPPP??QQQQQQ?А?А??А??????ϟ?????А??ϟ?А???ё?PPPPPP???ё??PPPPPP?А??А??UUUUUU?TTTTTT??Ғ?RRRRRR????͝??˛?Ș?ə?Ǘ?Ș?Ǘ??Ǘ?ʚ??xxxxxx???͝?ə?Ĕ?ŕ???Ó???Ĕ???ŕ?Ĕ???’????????????????’?Ș??Ș?Ó?Ǘ?????????????Ǘ?Ó??????’??????????Ĕ??’?Ó??Ɩ???ё?UUUUUU??444444?[[[[[[?????Ғ????Ξ?????Ɩ?Ɩ???Ɩ????ə?̜?͝?Ș?Ɩ?Ɩ????PPPPPP?Ș?Ș??̜?˛?̜?ə?PPPPPP???ə?ə?˛?????̜??PPPPPP?Ξ?Ξ?ʚ?ϟ?Ξ?А???????˛?ə?ʚ??ʚ?Ș?ʚ????̜?ϟ??PPPPPP??ё?̜?˛?̜?ё?ə??Ș??˛?̜??̜?????ϟ???ϟ?̜???PPPPPP?А??Ғ?Ξ??Ξ????̜??͝?PPPPPP????QQQQQQ?ё???Ғ?ё???ё?RRRRRR??Ғ?PPPPPP???ϟ?ё??ϟ??QQQQQQ?Ԕ?ё???ϟ???Ғ??SSSSSS?RRRRRR????ח???SSSSSS?ё??Ξ?̜??ʚ????Ǘ?Ǘ????______?鹹?PPPPPP?ё?Ș?Ĕ?Ɩ??ŕ?Ĕ?Ĕ?’????Ó?????’?????’??Ó?Ĕ??????????????Ǘ??Ș????????’??????????????????’?Ó??’?Ó?’???̜?Ξ?SSSSSS???痗?777777?______??XXXXXX????Ξ??Ș?ʚ??ə?Ș?ŕ??ʚ?QQQQQQ?Ș?Ș????ə?Ș??ə?Ș???ŕ?ə???Ξ???ʚ?˛?ʚ?̜???????˛??TTTTTT??ʚ???˛???Ξ?͝???ϟ??̜?͝??͝??̜?ə????͝?̜?͝?̜??А????RRRRRR?QQQQQQ?͝?̜?ʚ?͝??͝?ə???̜??ϟ??Ξ?ϟ?А?А?ϟ??Ғ???PPPPPP?͝??͝?͝?PPPPPP???PPPPPP??ё?А?Ξ????PPPPPP???Ғ?ϟ?VVVVVV??PPPPPP?PPPPPP?А?ϟ?PPPPPP?А??????UUUUUU?????ϟ?Ғ?TTTTTT???????ח?ߟ?ښ??QQQQQQ?QQQQQQ??͝?˛?͝?Ξ???Ǘ?Ș??Ǘ??SSSSSS??VVVVVV?RRRRRR??Ɩ?Ĕ???Ɩ?Ó?Ó???Ó??ʚ???????’????????????Ĕ?????Ó?Ó?’???’?????????????Ó??’????????????????̜?Ǘ?Ԕ??ӓ??啕?tttttt?TTTTTT??ח?ؘ?UUUUUU?ё???̜?̜???ə???ə?̜??ŕ?Ɩ?ə?Ǘ?????????Ǘ???ʚ???˛?Ș?̜??̜????͝????QQQQQQ???ϟ?Ξ???????ϟ???ϟ???ϟ??Ξ?̜??А?ʚ?ʚ??̜?PPPPPP?˛????Ξ????Ԕ???ϟ??ϟ?˛?????QQQQQQ??Ξ???Ξ?ϟ??PPPPPP??RRRRRR??ϟ??А???А??QQQQQQ???͝?Ξ?А?PPPPPP?PPPPPP??QQQQQQ?????ё???PPPPPP??PPPPPP?QQQQQQ??RRRRRR?ё?PPPPPP?RRRRRR???ё?А?А??ё?А?А????QQQQQQ??[[[[[[??ۛ???PPPPPP??̜?ʚ?˛?͝??˛????Ș?̜?QQQQQQ?ϟ??˛?Ǘ?ŕ?Ĕ??’??Ɩ??????Ɩ?????’????Ĕ????Ǘ???????????????????????Ĕ?????????????????Ǘ???’???Ó??PPPPPP?А???ٙ?]]]]]]?ٙ?ܜ??ؘ??SSSSSS??Ș??ə?̜?̜?Ғ?Ξ??ə?̜?Ǘ??ə?Ǘ?Ǘ?Ɩ?Ĕ??ʚ??ə??Ș???ə?̜?̜?˛??ʚ???͝??????͝?̜??Ξ?ʚ?̜??Ξ?Ξ????͝?˛?̜??Ξ??А?ӓ??ϟ??͝??˛?˛?????˛?ʚ???RRRRRR?ё??ӓ????̜?ə?????PPPPPP?QQQQQQ???͝?ϟ?̜?˛??PPPPPP??RRRRRR?А?????Ξ?Ξ?Ξ?͝?ϟ???͝?ϟ?TTTTTT?ϟ???ӓ??SSSSSS?VVVVVV?ӓ?YYYYYY??ё?ϟ?QQQQQQ??Ξ?PPPPPP??ё???PPPPPP?А??QQQQQQ?TTTTTT?ϟ??PPPPPP??͝?PPPPPP??Ғ?֖???]]]]]]??QQQQQQ?ё????А?̜?˛?ʚ?ʚ?ə?ə?ŕ?????Ĕ?Ɩ??Ǘ?ŕ??Ó??Ĕ??’?Ǘ?ŕ?Ó?Ó????Ɩ?Ɩ?Ɩ?Ó?Ɩ?ŕ?Ș?QQQQQQ????????????????????????????????’?Ó???’?Ĕ???????’????Ǘ?˛??Ғ?SSSSSS?Ξ????UUUUUU?А??????Ǘ???Ǘ??Ɩ???????Ș??Ɩ???ʚ?ə?Ș?Ș?ʚ?PPPPPP??ϟ?͝??ə??Ξ?˛??Ξ??ϟ?Ξ??ə????͝?̜??͝??PPPPPP????ϟ?͝??ʚ???Ξ???????͝??̜?ə????ϟ?͝?PPPPPP?͝?RRRRRR?ݝ?Ғ?̜??PPPPPP?????̜??Ξ?ϟ?Ԕ???̜?͝?Ξ?Ξ??Ξ??PPPPPP?PPPPPP?QQQQQQ???ϟ?͝?Ξ?Ξ?̜???͝?Ξ?ё?Ξ?̜??Օ?Ԕ?VVVVVV???Օ??QQQQQQ?QQQQQQ?PPPPPP?А?Ξ?А?QQQQQQ?QQQQQQ?QQQQQQ?QQQQQQ???ӓ??RRRRRR?ё?QQQQQQ???Ξ?ё?QQQQQQ?????Ғ?Ғ?͝????̜?Ξ??Ξ?ə?Ǘ???Ĕ?Ĕ?Ɩ??????ŕ????????Ó??Ó???’?????????????????????????Ó???????????????ə?Ĕ?Ó??????????’?Ɩ??ŕ?Ɩ??????֖?ۛ??ۛ?RRRRRR??̜?͝?PPPPPP?̜????Ǘ?ə??ə??Ș??Ș??Ș???ə????˛??SSSSSS?PPPPPP?˛??̜??˛??˛?̜??̜???̜??͝?ʚ?͝???ϟ??Ξ?Ξ??Ξ?PPPPPP?ё?QQQQQQ?Ξ?ϟ?͝?̜?˛?̜????͝???͝?̜?ʚ?̜?Ξ??Ξ?А????????????А??˛?͝???XXXXXX???ё?͝???Ξ?̜?͝??ϟ?QQQQQQ???ϟ??ё?QQQQQQ??ё????ϟ?????А?ח?Ғ??QQQQQQ?QQQQQQ?ё??А??PPPPPP??QQQQQQ?QQQQQQ?QQQQQQ??QQQQQQ??ё??WWWWWW?SSSSSS?TTTTTT?????Ξ?Ξ?YYYYYY??ӓ??֖???????˛????˛??ŕ????ŕ?Ǘ?Ș?Ǘ??Ɩ??ŕ?????Ĕ????????’??Ɩ???Ĕ??????Ĕ??????????Ĕ??Ǘ?’??Ó????????’??ŕ??’??ŕ?????Ĕ?’??Ǘ?????Ĕ????˛?????TTTTTT???ʚ?TTTTTT??Ξ??ə??˛????ʚ???ʚ??ʚ?̜?͝????Ξ?Ξ???ϟ?˛?͝?̜?̜???͝?̜?͝??????ϟ?PPPPPP?˛?PPPPPP?????ϟ????А?ϟ?PPPPPP?͝?Ξ????͝??ё??Ξ??????Ξ?Ξ???А?QQQQQQ?ϟ?QQQQQQ?А??PPPPPP?????˛?˛??˛??QQQQQQ?????Ξ?PPPPPP?͝??͝??͝?ϟ???А??̜?Ξ???ϟ?Ξ?͝???͝?ϟ??PPPPPP?͝??ӓ?А?QQQQQQ??А???ё???ё???RRRRRR???ё?RRRRRR?????PPPPPP????̜??Ԕ??ё?ё??Ғ?ӓ?̜?͝?˛??˛?͝?˛?Ș?ə?ŕ??Ĕ?????Ɩ?Ĕ??Ĕ?Ĕ?Ɩ?Ĕ???????ŕ???????VVVVVV??PPPPPP?Ș?Ó???Ĕ????????????????????????Ǘ?????Ɩ?ŕ?Ĕ??’??????Ɩ???Ó??Ɩ?ŕ?Ɩ?Ǘ?ə?˛?Ξ???WWWWWW??ə?Ș????Ξ?ʚ?ə?̜?ϟ???ʚ??ʚ???ə?˛?̜?????ϟ??͝???????̜??Ξ?̜???PPPPPP??Ξ????ё?А??Ғ?А?ϟ?Ξ??Ғ??ϟ?PPPPPP?А?Ξ?PPPPPP??ϟ?ϟ?˛??˛??̜??̜?PPPPPP?ϟ??͝?А????ӓ??PPPPPP?˛?Ξ?Ξ??RRRRRR?̜??????PPPPPP?А???Ғ??˛??????А????ϟ????PPPPPP?̜?͝???Ξ??Ξ??PPPPPP?PPPPPP?Ғ?QQQQQQ?PPPPPP??PPPPPP??Օ?ё??PPPPPP?QQQQQQ???PPPPPP???QQQQQQ?RRRRRR?SSSSSS?QQQQQQ?ё??Ξ?ё?ח??ё?֖?А?RRRRRR?SSSSSS?ё??VVVVVV?PPPPPP??Ξ??˛??А?̜?ʚ??Ǘ?Ɩ???ё?????Ĕ?ŕ?’?Ĕ???ŕ?Ó??Ǘ???Ĕ?Ó?’?Ó?Ɩ?TTTTTT?⒒?ᱱ?QQQQQQ?Ó????????????’?????Ó?????’?ŕ??’??’?ʚ?Ș?Ș??’?Ó???’??’?’?Ó?’???ŕ???ŕ?Ó???ʚ??ʚ??͝?̜?̜????Ǘ?Ș??˛??͝?PPPPPP??Ǘ??ʚ?̜?˛??͝?ə???PPPPPP???͝?ϟ????Ξ???PPPPPP?Ξ?А?QQQQQQ?А?QQQQQQ?Ξ?͝?͝?͝?ϟ?????RRRRRR????Ғ?Ғ??SSSSSS?QQQQQQ??ё????͝???????ϟ?̜?Ξ???А?ϟ?ϟ?ё??????͝?Ξ?RRRRRR?А?QQQQQQ????QQQQQQ?ϟ???Ξ?͝??ϟ?PPPPPP??ʚ?͝??PPPPPP?̜???А?????ϟ?PPPPPP?????̜?Ξ???PPPPPP?????QQQQQQ?PPPPPP?ϟ?ё?ё???Ғ?ё????QQQQQQ?ϟ???QQQQQQ??А?RRRRRR??RRRRRR???VVVVVV?RRRRRR??RRRRRR????ё???PPPPPP?̜?˛?ə???Ғ??Ǘ?Ș?Ɩ?Ɩ???Ĕ?ŕ?Ǘ??Ĕ?Ó?Ș?Ó???ə?˛?Ɩ??’?’???ə??qqqqqq???Ĕ????ŕ?????Ó??ə????Ĕ??????????’???˛??ʚ??Ĕ????Ĕ?ŕ??Ș?’?’????’??????Ș??Ș???Ǘ?PPPPPP?XXXXXX???А??????Ǘ??˛?Ξ?ʚ?Ξ????Ξ?͝?֖??Ξ??ϟ????А?ϟ???RRRRRR?XXXXXX?ٙ?UUUUUU?QQQQQQ??QQQQQQ???PPPPPP?͝?Ғ?А??ё?Ғ?Ғ?QQQQQQ?Ғ????А??͝??ٙ?Ξ??ϟ?????QQQQQQ?ϟ??͝?͝?Ξ??PPPPPP??ϟ???PPPPPP??А?Ξ?????А?PPPPPP??Ξ???PPPPPP?֖???ϟ?ё?PPPPPP?Ξ????Ξ?˛?QQQQQQ???PPPPPP??Ξ?ϟ?Ξ???QQQQQQ??PPPPPP?ϟ?ϟ?ϟ??Ғ????PPPPPP?QQQQQQ?А?ϟ????QQQQQQ?ϟ?SSSSSS?PPPPPP?Օ?QQQQQQ???Ғ?QQQQQQ?А?SSSSSS??PPPPPP?͝?ə?ϟ?ϟ???Ԕ??Ғ?Ԕ??PPPPPP??Ξ??ə???ʚ?Ǘ?Ǘ??????ŕ???Ș???ŕ?Ó???ə?Ĕ??ӓ?ٙ?Ĕ?Ĕ???Ĕ?ə?̜???ŕ????????ŕ???Ξ?̜?’?????????Ó?????’?Ș?Ɩ??Ĕ?????Ĕ?Ĕ?ŕ????Ó??ϟ?Ĕ?Ĕ?Ǘ?’??Ɩ???Ǘ??Ǘ???Ξ?Ξ?QQQQQQ?˛?Ș?Ș?Ǘ????ʚ???Ξ?̜?̜?ʚ?Ξ?͝???????PPPPPP??А??????Ԕ??SSSSSS?YYYYYY???ё?Ξ?ё???????ё?ё??SSSSSS??Ԕ?RRRRRR???ё?ё??ϟ???QQQQQQ????PPPPPP?ϟ?PPPPPP?PPPPPP??ϟ??ё??PPPPPP?͝?ϟ???А?PPPPPP???Ξ??PPPPPP?А????PPPPPP?А?????А??PPPPPP?????̜?͝?PPPPPP??PPPPPP?͝?Ξ??͝???QQQQQQ?Ξ??ϟ???Ғ?Ғ?ё??А?Ξ?QQQQQQ??????????QQQQQQ?Ғ?ё????RRRRRR??PPPPPP???͝?ϟ?А?ϟ??RRRRRR??RRRRRR?Ғ??PPPPPP?ϟ???̜??ʚ?ʚ???Ɩ?ə?Ǘ???Ó?Ɩ????Ĕ??????ŕ?Ĕ???ŕ?Ĕ????Ĕ??Ǘ?Ɩ???????Ó?????Ĕ??Ɩ???Ó???????????Ó??ŕ?֖??Ĕ?Ó????Ĕ???ə???????Ș????????SSSSSS??WWWWWW???ϟ?ə??ʚ????ʚ?ʚ???͝??͝???ϟ??Ξ??͝??А?А???А?TTTTTT??QQQQQQ??ؘ??֖??QQQQQQ??А?А?ϟ?RRRRRR?RRRRRR?Ғ?Ғ???PPPPPP?????RRRRRR????Ғ?ӓ??QQQQQQ?RRRRRR?QQQQQQ?QQQQQQ?А??А???А??PPPPPP?RRRRRR????А?PPPPPP?ϟ???ӓ?Օ???А??PPPPPP???ϟ?ϟ??ё???А?QQQQQQ??QQQQQQ?PPPPPP???????͝???RRRRRR?PPPPPP?ё??QQQQQQ???PPPPPP?PPPPPP????Ғ???ϟ????QQQQQQ????А??QQQQQQ?QQQQQQ???Ғ?ё?QQQQQQ??SSSSSS?RRRRRR??А?????QQQQQQ?PPPPPP?ӓ?Ԕ?А?SSSSSS?TTTTTT??ё?ϟ??ϟ?̜??Ș??Ș??̜?Ș?Ɩ??Ɩ??Ɩ???Ó?Ĕ??Ĕ??’??ŕ???Ξ?ŕ?YYYYYY?Ξ???’???Ĕ????????????????????????????’???????Ĕ???Ó?’?ə?Ĕ????’???ə??Ǘ??ə?ə??˛???͝?????Ξ???̜?PPPPPP?А??̜?ə???SSSSSS?Ξ??Ғ?̜??̜?PPPPPP??А??QQQQQQ?ϟ??RRRRRR?RRRRRR?ӓ?TTTTTT?qqqqqq?pppppp?ӓ??ϟ?ϟ?Ғ??QQQQQQ?ё??ӓ?ё?RRRRRR????RRRRRR?QQQQQQ??А?RRRRRR?ё?ё??Ғ?????????ϟ??PPPPPP?????????ё??ϟ??Ғ???Ғ?????PPPPPP?PPPPPP????ё?Ғ????ё??͝?ϟ?ϟ???QQQQQQ?А???Ξ??PPPPPP?PPPPPP?QQQQQQ?XXXXXX???????Ғ?ё???SSSSSS??QQQQQQ?ё?????SSSSSS??TTTTTT???QQQQQQ?ё?Ғ??RRRRRR?ё???QQQQQQ??Ξ?PPPPPP?PPPPPP?????RRRRRR?ё???ϟ??????А?Ș?Ș??ə?Ǘ??Ó?Ĕ???’?’??’?Ó????Ó??ə??ʚ???’??’???Ó???PPPPPP??????’?????????????????’???ŕ????????ə??Ĕ?Ɩ?Ó?’?Ĕ?Ĕ???Ș?Ɩ???˛??ə?ʚ?????RRRRRR??Ғ????PPPPPP??˛??͝????????Ғ??А?QQQQQQ??ϟ??????Ғ???ښ??QQQQQQ?Ғ?ё?QQQQQQ?QQQQQQ?RRRRRR????RRRRRR?Ғ??ё???ё??ё??SSSSSS??ӓ??????Ԕ?QQQQQQ???RRRRRR?????RRRRRR??????ӓ?SSSSSS????ё??Ғ?Ғ???????RRRRRR??Ғ??ё?RRRRRR?ё????А?А??QQQQQQ?QQQQQQ??????А?А???ё??Ԕ??QQQQQQ??ӓ?ϟ?????Ғ?RRRRRR??ё??А?Ғ?ӓ?SSSSSS??RRRRRR????Ғ???RRRRRR?Ғ?RRRRRR?ӓ??Ș??????RRRRRR???PPPPPP??????Ș??˛????Ǘ??Ǘ?ϟ?Ó?Ĕ????Ó?Ĕ?Ó??Ĕ??Ó???SSSSSS?Ó??Ɩ?’?ŕ????’???Ĕ?Ĕ????????Ǘ?’?Ó?????????????Ɩ??????Ó??????Ó??Ó????ŕ??Ó??ʚ??Ғ???Ș?ʚ?Ɩ?Ξ???RRRRRR?RRRRRR???̜?˛?͝?̜???ə??˛?͝?ϟ?Ξ??SSSSSS??????PPPPPP???ё?RRRRRR??SSSSSS??А?PPPPPP?QQQQQQ??QQQQQQ?????ё?Ԕ?Ғ??ё???Ғ??А???ח????ӓ???UUUUUU??RRRRRR?SSSSSS??SSSSSS??SSSSSS???RRRRRR?ё?ӓ????RRRRRR???RRRRRR?SSSSSS?ё?Ғ?RRRRRR?SSSSSS???Ғ???ӓ???ё?ӓ???Ғ?Օ??RRRRRR?SSSSSS?ϟ?Ξ?????ϟ?Ғ?ё?ϟ??PPPPPP??ё?Ғ?RRRRRR????PPPPPP?QQQQQQ??А??PPPPPP?Ԕ?ӓ?ӓ?QQQQQQ?ё??RRRRRR?Ԕ???ё????ё??Ғ?RRRRRR??RRRRRR?RRRRRR?ϟ??̜?ϟ??ё?PPPPPP?ϟ?QQQQQQ???TTTTTT??А??ʚ?˛?ʚ?̜?˛?ə??Ɩ??Ĕ??’??Ǘ?Ĕ????Ĕ?Ǘ????Ǘ??Ĕ??Ǘ??Ǘ?Ĕ?’??Ó?Ó????????’??????????Ǘ??’?????????Ĕ??Ó???Ξ????????ŕ?Ĕ?Ș?ŕ?Ó?Ĕ???ʚ??Ǘ?ʚ?Ǘ?ʚ??????Ξ?̜??????˛??̜?̜??PPPPPP?PPPPPP????Օ?֖??????????VVVVVV??????QQQQQQ???ӓ????ё???RRRRRR?SSSSSS?TTTTTT???TTTTTT?Օ?֖?[[[[[[?ܜ??ؘ??]]]]]]??Օ?VVVVVV?UUUUUU?????Ғ?Ғ?RRRRRR????Ғ??ӓ?ё?Ғ?ё?Ғ?TTTTTT??ӓ?ӓ???TTTTTT?????RRRRRR?Ғ????TTTTTT?????SSSSSS??RRRRRR??QQQQQQ??RRRRRR?SSSSSS??QQQQQQ???PPPPPP?ϟ??QQQQQQ??Ғ?А?SSSSSS?Ғ?ё??WWWWWW???RRRRRR??RRRRRR?Ғ?SSSSSS?ӓ?ח?????ё??ё?ё?RRRRRR??QQQQQQ??QQQQQQ?PPPPPP??ʚ??PPPPPP???QQQQQQ?QQQQQQ???ё??PPPPPP?ё??͝?˛???̜?А????Ɩ?Ĕ?ŕ??Ó????Ɩ???’??Ɩ???Ĕ??Ó??????????????????????Ĕ?????Ó????’????????Ĕ???Ĕ????ŕ?Ș??Ĕ??ə???Ș?ə?ϟ?Ξ?ϟ?˛??А?RRRRRR?˛??͝???ʚ?Ξ?PPPPPP??˛??ϟ??͝?̜????ϟ???UUUUUU?ښ??ښ??ח????ӓ????????Ғ?ӓ?Օ???Օ?QQQQQQ?Ғ?RRRRRR??????ӓ??֖?֖??vvvvvv?????qqqqqq??ח????Ԕ??TTTTTT???SSSSSS?Ғ?Ғ?ӓ???ӓ?RRRRRR?Ғ?RRRRRR?RRRRRR??Ғ??TTTTTT?Ԕ?TTTTTT???ӓ??TTTTTT????TTTTTT??????RRRRRR??QQQQQQ??ё?QQQQQQ??RRRRRR??RRRRRR?RRRRRR?А?А?PPPPPP????????PPPPPP?ё?ё?Ғ?Ғ?QQQQQQ??ё???SSSSSS??SSSSSS?RRRRRR??Ғ?ё??ӓ?ё?ё??ё??ё??А?PPPPPP?????ӓ?Ғ?ё???????˛?Ξ????ʚ??Ɩ????ŕ?Ɩ??Ɩ??Ĕ????Ó?Ĕ?ŕ?ŕ???ŕ?’?????????’????Ó???????????????Ĕ?Ó?Ĕ???????’???ŕ???Ó?Ɩ?Ó?А??Ɩ?ŕ?ʚ?ə??̜?̜?ə?͝????Ξ??RRRRRR????ʚ????ϟ?Ξ????QQQQQQ?ϟ?ё?ϟ?ё???ё?А???啕???TTTTTT?ח?UUUUUU?Օ????RRRRRR??VVVVVV?SSSSSS?ӓ???SSSSSS?Ғ?TTTTTT?Ғ??RRRRRR?QQQQQQ??TTTTTT?UUUUUU?֖?VVVVVV?TTTTTT??Օ?UUUUUU?????YYYYYY?啕????Օ?Օ?UUUUUU?TTTTTT?Օ?TTTTTT?SSSSSS???SSSSSS?SSSSSS?UUUUUU???SSSSSS?Ғ??Ғ?Ғ?ӓ?RRRRRR?????VVVVVV????Ԕ?ӓ?SSSSSS?ӓ??RRRRRR??QQQQQQ???Ԕ?UUUUUU???ӓ???Օ???RRRRRR??QQQQQQ?PPPPPP???PPPPPP?ё??ё???RRRRRR????ӓ?QQQQQQ?ё?????RRRRRR??Ғ?Ғ??QQQQQQ?Ԕ?RRRRRR???\\\\\\???ӓ????͝?ё??ϟ?RRRRRR?ё?А?QQQQQQ?QQQQQQ??Ξ???ʚ??ʚ????Ǘ?Ɩ?Ș?Ó?Ɩ???Ó????’??Ĕ?PPPPPP?’?Ó????’?Ĕ?ŕ??????ŕ?????????????Ó????????????Ó??Ó??????Ĕ?Ĕ?Ɩ??Ș??Ș?ə?ə?Ɩ?ə?ə?PPPPPP?ϟ???ʚ??ʚ?????̜?͝?ϟ?ϟ????PPPPPP??͝?А?ϟ?Ξ?PPPPPP?Ξ??RRRRRR?Օ????ssssss?緷?嵵?????WWWWWW?______??TTTTTT?Օ?????SSSSSS?TTTTTT??Ԕ??ٙ?UUUUUU???WWWWWW??WWWWWW??Օ?ח???WWWWWW?ٙ?ܜ??333333?涶?666666?222222???ח???Ԕ??Ԕ?Ԕ?ӓ???TTTTTT????TTTTTT??TTTTTT???Ғ??TTTTTT?UUUUUU?UUUUUU?Օ?RRRRRR?ؘ?????TTTTTT?TTTTTT?Ғ?RRRRRR?Ғ?ӓ?ӓ??ӓ?TTTTTT?TTTTTT??ӓ???Օ?UUUUUU????Ғ????RRRRRR?ё?ё???QQQQQQ??А??PPPPPP???QQQQQQ?ё???А??Ғ?ё??RRRRRR????SSSSSS?ё????Ғ?SSSSSS?PPPPPP????QQQQQQ?QQQQQQ?TTTTTT?RRRRRR?RRRRRR?Օ?А??͝?̜?̜??ə?˛?͝?˛?TTTTTT?̜????????Ɩ?Ĕ????Ó?’???Ɩ?Ó?Ɩ???ŕ??Ó????’?Ó???Ó?????Ó???????Ó?????Ĕ???’?Ó?Ǘ?????Ɩ?Ó????Ɩ?Ĕ????Ǘ??Ɩ???͝??????ϟ???Ԕ?͝??˛????????QQQQQQ??Ԕ????PPPPPP???Ԕ?ٙ?rrrrrr?꺺?踸????ٙ???ܜ?ח??[[[[[[?֖?ؘ???TTTTTT?????ё??XXXXXX?XXXXXX??^^^^^^????Օ??ؘ??ٙ?ٙ????rrrrrr??pppppp?ܜ?????ח?֖???Ԕ?TTTTTT?ח??UUUUUU?Ԕ?????Օ?TTTTTT?????UUUUUU?Ԕ?WWWWWW?Ғ?ё??UUUUUU??TTTTTT?Ғ???SSSSSS???TTTTTT?ӓ?TTTTTT???WWWWWW?VVVVVV??А????????А???ё??ӓ??Ғ?А??QQQQQQ??Ғ??RRRRRR?Ԕ?RRRRRR?RRRRRR????А????RRRRRR????Ғ?QQQQQQ?PPPPPP??Ԕ???RRRRRR?QQQQQQ??Ғ???PPPPPP?̜?Ξ???̜?ʚ?????Ĕ??Ș?Ĕ?ŕ??Ó?ŕ?’???’?????Ó?Ĕ???’?’?Ó?Ó??Ó???Ó????????????????’???ŕ???’?????Ĕ?Ɩ???Ĕ?ŕ???Ɩ?Ɩ??Ĕ?Ș?ϟ?Ǘ?Ș??Ԕ??ə??ə?˛?ʚ???ʚ????ə?ʚ????YYYYYY??QQQQQQ???PPPPPP?͝??ϟ?ϟ?ё??ӓ???䔔???ZZZZZZ??VVVVVV?䴴?<<<<<>>>>>??~~~~~~?>>>>>>???]]]]]]??||||||?뻻?;;;;;;?zzzzzz?陙??xxxxxx???斖???tttttt?444444?333333?⒒?rrrrrr?⒒??ᑑ?????ర??PPPPPP????ߟ?^^^^^^?]]]]]]???______?______?ݝ?㳳???]]]]]]??????ښ?ZZZZZZ?XXXXXX?ٙ????????TTTTTT?TTTTTT????ӓ?Ғ?А??Ғ????ӓ???Օ?UUUUUU??Ԕ?SSSSSS?TTTTTT??Ғ??А?PPPPPP??ӓ?ӓ?VVVVVV?QQQQQQ?PPPPPP?PPPPPP??А????111111??QQQQQQ??Ɩ????Ǘ?Ɩ??Ș??Ó????????ŕ??Ɩ?Ș??Ș?ё??UUUUUU??̜????PPPPPP??ə??Ǘ?Ɩ?ŕ??Ǘ??Ɩ??ŕ??ə?ə???̜?͝?PPPPPP??Ξ?Ғ?PPPPPP??ӓ?VVVVVV???VVVVVV???^^^^^^?WWWWWW?VVVVVV?WWWWWW??XXXXXX?ښ??֖???UUUUUU???WWWWWW??ח??????֖?֖??VVVVVV??ؘ????ܜ??ߟ?000000?YYYYYY???ܜ?[[[[[[??\\\\\\?ܜ?\\\\\\??ܜ?ݝ???ޞ?ޞ?ޞ?pppppp???pppppp?qqqqqq?ర?ర???ᑑ?RRRRRR?222222?⒒??333333?TTTTTT??uuuuuu???wwwwww?888888??yyyyyy?::::::??{{{{{{?\\\\\\??]]]]]]??~~~~~~??????????>>>>>>????||||||??[[[[[[?zzzzzz?陙??蘘??WWWWWW?斖?啕??tttttt???⒒?rrrrrr?rrrrrr?ᱱ?ᱱ??ర?ᑑ?QQQQQQ???ߟ??ݝ???ݝ???ߟ?????PPPPPP???ܜ?ZZZZZZ??^^^^^^?ݝ??ؘ?ZZZZZZ??ݝ????ח??TTTTTT?Ғ??WWWWWW?SSSSSS???RRRRRR???????Ғ???ӓ??SSSSSS?SSSSSS??TTTTTT?Ғ?UUUUUU?RRRRRR?ϟ?Ξ?͝?ё???SSSSSS?RRRRRR????А???XXXXXX?RRRRRR???Ɩ???Ș?PPPPPP?????Ĕ??ə??ŕ?’?Ĕ????ə???ə?͝?А?̜?̜???Ș???͝?˛?ə??Ǘ?̜????Ɩ???????˛??˛??Ξ?QQQQQQ????TTTTTT?ޞ?⒒?tttttt?YYYYYY?\\\\\\?^^^^^^??VVVVVV??[[[[[[??֖?XXXXXX??VVVVVV?VVVVVV??֖??Օ??ח????UUUUUU?ZZZZZZ???Օ?ؘ??ؘ??????]]]]]]?^^^^^^??Ԕ???ܜ??ښ?????000000???ݝ?^^^^^^???????ᑑ??ర?PPPPPP?111111????⒒??㳳?䴴??uuuuuu???痗???陙?::::::??뛛?<<<<<>>>>>??흝??\\\\\\??;;;;;;?zzzzzz?鹹??蘘??WWWWWW?vvvvvv?啕?555555?tttttt?㓓??Ⲳ?222222?ᱱ???000000??ర??ర?______?ޞ????^^^^^^?ܜ?ర?ޞ??ޞ?QQQQQQ?pppppp?Ⲳ??]]]]]]?ݝ???\\\\\\?______?ܜ???ښ????ؘ??VVVVVV??SSSSSS?Ғ??TTTTTT?QQQQQQ??SSSSSS?ӓ??SSSSSS??ӓ?TTTTTT??ӓ???Օ??Ԕ?VVVVVV?Ғ????Ғ?ё?ё??PPPPPP?ё???VVVVVV????????PPPPPP?͝?ə?????Ɩ?Ǘ????Ɩ?ŕ?’?????ŕ?’?ŕ?ʚ?˛?˛??Ξ?̜??Ξ?ə??QQQQQQ?????Ĕ?͝?Ғ?????Ó?ŕ?ŕ?Ɩ????͝???WWWWWW?TTTTTT?QQQQQQ????WWWWWW?777777???????WWWWWW?VVVVVV?????XXXXXX?WWWWWW??VVVVVV?????ח??ؘ???֖????ښ???YYYYYY?YYYYYY??ۛ??[[[[[[?ܜ??ٙ??ZZZZZZ??ۛ?[[[[[[????ݝ???[[[[[[????PPPPPP??ర??ޞ?PPPPPP??QQQQQQ??QQQQQQ??ᑑ?222222?333333?SSSSSS??䔔??uuuuuu??緷?痗?888888??鹹?ZZZZZZ??뛛?<<<<<>>>>>????>>>>>>??}}}}}}?켼?<<<<<>>>>>?^^^^^^?^^^^^^??}}}}}}?======?||||||??[[[[[[???yyyyyy?蘘??WWWWWW????䴴?444444?SSSSSS?RRRRRR?222222?rrrrrr??qqqqqq???000000?PPPPPP??pppppp??^^^^^^??]]]]]]??______?ޞ???qqqqqq?ߟ?ర?ᑑ?RRRRRR???ssssss?^^^^^^?ۛ?[[[[[[???ܜ?ښ?XXXXXX?XXXXXX??ח?֖???ӓ?TTTTTT????ё????[[[[[[?????ח?????YYYYYY?ۛ?SSSSSS?RRRRRR?RRRRRR?ӓ?ӓ??ё?PPPPPP?ё?SSSSSS?RRRRRR?Ғ?QQQQQQ????RRRRRR???ё?SSSSSS?PPPPPP??ʚ?Ș???Ǘ?Ĕ?ŕ??Ɩ?ŕ???????’?’??ə????YYYYYY??VVVVVV???̜?˛?ə?ʚ?Ș??Ș??ʚ??А?ŕ?????ʚ??Ԕ?SSSSSS??ё?А???ؘ??PPPPPP??UUUUUU?VVVVVV??YYYYYY????ۛ?XXXXXX?UUUUUU?TTTTTT?Օ?WWWWWW?WWWWWW???????ᑑ?YYYYYY?Օ???Ғ?UUUUUU?VVVVVV??YYYYYY?ח?YYYYYY????[[[[[[?WWWWWW????[[[[[[??ۛ?ښ??ۛ???ۛ??ۛ?\\\\\\?ݝ?????㓓?ర??______???000000?111111?111111????ᑑ?222222?rrrrrr?⒒?SSSSSS??tttttt?UUUUUU?嵵?VVVVVV???888888?蘘?陙?::::::??[[[[[[??윜??]]]]]]?????}}}}}}?======?켼??뻻?;;;;;;?ZZZZZZ?鹹?999999?xxxxxx??777777?vvvvvv???䔔?444444?SSSSSS?rrrrrr?222222?222222??qqqqqq??ర??ర??PPPPPP?______?]]]]]]?ޞ?______?????ᑑ?000000?ݝ?ߟ?QQQQQQ?qqqqqq????000000?ܜ???ښ?ZZZZZZ?YYYYYY????Օ?UUUUUU????ӓ??Ԕ?TTTTTT??????TTTTTT?RRRRRR?ӓ?UUUUUU?ޞ??TTTTTT?UUUUUU??VVVVVV?VVVVVV??SSSSSS??TTTTTT??ӓ?ё?ё??QQQQQQ?ё??ё???WWWWWW?Ғ?ؘ???YYYYYY?͝??Ǘ?Ș?̜?Ǘ???Ĕ?ŕ???????’?Ó?’?Ș??˛??䴴????͝?Ș?ə??͝???Ǘ?ə???˛?ŕ?ə???Ĕ???˛?Ғ?PPPPPP??????TTTTTT?А??Ғ?Օ??VVVVVV?ח????嵵?ZZZZZZ?ᱱ?ؘ??ؘ?WWWWWW??ZZZZZZ?XXXXXX?TTTTTT??WWWWWW??ܜ???֖??UUUUUU?Ԕ?UUUUUU??XXXXXX?Օ??ZZZZZZ?ٙ??ח?ؘ???ۛ???ݝ?ښ?ZZZZZZ???\\\\\\???ZZZZZZ?ۛ?[[[[[[?ܜ???ߟ?000000???PPPPPP?pppppp?ᑑ?111111??111111?111111??ᑑ??????㳳?TTTTTT??UUUUUU?VVVVVV??緷??蘘?yyyyyy??꺺?;;;;;;??<<<<<>>>>>??Ꚛ???ర?ZZZZZZ?YYYYYY?XXXXXX???А??А????̜???RRRRRR??UUUUUU???????ٙ?ٙ?[[[[[[?ؘ??????ޞ??ݝ?ۛ?ܜ??Ⲳ???qqqqqq?qqqqqq???tttttt?TTTTTT??RRRRRR?RRRRRR?PPPPPP?000000?111111??000000?ܜ???ٙ?XXXXXX?WWWWWW??ښ???ܜ???ٙ??]]]]]]?ݝ???^^^^^^?\\\\\\??______?000000??ర??]]]]]]?ݝ??pppppp?ޞ??ܜ?YYYYYY??????qqqqqq??______????PPPPPP?pppppp?ᑑ?______?????ܜ?ؘ??qqqqqq?ర???ZZZZZZ???VVVVVV?ח??Ԕ??UUUUUU??Ԕ??TTTTTT?SSSSSS?ӓ??UUUUUU?Ԕ?ӓ??PPPPPP??PPPPPP?ϟ?PPPPPP??А?RRRRRR?????VVVVVV??YYYYYY???Ԕ??ё?̜????ё??А???ё?͝????˛?????ʚ?Ș?˛??ϟ?ʚ?ə?ə?Ғ?̜?Ș?Ɩ?Ĕ???˛?Ξ???Ǘ?͝???Ó??Ó????Ó?ŕ???ŕ?Ɩ?Ĕ???ʚ???˛??͝?ӓ?ӓ?QQQQQQ???А??͝???̜?Ș??Ș???????А?RRRRRR????ܜ?888888?鹹?;;;;;;?????陙?斖???WWWWWW?VVVVVV?Օ??QQQQQQ?ϟ????QQQQQQ??RRRRRR?Ғ??Ғ?TTTTTT?VVVVVV????]]]]]]?ܜ?ZZZZZZ?XXXXXX??pppppp?qqqqqq?????ܜ?ښ????^^^^^^?000000?qqqqqq??222222???RRRRRR?qqqqqq?TTTTTT????ߟ?[[[[[[?ݝ?000000?????ZZZZZZ?XXXXXX?ח??ܜ?]]]]]]??]]]]]]?ܜ?ݝ??ښ?ۛ???ޞ???______?^^^^^^?ޞ????ޞ?PPPPPP?]]]]]]?ޞ?ݝ???ᱱ??ܜ?ߟ?111111?ర?QQQQQQ?????ݝ???pppppp?qqqqqq????ݝ??ۛ?ZZZZZZ?ښ??tttttt?ܜ?[[[[[[??ښ?VVVVVV?????Օ?Օ??TTTTTT???TTTTTT??ӓ?UUUUUU??ӓ?SSSSSS?ё?˛????????Ғ?TTTTTT?֖?ח?[[[[[[?XXXXXX??????ə?̜??̜?ʚ????ϟ?ϟ????֖?͝??Ș??Ș?Ɩ??Ș????ӓ?ə?Ɩ????Ĕ?Ș????͝?Ǘ??˛???Ó????’?’??Ș?ŕ?ŕ?ŕ??ŕ??˛??Ξ???ʚ?PPPPPP?PPPPPP???͝??ϟ??̜?˛?А?ŕ??Ĕ????ə?????PPPPPP?QQQQQQ?SSSSSS??TTTTTT?444444??888888?::::::??~~~~~~???tttttt?111111?????ё??А?Ғ??RRRRRR?Ԕ?SSSSSS??ӓ?TTTTTT?Ԕ?UUUUUU?Օ??[[[[[[?ٙ?______??ٙ?֖?֖???pppppp?ߟ?ޞ?^^^^^^?ۛ??ۛ?[[[[[[??]]]]]]?ߟ??222222???PPPPPP?ర???ᑑ?111111?????ٙ?[[[[[[?????ܜ??^^^^^^????ߟ??ޞ???______???000000?PPPPPP?000000?ర??______??ర???ర??????pppppp?????000000?????ؘ?ٙ?ݝ?______??㳳??555555?333333?ߟ?ZZZZZZ???[[[[[[??qqqqqq?ZZZZZZ?]]]]]]???VVVVVV?ח?VVVVVV???TTTTTT?Օ?VVVVVV??UUUUUU??Օ???Ԕ?TTTTTT??SSSSSS?UUUUUU??ё??А??ё?RRRRRR?RRRRRR??Ԕ?WWWWWW??[[[[[[???????Ǘ?ə?ʚ??˛?ə??ё?ё?Ғ??ϟ??͝??Ǘ?Ǘ??Ș????Ǘ??ʚ?˛?Ș??ʚ?Ɩ?Ó???Ξ???ʚ?ə?Ξ????Ó????’??????ŕ??Ĕ?Ș?˛?̜??Ξ???QQQQQQ????Ș?Ɩ?Ɩ??Ǘ????Ĕ??ŕ???ə??˛?͝???QQQQQQ???YYYYYY???斖?陙?鹹?Ꚛ??VVVVVV??ښ?ؘ?ח????RRRRRR???SSSSSS???Ғ??TTTTTT?ӓ??ښ???]]]]]]?\\\\\\?ښ?ۛ?[[[[[[???ݝ?????000000??[[[[[[??ݝ???222222?ᑑ??⒒?RRRRRR???PPPPPP??ర?ޞ?^^^^^^?]]]]]]??ۛ?ۛ?YYYYYY?[[[[[[??????ޞ?ర?ర?111111?qqqqqq????ߟ?000000?ర?PPPPPP??pppppp??111111?QQQQQQ?ర?ర?ߟ?ߟ??ర?ᱱ?000000?pppppp??ssssss?ߟ?______?ZZZZZZ?ర?222222??ߟ??PPPPPP???ښ?ؘ?]]]]]]?PPPPPP?Ⲳ?嵵?YYYYYY?rrrrrr???ۛ???^^^^^^?ۛ??????UUUUUU??ۛ??Ԕ??ח???Ԕ?Ԕ??Օ??TTTTTT?WWWWWW??ٙ??͝???PPPPPP?QQQQQQ??ё??TTTTTT???XXXXXX?YYYYYY??ٙ???????ϟ?͝?ə?ə???А????˛?˛?Ș?Ǘ?Ĕ?Ǘ????Ɩ??Ɩ?Ĕ?Ĕ??????????˛??Ɩ??ϟ??Ó?????’??Ó??Ɩ?Ǘ????????????ə?ə?Ǘ?Ș?ŕ??Ĕ??Ǘ??Ǘ?Ș?ŕ?Ș?͝??ʚ?ʚ?̜?QQQQQQ?А?TTTTTT??ӓ??Օ?QQQQQQ?嵵??嵵?vvvvvv?䴴??ߟ??ZZZZZZ?֖?ё?RRRRRR?QQQQQQ??QQQQQQ?ӓ??????ח??XXXXXX?ښ?000000??ߟ?ܜ?]]]]]]??ޞ?ݝ?]]]]]]?^^^^^^?ޞ?pppppp?ᱱ??^^^^^^?ۛ?______???PPPPPP?ᱱ?QQQQQQ?QQQQQQ?rrrrrr?222222??ᑑ???ర??ޞ?000000?]]]]]]?ܜ?ܜ?ܜ???000000?______?ޞ??PPPPPP?ర????______?ݝ?^^^^^^??ߟ???PPPPPP?000000??QQQQQQ?QQQQQQ?qqqqqq??111111?PPPPPP??ޞ?ర?QQQQQQ?ᑑ??111111?222222?ᑑ?ర?PPPPPP??ర?QQQQQQ??pppppp?rrrrrr??ޞ???ח?000000?Ⲳ??uuuuuu?qqqqqq?ݝ???ZZZZZZ??ZZZZZZ?ښ????YYYYYY?ښ??֖??ח???VVVVVV???????ӓ?ӓ??SSSSSS?ӓ?PPPPPP?ʚ?˛???QQQQQQ??SSSSSS?TTTTTT??ٙ?ݝ???VVVVVV?UUUUUU?ܜ??]]]]]]?͝?ʚ?˛?͝?˛?˛???Ξ??Ξ?????ʚ?Ǘ????ŕ?Ɩ??Ó?ŕ?Ǘ??ϟ?????ё?Ξ?ӓ??̜?Ɩ??PPPPPP????????????Ǘ?Ɩ??Ǘ?ə?Ξ??˛?ʚ???PPPPPP?PPPPPP?ə??Ǘ??Ɩ?Ĕ??Ș????Ș???Ǘ??Ǘ??Ξ?Ξ?֖??SSSSSS?RRRRRR???pppppp???pppppp?PPPPPP??______?pppppp???XXXXXX?UUUUUU??RRRRRR?ϟ????Ԕ??ؘ???ښ?֖???ర??[[[[[[??]]]]]]????ܜ??ߟ?ݝ?ޞ?ޞ?ښ?ؘ?YYYYYY?YYYYYY?ٙ?^^^^^^???ᑑ?qqqqqq?????PPPPPP?^^^^^^?QQQQQQ?RRRRRR???PPPPPP????111111?pppppp??ర?000000??111111??ߟ?ޞ?ޞ?^^^^^^?______?______??ߟ??PPPPPP?PPPPPP??000000?111111??QQQQQQ?QQQQQQ?ᑑ?ᑑ?rrrrrr????ᱱ???000000????qqqqqq????RRRRRR?333333?ݝ??TTTTTT????QQQQQQ??^^^^^^???[[[[[[?ۛ?ۛ???ؘ??ښ??XXXXXX?WWWWWW?Օ??RRRRRR?Օ?ח?YYYYYY???Ԕ?Ԕ???UUUUUU????͝???????????ٙ?ؘ???Օ?ؘ???SSSSSS?ʚ?˛?͝??ə?͝?̜??͝?Ξ??̜?????Ș??Ĕ?˛????Ĕ?Ǘ??Ξ?ZZZZZZ?ZZZZZZ?̜????Ғ?̜?Ɩ??ŕ?????Ó???’??Ĕ?Ĕ?ŕ???Ĕ??ŕ??ə??ʚ??ʚ?̜???ə?Ș???Ș??TTTTTT?ə??Ɩ??ə???Ș??ə??ӓ?^^^^^^??А?????VVVVVV??ؘ??Օ??YYYYYY??ݝ?YYYYYY???А?Ξ?PPPPPP?QQQQQQ??VVVVVV?UUUUUU?\\\\\\?WWWWWW?WWWWWW?֖???ZZZZZZ?ښ?ښ?ܜ?]]]]]]??]]]]]]?ۛ????????\\\\\\?ۛ?????PPPPPP?PPPPPP????pppppp?000000?______?ݝ?ٙ?ᑑ???ٙ?ٙ??ߟ???000000?PPPPPP??111111?111111??ߟ?ߟ???ߟ?PPPPPP???]]]]]]??______?ޞ?ݝ?000000?pppppp???ᑑ??㓓????qqqqqq?QQQQQQ??]]]]]]???????PPPPPP???????ח????ర?ర?ݝ??ZZZZZZ?ݝ?ܜ??[[[[[[??]]]]]]??ZZZZZZ?ח?֖??PPPPPP??WWWWWW????WWWWWW????ZZZZZZ?VVVVVV????PPPPPP??ʚ?PPPPPP?ӓ??ӓ?ё???UUUUUU??\\\\\\?[[[[[[???YYYYYY?ܜ?Ғ??ʚ??̜??Ɩ???̜?YYYYYY?ϟ?PPPPPP??ϟ??˛?ʚ?̜??Ɩ?Ǘ?Ɩ??ŕ?Ɩ?Ǘ?˛????ϟ???涶?????Ǘ?̜?Ξ?’??’???Ĕ??Ĕ???ŕ?Ɩ???Ĕ??ə???ʚ?˛??PPPPPP??Ș??Ɩ??????Ɩ?Ĕ???Ɩ?˛??Ǘ????ϟ?͝??QQQQQQ??QQQQQQ???TTTTTT?TTTTTT?SSSSSS?TTTTTT??RRRRRR?VVVVVV?ӓ??UUUUUU??ϟ???ӓ?ӓ?Ԕ?YYYYYY?ښ?ח????????ܜ?______???\\\\\\?^^^^^^?ٙ???????ۛ???PPPPPP?ᑑ??????PPPPPP?PPPPPP?]]]]]]?ښ?ܜ?^^^^^^?^^^^^^??ښ??ޞ?000000?PPPPPP??pppppp?ᑑ?ర??111111??______??000000?PPPPPP?______??ߟ?^^^^^^?^^^^^^??______?pppppp??ᑑ?QQQQQQ?111111??ᑑ??RRRRRR?ᱱ?qqqqqq??ᑑ?ᱱ?QQQQQQ?000000?ߟ??ܜ?ٙ????______??????\\\\\\?333333?????ۛ?ח?YYYYYY?\\\\\\?ZZZZZZ?ؘ?????[[[[[[?֖???QQQQQQ?WWWWWW??ٙ??YYYYYY??֖?UUUUUU??ښ?VVVVVV?UUUUUU???????RRRRRR?SSSSSS????????ח??UUUUUU???͝?????ϟ?ʚ???Ș?PPPPPP???ϟ?˛??ʚ?Ǘ???Ɩ?ŕ?ŕ??ə?Ș??ӓ??QQQQQQ?ZZZZZZ??Ξ???SSSSSS???Ɩ??????????Ĕ??Ĕ??Ǘ????Ș?Ɩ???ʚ?˛?ə???˛?Ǘ?Ș???Ǘ?Ĕ?Ĕ?ŕ??ə?Ǘ??????͝?Ғ??˛?̜??PPPPPP??А?QQQQQQ???ӓ???VVVVVV????TTTTTT?\\\\\\?SSSSSS?Ғ??֖?TTTTTT?֖?XXXXXX?ښ?ٙ????YYYYYY?ٙ?[[[[[[??????ۛ???ZZZZZZ??XXXXXX?ښ??000000?\\\\\\??ߟ??______??111111?pppppp???ޞ?ߟ?______????ܜ?ޞ?]]]]]]?ۛ??000000???pppppp?ߟ?______?______???______?ߟ??ߟ????______?000000??pppppp?PPPPPP??ᱱ?Ⲳ?222222?ᱱ?111111?????⒒???RRRRRR???QQQQQQ?000000?ܜ?ۛ??ݝ????______??ۛ???333333?QQQQQQ?pppppp??ߟ?]]]]]]????????ݝ???WWWWWW?????????VVVVVV?????????QQQQQQ?ё?RRRRRR?ؘ????PPPPPP???֖??ښ?ؘ?ؘ?ח??PPPPPP?VVVVVV???????????̜?͝??????ŕ??Ɩ??˛?ʚ????Ξ???ߟ?Ș??QQQQQQ??SSSSSS??QQQQQQ??˛?̜?ʚ????Ó??’?Ó?Ĕ??’????̜?ə?˛?Ș?Ǘ?͝??͝?Ξ?????ŕ?Ɩ???ŕ?Ĕ?????ŕ????????А?ϟ?̜?А??А?QQQQQQ?????֖??WWWWWW?UUUUUU?ח?֖??ZZZZZZ??Օ???XXXXXX?ۛ?????ZZZZZZ?]]]]]]?]]]]]]?000000??ݝ?\\\\\\????ח??TTTTTT???ٙ??\\\\\\?ޞ?ర?ݝ?]]]]]]?______?ర???ݝ?????^^^^^^?????______??000000??ర?______???????rrrrrr?????^^^^^^?000000?111111?111111?ᑑ??ᱱ?222222?⒒??Ⲳ??RRRRRR?222222?rrrrrr???RRRRRR???Ⲳ?rrrrrr?QQQQQQ?PPPPPP?ޞ??]]]]]]?^^^^^^?]]]]]]?ర?pppppp??______??ښ?[[[[[[?ర?666666???PPPPPP??ᱱ?ZZZZZZ??ۛ?ZZZZZZ?ښ????ZZZZZZ???WWWWWW?Օ?UUUUUU?XXXXXX???ؘ??ח?????TTTTTT??А?ё???XXXXXX???QQQQQQ???RRRRRR??^^^^^^?ZZZZZZ?????UUUUUU?PPPPPP?ϟ???̜?????ə???̜??̜???ŕ?????Ɩ?RRRRRR?ə??ə??UUUUUU??______??ё???RRRRRR????̜??Ș?????????ŕ???RRRRRR?ϟ??̜?Ș?ə?Ș???ʚ?ʚ?Ș???Ǘ?Ɩ??Ǘ?Ĕ?Ó?Ĕ?ŕ??Ǘ?Ș???ё?А?????͝???ʚ?͝?SSSSSS?UUUUUU?TTTTTT?ӓ?TTTTTT?XXXXXX?]]]]]]?ښ?????WWWWWW??ח???ښ??ښ???????ݝ?\\\\\\??^^^^^^?^^^^^^?ښ?ޞ??Օ?SSSSSS?UUUUUU?Օ?YYYYYY?YYYYYY?ۛ??ޞ?ߟ????pppppp?ޞ?????ݝ?______??\\\\\\?ח?ܜ?^^^^^^?PPPPPP??______?]]]]]]???ݝ?ݝ????ܜ??ܜ??______??111111?ర?111111??rrrrrr?Ⲳ?⒒??ssssss?SSSSSS?SSSSSS??⒒?Ⲳ?SSSSSS?Ⲳ?rrrrrr?222222??222222?222222??qqqqqq??PPPPPP????______??PPPPPP?000000?000000?ݝ?]]]]]]?______?pppppp?QQQQQQ??RRRRRR?ᑑ?PPPPPP?qqqqqq????^^^^^^???ٙ??]]]]]]?XXXXXX???֖????????ٙ??????SSSSSS????^^^^^^????ϟ??ӓ?VVVVVV??XXXXXX?ח??UUUUUU?ё????RRRRRR??͝?˛??͝?Ξ???ə?˛???ё??Ɩ???Ĕ?Ĕ?ʚ?ə?Ș??ʚ?А??ח?ё?????ϟ????˛?ŕ??????Ó??Ĕ?Ĕ???Ɩ??ə??̜?SSSSSS?˛?Ǘ?Ǘ??????Ɩ?Ș??Ǘ???Ĕ?ŕ?ŕ???Ǘ??ё???????ʚ???ʚ????Ԕ??SSSSSS?RRRRRR?ח???ؘ??VVVVVV???YYYYYY?ח?^^^^^^?^^^^^^??^^^^^^???000000????[[[[[[?]]]]]]?????ٙ??ܜ?ܜ??XXXXXX????ݝ????ޞ?????ZZZZZZ????㓓???ښ??ర?pppppp?\\\\\\?????YYYYYY?ܜ?ܜ?000000????PPPPPP?000000?000000?PPPPPP??ర?pppppp?⒒???333333?㳳?㳳???㓓???Ⲳ?Ⲳ?⒒??⒒?222222????ᱱ?qqqqqq?pppppp??[[[[[[??^^^^^^?]]]]]]?______?^^^^^^?ߟ????111111?ర?111111??qqqqqq??ؘ????^^^^^^?ٙ?ؘ??[[[[[[?֖?WWWWWW????ؘ?WWWWWW?ښ??ח????SSSSSS??VVVVVV???SSSSSS?ZZZZZZ?^^^^^^??˛?А?̜?RRRRRR?Օ?SSSSSS??Օ?ٙ?????????RRRRRR?ϟ?͝?͝????Ǘ??͝?ə?˛?Ș??Ɩ?Ɩ??Ɩ????ŕ???QQQQQQ?????Ɩ?ə?ə?͝??ʚ??˛???Ĕ????’??Ĕ??Ó??ŕ?Ș?А?ӓ??̜?ə??̜?ə??̜?Ԕ??????Ĕ?Ó???Ǘ?ŕ?Ǘ?Ɩ?ϟ?͝??Ɩ????Ɩ?Ǘ???͝??TTTTTT??Ԕ?Օ?Օ??XXXXXX??ؘ?֖???YYYYYY?ۛ?ZZZZZZ?pppppp?嵵?TTTTTT???䴴?111111?]]]]]]??XXXXXX???ܜ?[[[[[[??ٙ?ܜ?ۛ????ޞ?^^^^^^?ܜ??[[[[[[?ޞ?______?ߟ??QQQQQQ????ZZZZZZ?ZZZZZZ?[[[[[[?ݝ????ర???ߟ?^^^^^^???ܜ?ܜ????ޞ???^^^^^^?ߟ????000000?????333333?ssssss?㳳?444444?TTTTTT?TTTTTT???㳳??333333?333333?333333?⒒?⒒?444444??????111111?ߟ?]]]]]]?^^^^^^?^^^^^^?ZZZZZZ?\\\\\\?______?______??ߟ?000000?ర?ర?111111?ర??\\\\\\??VVVVVV??ZZZZZZ?^^^^^^???UUUUUU?֖???ٙ????XXXXXX?ؘ??ښ?ZZZZZZ?Օ?????????^^^^^^?ZZZZZZ??TTTTTT??͝?ϟ?А?PPPPPP?Ξ?TTTTTT?XXXXXX???Ɩ?PPPPPP?XXXXXX???QQQQQQ?ϟ??˛?ʚ?Ǘ?ə??ə?Ξ?͝?Ǘ?ə??????Ș???ə????PPPPPP?????Ǘ?Ǘ??˛???QQQQQQ??’????Ó????̜?ޞ?QQQQQQ?Ș???ۛ?͝?ʚ???Ξ???Ș?Ș?Ș????ŕ???’??Ó?ŕ?ŕ?̜????Ɩ?ʚ?Ǘ?Ɩ?Ǘ?ə?ə?˛?RRRRRR?Ғ?Ғ?TTTTTT????QQQQQQ?ޞ????WWWWWW????ZZZZZZ??????[[[[[[?ٙ??Ԕ??ܜ?[[[[[[?YYYYYY???]]]]]]??444444?111111???]]]]]]?pppppp???ښ?ݝ?]]]]]]?ݝ??^^^^^^??______?ܜ?^^^^^^?ۛ?]]]]]]????000000?qqqqqq??ݝ??ݝ???______?______?PPPPPP?______?^^^^^^??ۛ?YYYYYY????ర???ర?pppppp?rrrrrr???㳳???TTTTTT?tttttt?䔔?tttttt??㳳?㓓?ssssss?SSSSSS?333333???rrrrrr?qqqqqq?ర?PPPPPP?ర????______?^^^^^^?ښ?[[[[[[?ߟ??ߟ?______???ర???]]]]]]?]]]]]]??ח?ח?????֖????000000?ٙ?XXXXXX?VVVVVV??ۛ????ޞ?ӓ??Օ??Օ??А?Ԕ?VVVVVV?^^^^^^?֖??͝?Ș?Ɩ????????̜?ё??QQQQQQ??А?ϟ??ʚ??ə???ə?Ǘ?ʚ??ə???Ǘ?ʚ???ə??PPPPPP?ё??ϟ???ӓ??Ș?ʚ?Ɩ?Ĕ??ŕ?ŕ??ŕ?’?????Ĕ?Ó?Ó????Ғ???˛?˛?????ʚ?Ǘ?Ǘ??Ș??Ǘ?Ĕ????’??Ĕ?Ɩ??ŕ?Ĕ?Ó?Ǘ?Ǘ???ʚ???Ș????QQQQQQ?ӓ???֖?wwwwww?555555?????Ԕ?֖????????WWWWWW??ؘ??ZZZZZZ???ۛ?????777777????????֖???????ߟ?\\\\\\???ޞ??000000??pppppp?111111???ۛ?ޞ?^^^^^^???ߟ?ߟ?^^^^^^?ߟ????ߟ?ర??ᱱ??ᱱ??rrrrrr??㓓??444444?tttttt?444444?tttttt?䔔?䴴?䴴?tttttt?444444?444444?㳳??㓓??????______?ߟ??PPPPPP?ర???\\\\\\????PPPPPP?^^^^^^????______?ర??????[[[[[[??ח??XXXXXX??ښ?[[[[[[?]]]]]]?ٙ??VVVVVV?ܜ???\\\\\\??UUUUUU??UUUUUU??Ғ??RRRRRR?А??????ϟ?Ĕ?Ǘ?˛?ϟ????SSSSSS?ϟ?А?ё??Ξ??А?͝???ʚ?˛????Ș??Ș??Ǘ??ə????ё???Ξ???Ξ??QQQQQQ?Ɩ???ŕ???ŕ???Ó?ŕ???Ĕ????????QQQQQQ??Ξ?Օ?Ξ??????Ǘ?Ǘ??Ĕ??Ĕ?ŕ?Ó??Ɩ?Ĕ???ʚ???Ĕ?Ɩ??Ș???Ș??ə?Ș?А??ё?ё?UUUUUU???ZZZZZZ?pppppp??RRRRRR??UUUUUU?SSSSSS?Օ???]]]]]]??ZZZZZZ????ٙ?ܜ??ܜ?\\\\\\?ښ??XXXXXX?^^^^^^??qqqqqq???ܜ?]]]]]]?[[[[[[??^^^^^^?????ۛ?000000??QQQQQQ?ߟ?ۛ??XXXXXX?[[[[[[??]]]]]]?______?______?PPPPPP?______????^^^^^^?ݝ?ݝ??000000?PPPPPP?PPPPPP?^^^^^^???______??ర????Ⲳ???ssssss?㳳??tttttt?tttttt??????555555???䴴?TTTTTT??SSSSSS???RRRRRR???PPPPPP?PPPPPP?000000?QQQQQQ?pppppp?????]]]]]]?ߟ?^^^^^^???000000?PPPPPP??PPPPPP???YYYYYY?WWWWWW?ח?[[[[[[????[[[[[[?????WWWWWW?ښ???^^^^^^??\\\\\\??ٙ????RRRRRR??Օ?????˛??Ĕ???̜?̜??TTTTTT???UUUUUU?ё???ϟ?PPPPPP?ʚ??Ș??Ș?ʚ??ʚ??ʚ?ə??͝?Ș????͝???Ξ??ё?ӓ?UUUUUU???ŕ?Ó?Ĕ???Ĕ?ŕ?Ĕ?ŕ??̜??ŕ?Ɩ????Ɩ???Ǘ?Ɩ?˛??????˛????Ɩ???Ɩ????Ĕ???Ɩ?ə?????????Ĕ?Ĕ??Ĕ??˛?ʚ?Ξ????TTTTTT?֖?VVVVVV?А?PPPPPP??????ٙ???ؘ?ٙ??????ޞ?[[[[[[??А??]]]]]]?ߟ?ܜ????ۛ?ۛ?ۛ?]]]]]]??______?ۛ????ర??????ۛ?WWWWWW?ښ?ᑑ????ޞ????]]]]]]???111111??000000?^^^^^^????000000?QQQQQQ?ᑑ????ssssss???tttttt?䴴?䔔??555555?UUUUUU?UUUUUU?uuuuuu?啕?啕?UUUUUU?uuuuuu?555555??䔔??SSSSSS??Ⲳ???ߟ??pppppp?????]]]]]]?ZZZZZZ??ܜ???ߟ?????ݝ?ܜ???֖??ۛ?^^^^^^???ޞ?????ח?ݝ???ښ???ח?Օ?֖?TTTTTT?ח???RRRRRR???Ĕ?ŕ?Ó?ŕ?ŕ???VVVVVV?????Օ?PPPPPP??ə????͝?????˛?ə?Ξ?̜???˛?ʚ??QQQQQQ???ʚ??А??SSSSSS?Ғ?˛??????Ɩ?˛?Ĕ??Ó?Ó?’?Ĕ???Ĕ???Ĕ?????Ǘ?ə??Ξ?ϟ?˛????̜??Ș???????Ĕ?Ó??ʚ??Ĕ???Ĕ?Ó?Ɩ???’??ŕ???˛?˛?ϟ???ё?SSSSSS?TTTTTT??Ξ??Օ???YYYYYY?ݝ??ܜ??XXXXXX?֖??XXXXXX?ݝ?ZZZZZZ?[[[[[[?ښ?Օ?Ғ?QQQQQQ??֖?????]]]]]]????QQQQQQ??^^^^^^?[[[[[[??WWWWWW??ۛ??ZZZZZZ?ښ??000000???XXXXXX?ؘ?ܜ???[[[[[[?ܜ?????000000?RRRRRR?rrrrrr??pppppp?????ᑑ?222222?RRRRRR?Ⲳ?ssssss?㓓????tttttt?䔔?555555?uuuuuu?嵵??????嵵?啕?555555???㳳?333333??RRRRRR?ᑑ???qqqqqq????ܜ?[[[[[[?ٙ?VVVVVV??^^^^^^?^^^^^^??ߟ???^^^^^^?ښ?ٙ???YYYYYY?ۛ???ܜ??ޞ????????YYYYYY?XXXXXX????֖?UUUUUU??Ԕ?VVVVVV?SSSSSS?ϟ?QQQQQQ?Ξ?ʚ?Ș???Ǘ??ϟ?QQQQQQ?????TTTTTT?RRRRRR?Ș?ŕ?ŕ??̜??˛?̜?Ξ?̜????͝?̜????ʚ???ə?Ξ?֖???̜?Ș???Ɩ?Ǘ?Ɩ?Ǘ???’????Ó?’???Ș???Ɩ?Ĕ??ŕ?Ĕ???ʚ?ϟ????Ξ?ʚ?SSSSSS???Ԕ?ŕ???Ɩ??????Ĕ?Ĕ?Ĕ?ŕ?ŕ?’?Ĕ???ŕ?ŕ?˛?RRRRRR??Ξ???ϟ??UUUUUU?ӓ?UUUUUU?VVVVVV?ݝ?ӓ?ח??YYYYYY?ښ?]]]]]]?ܜ????VVVVVV??ٙ?ٙ?????ښ??UUUUUU???ݝ??ݝ??ܜ????______?ܜ??ٙ??]]]]]]??ؘ??\\\\\\?ۛ??ښ????ܜ?^^^^^^?ۛ?ZZZZZZ?ܜ??^^^^^^??ޞ?pppppp??QQQQQQ??222222?QQQQQQ?111111?ᑑ?222222?RRRRRR?Ⲳ?SSSSSS?SSSSSS???444444?䔔???UUUUUU?嵵???VVVVVV?VVVVVV?666666?666666???嵵?嵵??䔔???333333?⒒??111111?RRRRRR????ᱱ??[[[[[[???\\\\\\?^^^^^^?^^^^^^???ߟ?^^^^^^??ۛ?ZZZZZZ?ח?UUUUUU???ܜ?\\\\\\???[[[[[[?ٙ?YYYYYY?ח???ؘ?ٙ???XXXXXX?ښ?ؘ???UUUUUU?Ԕ??ӓ?ϟ?????˛????ϟ???SSSSSS?SSSSSS????ŕ?Ǘ?ϟ???̜??Ș?ə?Ξ?˛?˛?ə??͝?̜????ŕ?Ș??ϟ???ə?˛?Ғ?ə?ŕ??Ɩ?’???ŕ??’?????А???ə?ŕ?Ɩ???Ɩ?Ǘ??ə?Ǘ??ʚ?˛??000000?А???˛?Ξ?????Ɩ???Ó?Ĕ?????Ĕ?Ɩ?Ĕ??????Ξ??ё?QQQQQQ???TTTTTT?֖?VVVVVV?XXXXXX?VVVVVV??YYYYYY???ۛ??ۛ?\\\\\\?ZZZZZZ?ؘ?WWWWWW?֖?ח??ښ?ؘ?ח?Օ??ܜ?????\\\\\\?[[[[[[?[[[[[[??ޞ?ۛ????ښ?ZZZZZZ???[[[[[[?YYYYYY?ٙ?ٙ?ח?YYYYYY?ZZZZZZ???????XXXXXX??]]]]]]?ݝ?______?^^^^^^?ߟ??ZZZZZZ??111111???ᑑ?ᱱ?⒒?Ⲳ?333333?㓓?㳳?444444?tttttt?䔔???555555???VVVVVV?vvvvvv?斖??涶?vvvvvv?666666?666666???UUUUUU??tttttt??㓓??222222????111111?pppppp?000000??]]]]]]???^^^^^^?QQQQQQ?pppppp?______?\\\\\\?ݝ??^^^^^^?ܜ???YYYYYY??ܜ?ZZZZZZ??ݝ??????ח?ؘ?]]]]]]?????[[[[[[?WWWWWW?WWWWWW????TTTTTT??QQQQQQ?Ξ??˛??ϟ????RRRRRR??RRRRRR?TTTTTT?֖??Ǘ??˛????ϟ??Ξ?˛??͝?͝?͝??PPPPPP??Ғ?Ξ???˛??ə?TTTTTT?Ξ?ϟ??˛?ə??ŕ??Ǘ??’?????Ó??’???QQQQQQ?Ș?Ĕ??ŕ??ə?ə??Ǘ??̜?А?ə???Օ???͝??QQQQQQ??PPPPPP??????Ó?Ó?Ĕ?̜?ŕ??Ó??’??????Ξ?PPPPPP???QQQQQQ?ё?ח?WWWWWW??ٙ?VVVVVV?SSSSSS?ٙ??000000?ܜ???ٙ?ח???VVVVVV?VVVVVV?֖?VVVVVV???YYYYYY?XXXXXX?ݝ????[[[[[[?]]]]]]????[[[[[[?[[[[[[?ٙ??YYYYYY??ٙ?WWWWWW?UUUUUU?֖?Օ?\\\\\\???]]]]]]?[[[[[[?\\\\\\?ۛ??ښ??YYYYYY???ޞ?]]]]]]??^^^^^^????ޞ????????SSSSSS?333333?444444?TTTTTT?䴴?䴴????VVVVVV?斖???????vvvvvv?666666?666666??嵵?555555?䴴?444444??SSSSSS?Ⲳ??QQQQQQ??pppppp???ᑑ?^^^^^^?ݝ??______?000000??^^^^^^???ߟ??ܜ??????ZZZZZZ?XXXXXX??[[[[[[??]]]]]]??ח?ؘ?ؘ??ٙ?ܜ??000000?[[[[[[?VVVVVV??TTTTTT?SSSSSS??????͝?̜?Ξ?ϟ????RRRRRR?TTTTTT???TTTTTT?͝?Ó???А?PPPPPP????ё???Ξ??˛???QQQQQQ??͝?UUUUUU?̜??ϟ??͝?ؘ????Ș?ʚ??Ɩ?ə?Ĕ?Ĕ????Ó????͝??ŕ??Ĕ?’?Ó??ə?Ǘ?Ș???????А????А?͝???ŕ???Ș???Ĕ?Ó?Ó?Ĕ?Ó?’?Ĕ????͝???˛??QQQQQQ???ё?TTTTTT??֖????QQQQQQ?Օ?SSSSSS????ٙ?ؘ?XXXXXX??WWWWWW?Օ???????ؘ???ssssss?]]]]]]?ٙ?ZZZZZZ???ښ??ښ?ښ?ٙ?ۛ???WWWWWW??Օ?XXXXXX???]]]]]]???ܜ??ZZZZZZ?ח??Օ?[[[[[[?ݝ?ޞ?rrrrrr??ޞ???ݝ?ߟ?ర??pppppp??rrrrrr?333333?㓓?㓓?㳳?tttttt?????VVVVVV?涶??777777??777777??WWWWWW?WWWWWW?777777??斖?666666?啕??uuuuuu??䔔?㳳?㓓???ᑑ????000000?PPPPPP?^^^^^^?]]]]]]??ݝ??\\\\\\?ޞ??ښ?\\\\\\?ݝ?ݝ???ښ?Օ?UUUUUU??ؘ?ܜ??ۛ????ٙ?֖?XXXXXX?\\\\\\?????Օ??UUUUUU?ӓ?RRRRRR?SSSSSS?RRRRRR??͝?˛?̜?А?ё?Ғ????????ё?ʚ??RRRRRR??ϟ?QQQQQQ??PPPPPP??????Ξ??QQQQQQ?PPPPPP?ӓ??PPPPPP?QQQQQQ?͝?͝?ϟ?Ξ?UUUUUU?А??Ș??Ș?Ș??̜??Ǘ?Ĕ?’?????Ĕ???Ĕ???Ĕ??Ș????Ǘ??ʚ??А?ӓ?̜?˛?͝?˛?͝??̜??ə??ŕ?Ó??Ó?Ó??????ŕ?ŕ?????ϟ?PPPPPP??????SSSSSS??WWWWWW??TTTTTT??QQQQQQ???WWWWWW???ؘ???TTTTTT?UUUUUU???֖?Ԕ??????ర?]]]]]]?ۛ???ٙ?ZZZZZZ?????ٙ?YYYYYY?XXXXXX?TTTTTT???ٙ?[[[[[[??]]]]]]??ߟ??\\\\\\?ښ??ZZZZZZ??ZZZZZZ?]]]]]]??ߟ???????000000??qqqqqq?RRRRRR??SSSSSS?SSSSSS?㓓????uuuuuu?uuuuuu?vvvvvv??WWWWWW?痗?緷???緷??緷?痗?痗?wwwwww?777777?涶?VVVVVV??嵵?555555?䴴??㳳??222222??ᱱ?111111??000000?ర?ߟ????ݝ?????ۛ????\\\\\\???\\\\\\?\\\\\\??]]]]]]??^^^^^^?????ח???]]]]]]???ؘ?֖?ӓ???RRRRRR?RRRRRR????Ξ?̜?RRRRRR????ӓ??ё?TTTTTT?ZZZZZZ??QQQQQQ?Ξ?̜???͝?А??А?ə?Ș??͝?̜??ZZZZZZ?Ғ?ښ????Ξ???ӓ???͝??Ș????Ɩ???’?’?Ó?????Ĕ??Ó?ŕ??͝??????ə???ə??Ξ?QQQQQQ???͝??ӓ??????????????͝??Ǘ?Ǘ?????А???Ғ??Ғ?RRRRRR?Ғ????????WWWWWW?[[[[[[?ٙ??ٙ???TTTTTT???ؘ?Օ?Օ??XXXXXX?TTTTTT?VVVVVV??WWWWWW???YYYYYY?YYYYYY?ܜ?ۛ?ٙ??ٙ???Օ?TTTTTT?WWWWWW?????\\\\\\??^^^^^^??ޞ??ښ?RRRRRR?????????XXXXXX?????ర?QQQQQQ?222222?SSSSSS?SSSSSS???tttttt?UUUUUU?uuuuuu??涶?wwwwww?緷??888888?xxxxxx?xxxxxx?xxxxxx?XXXXXX?XXXXXX?888888????wwwwww???vvvvvv??uuuuuu???㓓???ᱱ?qqqqqq??pppppp??PPPPPP?pppppp??ܜ???ߟ???XXXXXX??ؘ?\\\\\\??ܜ?ݝ??]]]]]]???ޞ??ښ?ޞ??ח??ZZZZZZ?ZZZZZZ?ܜ?ښ???XXXXXX?\\\\\\?Ԕ??QQQQQQ?͝?ə???̜??????ё?ё?Ғ??ӓ?RRRRRR???Ξ???͝??VVVVVV?RRRRRR?PPPPPP?????Ξ??ۛ??QQQQQQ?ϟ?ϟ??Ξ??А?????ʚ?ə??ŕ?ϟ??????’??’????’????’????Ɩ?ŕ???Ș??ʚ?Ξ???А?ϟ??PPPPPP?˛??ϟ?????Ĕ???????˛????SSSSSS?QQQQQQ???ё???Ғ??Օ??Ғ??????ё???ۛ??֖??Օ??UUUUUU?XXXXXX?֖??VVVVVV??Օ?UUUUUU?ؘ?ؘ???YYYYYY?XXXXXX?YYYYYY?XXXXXX?ۛ????TTTTTT?????ٙ??pppppp?^^^^^^?ۛ?ޞ???]]]]]]?ޞ?]]]]]]???ܜ??______??\\\\\\???YYYYYY?ښ??000000??qqqqqq?ᑑ?rrrrrr?333333?㓓??䔔??UUUUUU???痗??XXXXXX?xxxxxx?踸???????xxxxxx?XXXXXX?888888??wwwwww?777777??666666??UUUUUU?䴴?㳳??rrrrrr??QQQQQQ?ర?pppppp?????ޞ?\\\\\\?\\\\\\?ݝ?[[[[[[??]]]]]]?ܜ?ۛ?ݝ?ܜ??ܜ?ߟ?^^^^^^?pppppp?????ZZZZZZ?ݝ?ۛ?]]]]]]??ښ???\\\\\\??ZZZZZZ???Ԕ?XXXXXX???Ș?Ǘ??͝?̜?͝???ϟ?PPPPPP??PPPPPP??PPPPPP?ё?RRRRRR??Ĕ??ϟ?ӓ???А??ʚ?PPPPPP?Ξ?UUUUUU???SSSSSS?Ԕ???ϟ?͝?͝???PPPPPP??Ș????Ǘ?????????????’???????̜?Ĕ????RRRRRR?Ș?˛?????QQQQQQ??WWWWWW?̜?ϟ????????Ɩ?Ǘ?Ș?Ș?͝????ϟ?А??QQQQQQ?Ғ?RRRRRR?ӓ?Ғ??֖?ӓ?UUUUUU?ӓ???ZZZZZZ????ۛ????ח?ؘ????ח???111111???ח?XXXXXX??XXXXXX???֖???ښ??????UUUUUU?YYYYYY?ٙ?YYYYYY?????^^^^^^?rrrrrr?????ښ??ۛ?ܜ??^^^^^^???YYYYYY??ZZZZZZ???qqqqqq?222222?RRRRRR??SSSSSS??䔔??555555?嵵??緷?888888?xxxxxx?踸??999999?陙?陙?陙?YYYYYY?YYYYYY?YYYYYY??踸?xxxxxx???wwwwww??VVVVVV??啕?tttttt??SSSSSS?ssssss?⒒?ᱱ??000000?000000??pppppp?ᑑ??ݝ?ܜ?\\\\\\??ޞ???^^^^^^????[[[[[[?ޞ?QQQQQQ?ssssss??PPPPPP??\\\\\\????]]]]]]?ߟ???ښ?[[[[[[??ZZZZZZ??֖???͝?PPPPPP?˛?Ǘ?Ǘ?????ё???ϟ?А?QQQQQQ?А??Ξ???ə?А?????Ξ??А??ח??PPPPPP???ϟ??????PPPPPP??ə???ə?˛???ŕ??Ĕ??Ó??’????????’?Ó??Ș??????ӓ??ϟ?ϟ??͝????˛?˛?ϟ?Ǘ?Ǘ???Ĕ???Ǘ?̜??͝?А??ё?А???ϟ?????????Ԕ?TTTTTT?Ғ?Ғ??ܜ?ښ?]]]]]]?ܜ?000000?ؘ?ZZZZZZ??VVVVVV??֖????111111?ٙ????ښ?ٙ??WWWWWW??XXXXXX??ZZZZZZ???ؘ?֖????YYYYYY?YYYYYY?ؘ?ښ?YYYYYY?????^^^^^^?[[[[[[??ؘ?ZZZZZZ?ۛ?????ܜ?ۛ??ٙ??000000??ᑑ?⒒?Ⲳ?SSSSSS??tttttt?555555?UUUUUU?555555?嵵?痗??蘘???陙?鹹???????yyyyyy??蘘?888888??緷??斖??uuuuuu?䴴??㓓??222222??ᑑ?ర???PPPPPP???ޞ????ޞ?[[[[[[?]]]]]]???ۛ?ښ??ޞ?ߟ?ᑑ?ᑑ?000000??\\\\\\???ؘ??????[[[[[[??ۛ?ۛ??RRRRRR??QQQQQQ????˛?Ξ?͝?ё?ϟ??????А?А?QQQQQQ??ŕ?Ș??ϟ?А?PPPPPP???͝?А??RRRRRR?ۛ?PPPPPP?͝??RRRRRR?А?ʚ?˛???PPPPPP?RRRRRR???ʚ?QQQQQQ??Ɩ?ŕ?Ĕ??ŕ??????’????Ĕ????’???ə?QQQQQQ???͝????͝?QQQQQQ???Ξ?PPPPPP??????ŕ?Ĕ?Ĕ??Ș?Ș?ə?Ԕ?Ԕ?А?͝?PPPPPP?Ξ?ϟ?PPPPPP?RRRRRR?ښ??PPPPPP?QQQQQQ?QQQQQQ?QQQQQQ???SSSSSS?Ԕ?UUUUUU??XXXXXX?ZZZZZZ??^^^^^^???WWWWWW?ח?\\\\\\?֖?Օ?ؘ?YYYYYY???ZZZZZZ??]]]]]]?ᱱ?XXXXXX???????]]]]]]?ٙ???YYYYYY???ٙ?YYYYYY?YYYYYY?????ݝ???ޞ?ߟ???YYYYYY???????]]]]]]????PPPPPP??ᑑ?rrrrrr??333333?TTTTTT?䔔??啕??vvvvvv?777777?888888?蘘??yyyyyy?陙?::::::?ZZZZZZ?Ꚛ?꺺?Ꚛ?zzzzzz?::::::???鹹?999999?踸?xxxxxx??777777?涶??啕?䔔?䴴?TTTTTT???rrrrrr???ర?ర?000000?pppppp??^^^^^^?[[[[[[???ݝ?ۛ?ޞ???ٙ?ښ?????qqqqqq?333333?????ؘ?XXXXXX?ٙ??ښ??ܜ?????ӓ???А?А??ʚ?̜?Ξ?Ξ???PPPPPP???????????ӓ?Ғ?SSSSSS?PPPPPP?͝?͝?ϟ???QQQQQQ?ϟ?˛?ϟ???̜?̜??ʚ?֖???ʚ?˛??Ǘ?Ó?Ĕ??Ó???ŕ?Ó????’?ё??’???Ó??Ĕ???QQQQQQ??QQQQQQ??SSSSSS?֖?VVVVVV?ח?А?ʚ???̜???Ǘ?˛?PPPPPP??ŕ?ŕ??Ǘ??RRRRRR?UUUUUU?А????Ξ?PPPPPP???ӓ??PPPPPP?ϟ????WWWWWW??TTTTTT?UUUUUU??XXXXXX?ZZZZZZ??????ٙ?ۛ???ח????XXXXXX?ݝ????YYYYYY????ٙ?????ٙ?ٙ?ZZZZZZ?WWWWWW?ښ?ח??WWWWWW?ۛ???ݝ?]]]]]]?______?111111??]]]]]]?ښ??ښ?[[[[[[?ݝ???______??000000????111111??rrrrrr??ssssss?TTTTTT??uuuuuu??VVVVVV??緷?XXXXXX??yyyyyy???zzzzzz?꺺??????Ꚛ?ZZZZZZ??鹹?999999?踸??緷??VVVVVV????䴴??RRRRRR?rrrrrr?QQQQQQ?qqqqqq?ర?000000???ߟ?ݝ?[[[[[[?PPPPPP?ߟ?ޞ???[[[[[[?????ݝ?ޞ?111111?Ⲳ?QQQQQQ??000000?ݝ?ؘ????ZZZZZZ??]]]]]]??ZZZZZZ??֖??RRRRRR??QQQQQQ??ϟ?PPPPPP?ə?̜?ϟ??PPPPPP????RRRRRR?ё?RRRRRR?Ғ???Ξ????????͝?̜??Ș??Ș???̜?͝????ʚ?А?А??Ξ???Ɩ?Ó??’????Ĕ?Ș?’????’??Ó?Ɩ??????Ĕ?Ș?ӓ?ۛ?PPPPPP?ё?Ԕ???ӓ???ʚ???Ǘ?Ɩ??Ɩ??ŕ??Ĕ??????ʚ?????RRRRRR?SSSSSS??Ғ?ӓ????WWWWWW?ٙ??ϟ?????111111?ZZZZZZ?ښ?VVVVVV?ٙ???????VVVVVV??VVVVVV?֖????[[[[[[?XXXXXX?ZZZZZZ??YYYYYY?[[[[[[?ZZZZZZ??XXXXXX??ZZZZZZ??XXXXXX???ח?VVVVVV??\\\\\\?______??555555?ݝ???\\\\\\?ݝ???ݝ??ߟ?______?pppppp?qqqqqq??ర?111111?qqqqqq?111111??rrrrrr??㓓?tttttt??啕??涶?wwwwww??蘘?YYYYYY??zzzzzz?Ꚛ?꺺??{{{{{{?뛛?뛛?뛛?;;;;;;??zzzzzz?ZZZZZZ??yyyyyy??XXXXXX??WWWWWW?斖??UUUUUU?䔔??SSSSSS?⒒?ᱱ?QQQQQQ????pppppp????ݝ???ޞ???ܜ???ؘ???qqqqqq?000000???pppppp?]]]]]]??ؘ????ښ?ݝ?ޞ?[[[[[[?ٙ?????PPPPPP??ϟ?PPPPPP?˛??͝?PPPPPP??͝??PPPPPP??RRRRRR????А?ϟ?А??Ғ???ӓ???ϟ??͝?Ғ?Ɩ?Ĕ?Ǘ??͝?А??XXXXXX??PPPPPP?ϟ????Ξ??ŕ??А?Ó????????Ĕ?Ĕ??????Ĕ?ŕ????Ǘ?ə?Ԕ???PPPPPP?А???RRRRRR?ϟ?˛??Ǘ?Ɩ??Ĕ?Ĕ?Ǘ??Ĕ?Ó?Ó?ŕ??˛?˛????͝??Ғ?Օ??ӓ?TTTTTT??WWWWWW?ח???Ԕ????ܜ??[[[[[[?VVVVVV?Օ?UUUUUU??????UUUUUU???UUUUUU?UUUUUU??]]]]]]??XXXXXX?ח??ؘ?ZZZZZZ????ؘ?ZZZZZZ??ZZZZZZ???WWWWWW???ߟ?????\\\\\\?ۛ??ݝ??[[[[[[?ݝ?]]]]]]?______?______?______?qqqqqq?000000?000000????qqqqqq?ᱱ??rrrrrr??㳳???uuuuuu???緷?踸?999999?鹹?ZZZZZZ?꺺??{{{{{{???<<<<<>>>>>???????????======?윜??[[[[[[??ZZZZZZ?陙??XXXXXX?wwwwww???UUUUUU?䴴??SSSSSS??ᱱ?QQQQQQ???000000???ݝ???ޞ?ݝ?ܜ??ښ?ۛ?\\\\\\???\\\\\\???]]]]]]?^^^^^^??000000?______?\\\\\\?????????Օ?WWWWWW?]]]]]]??UUUUUU????͝??Ԕ?Ξ?̜?ʚ???????QQQQQQ?Ξ?RRRRRR?????ӓ?RRRRRR????Ξ????А?WWWWWW?TTTTTT?QQQQQQ?WWWWWW??ϟ?̜?˛??͝?͝?͝??Ǘ???ə??ё??Ĕ??????????????Ǘ?А?PPPPPP?WWWWWW?Ԕ?QQQQQQ???Ș?˛?ё?ϟ?Ξ??˛?ŕ?’??ŕ????Ĕ?Ĕ??Ș?Ș??Ǘ?ʚ???̜?ё?????Օ????Ԕ??\\\\\\?ё??XXXXXX?֖?֖?WWWWWW??WWWWWW?֖?UUUUUU??ܜ??VVVVVV???ٙ??????VVVVVV?YYYYYY??ؘ??XXXXXX?XXXXXX??PPPPPP?______????VVVVVV??ٙ?ښ?YYYYYY?XXXXXX?ښ??______???ZZZZZZ?ښ?[[[[[[??]]]]]]?^^^^^^??^^^^^^?YYYYYY?ۛ?111111??ݝ?^^^^^^?PPPPPP??qqqqqq?ᱱ?ᱱ?Ⲳ??tttttt?䴴?UUUUUU?VVVVVV??緷?xxxxxx??鹹?ZZZZZZ??;;;;;;??윜???????======?윜??[[[[[[??ZZZZZZ?yyyyyy??888888?WWWWWW?涶??UUUUUU?䔔?444444?ssssss?⒒??qqqqqq??pppppp?000000????]]]]]]???????ۛ???______?]]]]]]?\\\\\\???ߟ?RRRRRR??[[[[[[?ٙ?ښ?YYYYYY??pppppp???YYYYYY????֖?֖?SSSSSS??Ғ?Ξ?͝?̜???ə?ə??Ș?ə?Ξ?А??А?PPPPPP?ə???Ғ?Օ?Օ??SSSSSS?ё?ё?ϟ??͝?PPPPPP?????ؘ?]]]]]]???????Ș??Ǘ??????Ó????’???????’??Ó?ʚ??͝?ӓ?Օ?QQQQQQ?֖??ə?ʚ?А?̜?ʚ?Ξ?ə?ŕ????ŕ?’??’?Ó?ŕ??????????PPPPPP??А??PPPPPP??XXXXXX?VVVVVV?UUUUUU??QQQQQQ?RRRRRR?ӓ?SSSSSS??֖??WWWWWW?XXXXXX?ؘ?VVVVVV?ח??WWWWWW??WWWWWW?WWWWWW???VVVVVV???????YYYYYY??ؘ?ZZZZZZ?ܜ?______?222222???ח?֖?????ٙ???]]]]]]??]]]]]]?YYYYYY??ZZZZZZ?ݝ??]]]]]]?ښ?^^^^^^????ర?000000?ݝ??000000?pppppp?ᑑ?rrrrrr?rrrrrr?Ⲳ?㳳?䔔??????蘘??鹹?zzzzzz??[[[[[[??||||||??흝?~~~~~~?????\\\\\\?뻻?;;;;;;?Ꚛ??YYYYYY?踸??777777?vvvvvv???TTTTTT??ssssss?222222?qqqqqq?QQQQQQ???ߟ???]]]]]]??^^^^^^?]]]]]]?\\\\\\????ݝ???ښ???^^^^^^?[[[[[[???ޞ?ZZZZZZ?ݝ?ۛ?QQQQQQ?????ؘ?ؘ?UUUUUU??Ԕ?TTTTTT??????Ξ???Ș???˛?ə???Ξ?̜???????ӓ?PPPPPP?ё??А??Ξ?̜?ё??RRRRRR??ё??[[[[[[?QQQQQQ????Ș?UUUUUU???ŕ?Ɩ???Ĕ??????????????????ё?Ғ????ʚ?????????Ș??А?Ó??Ó???Ǘ?˛???ʚ??????QQQQQQ???????VVVVVV?ZZZZZZ??А?ϟ???XXXXXX??WWWWWW?????YYYYYY??ߟ??SSSSSS?Օ?֖??Ԕ????WWWWWW??ؘ?ZZZZZZ????ZZZZZZ?ݝ?^^^^^^?ܜ?????UUUUUU???ؘ???ۛ?ۛ?^^^^^^?ٙ?Ԕ??YYYYYY?????ޞ??PPPPPP??ޞ???000000??ᑑ?222222?⒒?333333?㓓?TTTTTT??啕?vvvvvv?777777??xxxxxx??鹹?zzzzzz??;;;;;;?뻻??윜??흝??흝??||||||??뛛??ZZZZZZ???蘘?緷??vvvvvv???444444?㳳?333333?RRRRRR?111111?111111?111111??______???ݝ???]]]]]]?ۛ??ښ??????????ᑑ?^^^^^^??????ܜ?]]]]]]??^^^^^^?????SSSSSS??Ғ????Ξ??˛???Ș??А?Ξ??˛?͝?˛???А?ӓ???ё???ё?А??Ξ??PPPPPP??QQQQQQ?Ғ??Ғ?RRRRRR??Օ?А?PPPPPP?PPPPPP?QQQQQQ?Ɩ????Ĕ??’???????????????ŕ?ؘ?RRRRRR?000000????PPPPPP?˛?????Ș?ŕ???Ș??ϟ??ŕ?Ó??Ɩ?˛??PPPPPP???ё??ʚ?ϟ?XXXXXX????TTTTTT?UUUUUU??VVVVVV???ښ???TTTTTT?ӓ?ؘ????ۛ?XXXXXX?????XXXXXX??TTTTTT?ё???VVVVVV??ח?Օ???ښ??pppppp????\\\\\\?ۛ?YYYYYY?ٙ?ח?RRRRRR?????YYYYYY??\\\\\\?????ؘ?ᑑ?ݝ??????ర??]]]]]]?[[[[[[??pppppp?QQQQQQ???rrrrrr?Ⲳ?ssssss?TTTTTT??uuuuuu?666666?777777??XXXXXX?999999?鹹??꺺??뛛??<<<<<>>>>>????????;;;;;;?999999???ᑑ???ݝ?______??ښ??ܜ??______???pppppp????ర?111111?qqqqqq?ᱱ?Ⲳ?⒒??333333?ssssss?ssssss?㓓??TTTTTT?tttttt?䔔?䔔?tttttt?tttttt?TTTTTT??㓓?㓓?㓓?SSSSSS?ssssss???222222??222222??ర??ᑑ?qqqqqq?ర?PPPPPP???]]]]]]?[[[[[[??ݝ??ۛ?]]]]]]?ߟ?ߟ??QQQQQQ???QQQQQQ??ߟ??ݝ?]]]]]]??\\\\\\??ZZZZZZ????ߟ?ᑑ??ܜ??????А?А?А?ʚ??Ș?А??ӓ?XXXXXX??TTTTTT?ؘ?WWWWWW?֖??ݝ??RRRRRR?Ԕ?Օ?TTTTTT????????TTTTTT??А?TTTTTT?PPPPPP?PPPPPP??Ғ?ё?Ғ?А?????????’??’????Ɩ???Ǘ???????????’????Ɩ?Ɩ?Ǘ??ŕ??Ó????Ĕ???Ĕ???????Ĕ???Ș?ə?͝?Ɩ????Ξ?ё?ё?UUUUUU??????VVVVVV?Օ?TTTTTT??XXXXXX?______???֖?Ԕ???ӓ?ܜ????SSSSSS???ə?????^^^^^^??֖??Ԕ?VVVVVV?????UUUUUU?[[[[[[??VVVVVV??YYYYYY??[[[[[[???rrrrrr?斖?yyyyyy??????rrrrrr??ۛ?ۛ??ݝ??YYYYYY?ݝ????ޞ??PPPPPP?]]]]]]?]]]]]]???SSSSSS??111111??⒒?Ⲳ??㓓?㳳???tttttt?TTTTTT?TTTTTT?䴴?444444?TTTTTT???㳳?ssssss????RRRRRR??RRRRRR?⒒??ᑑ??QQQQQQ?QQQQQQ??ޞ???\\\\\\??ۛ?ܜ???^^^^^^?______??000000?ݝ?ݝ???PPPPPP?ߟ????[[[[[[?\\\\\\?ZZZZZZ?XXXXXX?[[[[[[?ܜ?ߟ?㓓?rrrrrr?ޞ?\\\\\\?111111?444444???֖?֖??А?PPPPPP?̜?̜?Ξ?PPPPPP???ӓ??????WWWWWW??ӓ?TTTTTT?Ԕ??TTTTTT?ӓ?ӓ??RRRRRR?Օ?֖??VVVVVV?VVVVVV??WWWWWW?QQQQQQ??ӓ??PPPPPP??????????????????Ș??Ș?????Ғ???ŕ?Ó?Ș??Ĕ?ə?ŕ???Ĕ?Ĕ??QQQQQQ?Ó?ŕ?Ĕ???’??Ó?Ó???????Ĕ?ŕ?Ɩ?Ǘ?ə???Ǘ?̜??ё?QQQQQQ?UUUUUU?ܜ?XXXXXX?Ԕ?ח?XXXXXX?֖?Ԕ?SSSSSS??YYYYYY?ٙ?WWWWWW?ٙ??TTTTTT?TTTTTT?TTTTTT?XXXXXX?֖??Ғ?RRRRRR?QQQQQQ???ə?˛?А??А?SSSSSS?Օ?Ԕ??Ԕ?Ԕ?RRRRRR?RRRRRR??Ғ??Օ?WWWWWW?XXXXXX?WWWWWW???ښ??ܜ??啕?ZZZZZZ?꺺?뻻?::::::?VVVVVV?RRRRRR???ښ?????֖?[[[[[[?ܜ???^^^^^^?000000?ర???______??222222?222222?PPPPPP?ᑑ?RRRRRR?rrrrrr?rrrrrr??ssssss?㳳??444444???444444?㳳????444444??㓓????222222??222222??ర?????^^^^^^?ܜ??[[[[[[???ݝ????000000????]]]]]]??PPPPPP?㓓??______?ޞ?ۛ?]]]]]]?XXXXXX???ۛ?ݝ??222222?000000?ZZZZZZ???ߟ?______???ח?RRRRRR?А?А????А??Ғ?QQQQQQ?ё?Օ???Ԕ?TTTTTT?UUUUUU?Օ????֖???SSSSSS?Օ?֖??WWWWWW?֖??????PPPPPP?͝??Ǘ?˛?Ǘ??’????????Ó?????Ó???Ó?Ĕ?Ɩ?ח?Ș??Ǘ?Ɩ?ŕ???ʚ?̜?Ǘ????ŕ?Ó????Ĕ??ə??’??’?Ó??Ĕ?Ó?Ó?????????Ș?Ș??̜?ϟ?UUUUUU?WWWWWW????ssssss??TTTTTT??Ԕ?YYYYYY???Ԕ??SSSSSS??Օ?SSSSSS???ё?QQQQQQ?QQQQQQ?͝???˛?????Ғ???VVVVVV?ӓ?SSSSSS????????Օ???ښ?pppppp??ߟ??uuuuuu?VVVVVV?wwwwww?斖?WWWWWW???YYYYYY??[[[[[[???ۛ?֖???ޞ?______??000000?ర?pppppp?ޞ?______???qqqqqq??ర??RRRRRR?rrrrrr?RRRRRR?333333?ssssss?㳳???444444?444444??????ssssss???Ⲳ?222222?RRRRRR?222222??ᑑ???PPPPPP?ߟ??^^^^^^??ܜ???^^^^^^?^^^^^^?^^^^^^???pppppp????ޞ??000000?RRRRRR?ᑑ?PPPPPP??\\\\\\?[[[[[[?ٙ?XXXXXX?ٙ??[[[[[[??ۛ?ۛ??ᱱ?ښ???ర?QQQQQQ???RRRRRR?Ξ??????SSSSSS???RRRRRR?RRRRRR?Ԕ????UUUUUU?ٙ?ٙ?Օ?????Օ???PPPPPP?TTTTTT?ZZZZZZ???PPPPPP?Ξ??͝??Ș??Ǘ????????????’?’??’??’?ח?Ĕ?Ĕ?ə?Ó??Ș?ё??ʚ?QQQQQQ?QQQQQQ???Ó?’?Ó??Ó????’?˛??Ó??????Ó??Ǘ??ə??Ǘ?Ɩ???˛???А??͝????Ғ?ర??ח?А???????TTTTTT???ӓ?Ғ?Ғ???ϟ?А??̜?ʚ??Ξ??А?ё?SSSSSS??ؘ?????QQQQQQ?Ғ?RRRRRR?ӓ???UUUUUU?SSSSSS?YYYYYY??ZZZZZZ??222222?ర?ᱱ?RRRRRR?333333?RRRRRR?rrrrrr???ZZZZZZ?ۛ???ښ???ٙ?\\\\\\??000000??000000???]]]]]]?ޞ??PPPPPP?PPPPPP?pppppp??ޞ??222222?RRRRRR??㓓?㳳?㳳???ssssss?SSSSSS?㓓?ssssss?ssssss?333333???⒒?Ⲳ?rrrrrr?222222???000000???ܜ?]]]]]]?^^^^^^????000000??^^^^^^???______?PPPPPP?ర??ర?______?ߟ?ݝ???????ٙ?ٙ???[[[[[[????]]]]]]???ۛ?֖???֖???А???QQQQQQ?TTTTTT??SSSSSS?ё?TTTTTT?ӓ??????UUUUUU?VVVVVV??????VVVVVV???ښ?ؘ??ϟ??А?ϟ?Ξ?͝????Ǘ????Ɩ?’??’?’??ϟ??Ó?????Ó???Ó????Ó???SSSSSS??Ғ?RRRRRR????ŕ??Ó??Ó???Ǘ?????????’?Ɩ??Ǘ??Ǘ??ŕ????????ϟ?Ξ??Ғ?????RRRRRR?ё?SSSSSS??ח???RRRRRR?ё??ё?ё?RRRRRR?RRRRRR?????Ξ??͝?ϟ??ӓ?А?А?QQQQQQ??RRRRRR?SSSSSS???ϟ?ё?TTTTTT??QQQQQQ?SSSSSS?Ԕ?UUUUUU?UUUUUU?TTTTTT??VVVVVV?[[[[[[????ܜ?ߟ???ߟ????______??֖?ܜ??ZZZZZZ?]]]]]]?[[[[[[??ߟ?pppppp?ߟ?ర?pppppp?ర????111111???PPPPPP?ᑑ??RRRRRR?Ⲳ???SSSSSS?333333??SSSSSS??333333??Ⲳ?⒒?rrrrrr??222222?RRRRRR???PPPPPP??PPPPPP??YYYYYY??\\\\\\?000000??????ޞ????ߟ??______???______?ݝ??ZZZZZZ?ܜ?ٙ?XXXXXX?ٙ?ښ?[[[[[[?ZZZZZZ??[[[[[[?^^^^^^?XXXXXX?????SSSSSS????А????????QQQQQQ?RRRRRR?QQQQQQ?Ғ??ӓ?ӓ?RRRRRR??WWWWWW?ؘ?????ח?????ӓ???Ξ?Ξ?Ξ?͝??ʚ?ə?ʚ?Ș??Ɩ???’??Ĕ?’??Օ??ə?ŕ?Ó???’??????????????Ɩ?ŕ??Ĕ??’????????Ó??????????Ș?Ɩ?????ʚ???˛??ϟ??????RRRRRR??Ғ???֖?ח?UUUUUU?ӓ?Ғ?PPPPPP??Ԕ??Ғ???PPPPPP?ϟ?ё???Ξ?͝??PPPPPP??PPPPPP?ё?Ғ???SSSSSS??PPPPPP?˛?SSSSSS?????Օ?TTTTTT??ٙ???ZZZZZZ??ښ?????ښ?UUUUUU???222222??Օ?ܜ?\\\\\\???ۛ??????pppppp?111111??PPPPPP?ర?ర?ᑑ?RRRRRR?______?PPPPPP?qqqqqq??ᱱ?222222?Ⲳ???rrrrrr?⒒?RRRRRR??⒒?222222??????ᑑ???ޞ???\\\\\\???______?ߟ?ޞ?ޞ?000000?ᑑ?______?^^^^^^??ݝ?______??ޞ?ޞ??^^^^^^???????ܜ?ZZZZZZ??ܜ?\\\\\\????ܜ??XXXXXX??Ғ?ё?А??̜??ϟ?ϟ?????TTTTTT?Ғ?TTTTTT?SSSSSS???TTTTTT??TTTTTT??֖?VVVVVV?????֖???YYYYYY?Ԕ?А??????ʚ???ʚ?????’????Ó?Ó?Ĕ?TTTTTT?ə?’?’??’?’?Ó????Ó??Ó?Ĕ??ŕ?Ξ?Ș?Ó?Ó???’??Ó??’?Ó?????’?Ɩ?’???Ξ??ŕ?ə??Ó????Ǘ???̜???RRRRRR??]]]]]]?UUUUUU?ϟ?Ԕ?ϟ???UUUUUU???ؘ?֖?TTTTTT???RRRRRR?RRRRRR?Ԕ?ӓ?????XXXXXX?ϟ?ʚ???͝?PPPPPP?RRRRRR?А?SSSSSS??????QQQQQQ??Ǘ?Ɩ?Ș?ϟ??UUUUUU???Օ???ZZZZZZ???]]]]]]??֖?VVVVVV?????ZZZZZZ?????ۛ?ۛ?ښ?\\\\\\??______???ర?ర?QQQQQQ?ర?000000?ߟ?______?ర??]]]]]]??111111?ᑑ?qqqqqq???rrrrrr?SSSSSS??⒒?rrrrrr?RRRRRR?RRRRRR??ᱱ??ᑑ?ᑑ??QQQQQQ??ߟ?______????PPPPPP??______??]]]]]]???______??^^^^^^?????ర??????ٙ???\\\\\\?ښ?[[[[[[?]]]]]]??ݝ?[[[[[[?ZZZZZZ?ܜ????Օ??QQQQQQ??͝?ϟ?????ё?TTTTTT?Օ?Ԕ?ӓ?ӓ?Ғ??ё?Ғ?Ԕ?Ԕ?ӓ?Ԕ???UUUUUU??WWWWWW?֖??ٙ?ٙ??Ξ???А??˛??Ș?Ș?ə?Ǘ?ŕ?ŕ??????Ó?’????????Ɩ???ŕ?Ó???Ó?Ĕ?’???Ĕ?ə?????Ĕ?????’???Ĕ????????Ǘ?ʚ?Ș?Ĕ??PPPPPP??Ǘ?Ĕ?̜???VVVVVV?Ԕ??ё??А?͝?˛??֖????֖?WWWWWW???ӓ?RRRRRR??Ғ?TTTTTT?Ғ?А???˛?˛?˛??ϟ??PPPPPP?????RRRRRR??????Ɩ????UUUUUU??UUUUUU??Ғ??YYYYYY?^^^^^^?pppppp??PPPPPP?????XXXXXX?ۛ???WWWWWW?ӓ????\\\\\\??ޞ?000000??QQQQQQ??QQQQQQ?ᑑ??ర????ర?111111????______??QQQQQQ?ᑑ?ᱱ?⒒?444444?⒒?222222?222222?⒒?????PPPPPP?PPPPPP??ߟ??______?ޞ?ޞ??000000???ݝ?ޞ??ߟ?^^^^^^?ߟ?]]]]]]?????RRRRRR?ssssss???ZZZZZZ??YYYYYY?YYYYYY???^^^^^^?ޞ??[[[[[[???[[[[[[??ח?UUUUUU?ӓ??ё?А???VVVVVV???ё??SSSSSS??Օ?TTTTTT?????ё?TTTTTT?TTTTTT??Ԕ??ښ?֖?VVVVVV?WWWWWW?VVVVVV?֖?????Ξ????̜???ə??ə?ʚ??Ɩ??ŕ?’?????????ŕ??Ó?Ǘ??ŕ??????’?Ɩ??????Ĕ?Ș?ŕ???’??’??’?’?Ó?ŕ??Ó????????Ó?Ĕ??Ɩ?Ĕ?Ɩ?ə?Ș?ʚ?Ș??Ξ?QQQQQQ????PPPPPP?UUUUUU?VVVVVV??XXXXXX?WWWWWW??ٙ???Ԕ???QQQQQQ?QQQQQQ?QQQQQQ??Ξ?͝??͝???Ξ??ϟ??ё?А???????͝?Ɩ?Ɩ?ʚ?ё?RRRRRR???????^^^^^^???ݝ?ۛ??[[[[[[?ٙ???ё?Օ?WWWWWW?PPPPPP?ӓ?????ښ?______????qqqqqq??111111??______?000000??111111??ర??\\\\\\???ర??pppppp??????pppppp??????ښ?______?ߟ?ޞ???pppppp???ޞ????ޞ???ߟ?ޞ?]]]]]]?ݝ????]]]]]]????????[[[[[[?ۛ?ݝ?????XXXXXX?VVVVVV??QQQQQQ??PPPPPP??ё??QQQQQQ??Ԕ?UUUUUU?Ғ?SSSSSS????TTTTTT?RRRRRR??Ғ???ӓ?TTTTTT?Ԕ??֖????WWWWWW??UUUUUU?Օ???А?PPPPPP?Ξ?ʚ?ə?Ș?ʚ?Ș??Ǘ?Ș?Ǘ?Ĕ????ʚ???????Ĕ???Ǘ??Ĕ????Ɩ?Ǘ?Ó??Ó?Ó?????Ó?Ó?Ĕ?Ɩ?’??Ó?’?Ó??????Ó????????Ĕ??͝?Ó?Ǘ??’????Ĕ???PPPPPP?̜?̜??˛???[[[[[[???֖?????RRRRRR??ё?А???ϟ?????Ξ?Ξ???Ξ????????????̜??????֖??^^^^^^???VVVVVV?ZZZZZZ??????UUUUUU????????ښ?ؘ??ޞ?ᱱ?QQQQQQ?QQQQQQ?RRRRRR?QQQQQQ?pppppp?000000?ޞ??pppppp?pppppp?ర?pppppp???ܜ???000000??ޞ?^^^^^^?ݝ?ޞ??????ߟ?]]]]]]????ߟ??????000000?^^^^^^?^^^^^^??______?ޞ??ޞ??000000?^^^^^^???\\\\\\?ښ?\\\\\\?ݝ?ۛ?ښ???ۛ??ۛ??ݝ??ؘ?ח?ח?ח?Ԕ??ё?ё?RRRRRR?QQQQQQ?QQQQQQ?ё?RRRRRR??Ғ????????TTTTTT??Ғ????????ח???Ԕ????ӓ?͝??˛?̜?ə?ə?ə?ə?ə?Ș??̜?Ǘ??????’?Ĕ?Ĕ?Ó??ŕ??Ó?ŕ?Ș?Ș????’?’??ŕ??’????Ǘ?Ș?????ŕ???????Ó???????????Ĕ?Ɩ?Ĕ?Ĕ?Ó????Ĕ?Ɩ??????͝?̜?Ғ?ӓ?UUUUUU??????SSSSSS?????ё??PPPPPP???Ș?͝???͝?ϟ??Ξ?RRRRRR??SSSSSS???ё?А?ϟ?ӓ?̜?˛??Ξ??ZZZZZZ??Օ?֖?ٙ?ܜ???֖???ښ?ݝ?ښ??YYYYYY?ښ??Ԕ?ؘ?TTTTTT?UUUUUU??????ర?111111?RRRRRR?qqqqqq?qqqqqq??______?]]]]]]????ޞ?______??000000?PPPPPP?pppppp???^^^^^^??ర??pppppp????ߟ???ޞ????^^^^^^??______???ߟ??ޞ?pppppp?______??ݝ??000000?ర?000000?ݝ?ܜ?\\\\\\??ښ??ޞ?ܜ??ݝ?ܜ??ۛ?????[[[[[[??ח?Օ?Ғ??RRRRRR?????ё?TTTTTT???SSSSSS?SSSSSS?RRRRRR??Ғ????????Ԕ?UUUUUU???֖?WWWWWW?ח?Օ?VVVVVV?Ԕ?Ғ??Ξ?̜?ϟ??˛??˛?QQQQQQ?Ɩ??Ǘ??PPPPPP???’?ŕ???’???’?Ɩ??Ĕ?ŕ??Ĕ?’?Ó??????Ó?????????Ǘ?Ɩ?Ó??ŕ?Ó???Ó?Ĕ??????????’??ŕ?ŕ?Ǘ?Ó???Ɩ??Ǘ?????Ξ?ӓ???ח?XXXXXX?UUUUUU?YYYYYY??ښ?ٙ?ؘ?Ԕ?ӓ?ё?ё??ё?А??ӓ?˛?ə?˛?̜???Ξ??PPPPPP?PPPPPP?ϟ?ϟ?ё???PPPPPP??PPPPPP???Ǘ???ё??????YYYYYY???VVVVVV???ZZZZZZ??ܜ?ۛ?]]]]]]???ZZZZZZ?ۛ??ٙ??[[[[[[???PPPPPP?QQQQQQ??ᱱ?ᑑ??ర??PPPPPP?????000000?111111?000000?QQQQQQ?111111??pppppp?PPPPPP?ᱱ??PPPPPP?ర????[[[[[[??^^^^^^?ޞ?ݝ?ޞ?^^^^^^?ޞ?______????pppppp???111111???PPPPPP?ర?000000?000000???\\\\\\????\\\\\\?[[[[[[?ܜ??\\\\\\??[[[[[[?[[[[[[?????֖?Ғ??Ԕ?Օ?Ғ?Ғ??SSSSSS?Ғ??Ғ????RRRRRR??SSSSSS??VVVVVV??PPPPPP??Ԕ???UUUUUU?????VVVVVV??XXXXXX?ߟ????͝???͝?ə?ʚ???PPPPPP?Ǘ???ŕ?Ɩ?Ĕ??Ó??Ó?Ó???????’?Ĕ?̜?Ĕ??ʚ?ŕ??’??Ĕ?’?Ó?’?’??Ĕ????Ș??Ǘ?ŕ?Ó????Ǘ????????Ĕ???????ŕ??ə?ŕ?Ǘ?Ǘ??Ș??˛?Ξ?TTTTTT?Ғ???TTTTTT?VVVVVV?֖?ؘ???ח??RRRRRR?Ғ??А?ё?А??͝??ʚ??͝?͝?͝?PPPPPP??А??RRRRRR???ё????ӓ???Ș????????\\\\\\?XXXXXX??֖?????[[[[[[??\\\\\\?ZZZZZZ???ᱱ?????[[[[[[?YYYYYY???QQQQQQ?111111?______?000000?????^^^^^^?000000??]]]]]]?pppppp?pppppp?pppppp?ᱱ?QQQQQQ?pppppp?111111?000000?PPPPPP?pppppp?000000?______?000000????ۛ?????ޞ?000000???????ߟ?ݝ?ޞ?qqqqqq?PPPPPP??]]]]]]?ݝ?\\\\\\?YYYYYY?ښ?ZZZZZZ?ښ??ݝ???ܜ?ޞ???[[[[[[?ZZZZZZ???YYYYYY??VVVVVV?Ԕ??ؘ??ё?ё?UUUUUU???ё??ӓ??RRRRRR???Ԕ????RRRRRR??????Օ???????ח??˛??˛???ʚ??ə?Ǘ?͝???ŕ?Ĕ??Ó?Ó????????’??Ĕ?Ĕ?Ó?’?Ó??ŕ??ŕ??TTTTTT?????????Ó?Ó?Ó?Ó?RRRRRR?????˛?ZZZZZZ???’????????Ǘ?Ĕ???Ĕ??͝??Ǘ??Ș?ʚ?̜??Ξ?Ғ?ӓ?????ٙ??YYYYYY???Օ?Ғ?PPPPPP?PPPPPP????ё???̜????̜??ϟ???ϟ????SSSSSS?ё???̜?͝???PPPPPP??TTTTTT???WWWWWW?ٙ?ח??ۛ??ۛ??????ۛ??555555??ݝ?ٙ?[[[[[[?[[[[[[???[[[[[[??ߟ?]]]]]]??______??000000?000000?ర?]]]]]]?ߟ?^^^^^^?????______?ᱱ??ᑑ??pppppp?qqqqqq?QQQQQQ??ߟ??ᱱ?pppppp?ݝ???????pppppp?ޞ?pppppp?ߟ???[[[[[[?]]]]]]???]]]]]]?ݝ?ᑑ?]]]]]]?ܜ?ۛ?ZZZZZZ?YYYYYY?ZZZZZZ??ۛ?ۛ????\\\\\\??YYYYYY???ښ?YYYYYY???Ԕ?Ԕ??Ԕ?UUUUUU?Ғ?ё??SSSSSS?Ԕ?SSSSSS?TTTTTT??TTTTTT?TTTTTT?????ۛ???Օ?Ԕ?UUUUUU?YYYYYY?ח??UUUUUU???ӓ???PPPPPP?PPPPPP???ӓ?Ș????ə?Ș??[[[[[[?͝??Ɩ?Ĕ?Ĕ?Ó????’????ŕ?Ɩ?????Ɩ?????Ĕ?ə?˛????????’?’????????ϟ?̜?Ó????????Ó??Ĕ????Ɩ?Ǘ?Ĕ???˛????????SSSSSS????ܜ?????Օ??Ғ?PPPPPP?ӓ??RRRRRR?Ξ?А???͝?͝?Ξ??͝?PPPPPP????Ξ???А?ϟ????ʚ?̜?QQQQQQ?ښ????VVVVVV?ٙ?֖?ٙ???ښ??\\\\\\?ښ?ښ??ٙ?^^^^^^?111111?444444?]]]]]]?XXXXXX????pppppp??ܜ?PPPPPP??ర??QQQQQQ?rrrrrr??\\\\\\?ܜ???ݝ?ݝ??ߟ?ܜ?000000?111111?Ⲳ??RRRRRR???000000?000000??pppppp???]]]]]]?ޞ???000000?ߟ?ޞ????\\\\\\?]]]]]]?^^^^^^?ޞ????^^^^^^????[[[[[[?ZZZZZZ?ښ?ZZZZZZ?ٙ?\\\\\\???\\\\\\?______?ZZZZZZ???YYYYYY??000000???????Ғ?UUUUUU?Ғ??SSSSSS?SSSSSS???TTTTTT?SSSSSS?Ԕ??SSSSSS???Ԕ??RRRRRR???ӓ??VVVVVV?Օ?UUUUUU?Ԕ??ӓ??????Ξ??ё?˛?ʚ?ʚ??Ș??Ԕ????ŕ?Ó??’???Ĕ?Ɩ???ŕ??Ó???ʚ?Ǘ?Ɩ??ʚ???Ĕ??ʚ??’????????????’??Ș?????????????????Ĕ?ə?????Ș?ə?͝???Ԕ??SSSSSS??ۛ?ߟ?ښ??֖????TTTTTT?͝????RRRRRR??Ξ??̜????Ξ??PPPPPP????PPPPPP?А??А??͝??̜?͝???Ξ???VVVVVV??XXXXXX?ښ???[[[[[[?ښ????ZZZZZZ???ZZZZZZ?ߟ?000000?ܜ??ᑑ??ZZZZZZ?ܜ??ݝ??????qqqqqq?______??^^^^^^?pppppp??ܜ??______?pppppp??ߟ?PPPPPP?ర?ᑑ???㓓???000000?______???ݝ?^^^^^^??ܜ?[[[[[[?ۛ??\\\\\\?^^^^^^??ݝ?^^^^^^?PPPPPP?SSSSSS??^^^^^^?????\\\\\\????ۛ??[[[[[[?????ۛ?YYYYYY???XXXXXX???Օ??TTTTTT???SSSSSS???TTTTTT?VVVVVV?UUUUUU?UUUUUU?Օ????????QQQQQQ????VVVVVV?֖?VVVVVV???Օ????А??͝?Ξ?????̜??????Ғ????Ɩ??Ǘ??ŕ????Ó???’?????ə??Ǘ??ə??Ĕ??????????Ĕ????????????????Ó?????Ó???????ŕ?Ɩ???ʚ??ӓ??SSSSSS?ӓ?֖?VVVVVV???ۛ?ܜ?ۛ?????˛?QQQQQQ?Ғ????ӓ?ϟ??͝????PPPPPP??ϟ??ϟ??QQQQQQ??PPPPPP?А?ϟ????̜??ʚ??RRRRRR???ח?????????[[[[[[??ܜ?[[[[[[?????XXXXXX?ZZZZZZ???ZZZZZZ??ߟ?pppppp?^^^^^^??ߟ?000000???QQQQQQ???000000??______?000000?ߟ?______???000000?ర???qqqqqq???\\\\\\??ۛ???????ߟ???^^^^^^?PPPPPP??000000?pppppp??ݝ???ܜ??\\\\\\??ZZZZZZ??ۛ????]]]]]]?ۛ?YYYYYY?XXXXXX?ؘ??ח??ח?VVVVVV?VVVVVV?UUUUUU??SSSSSS???ё????֖???Ԕ?ё?ё??ё?А??Ԕ?SSSSSS??WWWWWW?????֖?Ԕ?UUUUUU??RRRRRR??͝?̜?̜?ʚ?̜??????˛?QQQQQQ??QQQQQQ?????Ș????????’????ŕ??ϟ?Ș???Ξ???’???????????????ŕ?’?????????Ĕ?????’?Ĕ????’??Ó???PPPPPP???QQQQQQ?А?̜?͝?PPPPPP??ښ?ZZZZZZ??嵵?333333??^^^^^^???PPPPPP???ח???QQQQQQ?ё?Ԕ??????PPPPPP??PPPPPP???PPPPPP??QQQQQQ?͝???А?ϟ??ʚ?ʚ??????ח??______?ܜ?ZZZZZZ?ܜ??ۛ?ܜ??ݝ?]]]]]]??ۛ?000000??Օ?֖?ZZZZZZ??WWWWWW??\\\\\\??ᱱ?ᑑ?䴴?ᱱ?PPPPPP?ݝ????ᑑ?ᑑ?PPPPPP?????000000?000000?PPPPPP?111111?ᱱ???ssssss?ᑑ???______????111111?______?______????ߟ?ߟ??ߟ?______????^^^^^^???ܜ??ښ?[[[[[[?\\\\\\?ݝ?[[[[[[??ۛ?????ח?WWWWWW???YYYYYY?Օ?Ԕ????ӓ?SSSSSS??ӓ?TTTTTT?ח??TTTTTT?SSSSSS??QQQQQQ?Ғ?UUUUUU?ӓ?UUUUUU?VVVVVV?Օ?VVVVVV?ח?ؘ?ٙ??VVVVVV??????TTTTTT??˛?̜?Ξ?Ξ???QQQQQQ??̜????????Ɩ??Ĕ?’?’?????’?’??Ó?Ĕ?Ș??ʚ?˛??Ș????????ŕ??’???Ó?Ș???????????????’?PPPPPP?ё???ʚ?Ó?????ϟ?ŕ?ʚ??Ξ??͝?˛???????㳳?444444?㓓?222222????ϟ?ʚ??VVVVVV?TTTTTT?RRRRRR?Ғ?SSSSSS?ё?Ξ?͝???͝?PPPPPP?Ξ?QQQQQQ?А???PPPPPP??Ξ???̜?ϟ?ϟ?̜???͝?QQQQQQ???SSSSSS???ݝ??ۛ??]]]]]]?]]]]]]?WWWWWW?ZZZZZZ?????XXXXXX??ח?ۛ?ZZZZZZ?WWWWWW?ٙ?ښ??ᑑ?pppppp?pppppp?333333?ᱱ?PPPPPP??ޞ?^^^^^^?pppppp??000000??PPPPPP?qqqqqq??PPPPPP?????rrrrrr?333333???______?pppppp?000000??\\\\\\??______?000000??111111?qqqqqq??????^^^^^^?ݝ??______?ޞ?111111?^^^^^^?ܜ?ۛ?[[[[[[?[[[[[[?????[[[[[[?ښ??ח?WWWWWW?XXXXXX??WWWWWW??֖?VVVVVV?ӓ????????SSSSSS??VVVVVV??????Օ?TTTTTT??????ؘ?XXXXXX?ؘ??Օ?TTTTTT?WWWWWW???QQQQQQ????ё???ח??]]]]]]???Ғ?YYYYYY??Ξ?????Ĕ??????’???Ĕ?Ɩ?ə???Ɩ?Ș??ŕ??ŕ??’?Ĕ?Ǘ????Ĕ?ŕ?Ó??Ó????????ŕ?͝??Ó????Ĕ?Ĕ??????’????Ș????̜?͝?????QQQQQQ???SSSSSS??qqqqqq?ښ?ۛ????͝???????Ԕ?PPPPPP????????Ξ???Ғ?ϟ?Ξ?ϟ?А???PPPPPP??ϟ?ϟ???Ғ?SSSSSS??ӓ?ښ???ؘ?ٙ??ݝ?㓓?ᱱ?000000??111111?rrrrrr?333333?????ర?RRRRRR?ۛ???ߟ?______?^^^^^^?000000?PPPPPP?000000??ޞ?ݝ??^^^^^^?000000?ᑑ???????ర?ᑑ???ర?qqqqqq?qqqqqq?111111?000000?⒒??ߟ?ర?pppppp?111111???ᱱ??000000?______?^^^^^^?????______?^^^^^^?ޞ?^^^^^^??^^^^^^?ܜ???\\\\\\?????ٙ??YYYYYY?ܜ???TTTTTT??VVVVVV??ӓ???RRRRRR?Ԕ?SSSSSS?SSSSSS?SSSSSS???RRRRRR?Ԕ???TTTTTT?Ԕ??VVVVVV??Ԕ???֖?VVVVVV??ݝ??ӓ??А?ϟ?˛???QQQQQQ??ϟ???333333?SSSSSS?VVVVVV?XXXXXX???ʚ?ʚ??Ɩ??’????Ó?Ó?’?Ó??Ĕ?????ŕ?????Ó??ŕ?Ó????’??’?Ĕ?’???’???????????’?Ó??????????????????RRRRRR???ə?ϟ?ϟ??TTTTTT?ܜ???UUUUUU?SSSSSS??͝?ϟ??ϟ?PPPPPP??????Ξ??PPPPPP?Ғ?ё???PPPPPP?А?А?А??ϟ?ϟ??˛?PPPPPP??͝?А??͝???RRRRRR??YYYYYY??Ⲳ?]]]]]]?Օ?ښ?]]]]]]??tttttt?666666??QQQQQQ?ᑑ?______????ۛ???\\\\\\????ޞ???111111?PPPPPP????ܜ?ܜ??]]]]]]?pppppp???QQQQQQ??ర?QQQQQQ?RRRRRR?ߟ?ర?000000??QQQQQQ??QQQQQQ?pppppp?ᑑ?pppppp?pppppp?pppppp?⒒?ర??RRRRRR?rrrrrr??pppppp?qqqqqq?????ߟ??]]]]]]??ޞ??ߟ?ښ??RRRRRR?ᱱ???______????ర?YYYYYY?Օ?????????Ғ?UUUUUU?ӓ??RRRRRR??VVVVVV?WWWWWW????UUUUUU????YYYYYY??WWWWWW??VVVVVV???[[[[[[??ӓ??ؘ?????SSSSSS?PPPPPP??????QQQQQQ?333333??Օ?ӓ?˛?Ɩ?ŕ??Ó?Ó??Ó??????WWWWWW?ə?Ó?Ó?ŕ?Ĕ??Ó?ə?Ș??????ŕ?ŕ?’??Ĕ?Ș????’?’??ʚ??Ó?????ə????????????????˛?Ș?ə?͝????͝??˛?????????Ξ??ϟ?Ξ?̜?QQQQQQ?PPPPPP??͝????ϟ??ӓ??͝??UUUUUU?????͝??͝?̜??˛?ʚ??͝??ӓ?VVVVVV?Օ?WWWWWW??ܜ?ٙ?XXXXXX??ܜ??ߟ?ߟ??QQQQQQ????ۛ??ۛ?ܜ?ܜ???\\\\\\?^^^^^^?111111?ޞ??ښ???ܜ?]]]]]]?ܜ?ݝ????????PPPPPP?000000?PPPPPP?111111??rrrrrr?ᑑ?ߟ?PPPPPP??pppppp???ᱱ?pppppp????111111?ᱱ??PPPPPP???pppppp?PPPPPP???pppppp?ޞ??ۛ????\\\\\\?䔔??ᱱ????ח??[[[[[[??VVVVVV?VVVVVV?Ԕ?UUUUUU?TTTTTT????????ӓ?Ғ?ӓ?Ԕ?֖??֖??VVVVVV?VVVVVV???YYYYYY???ٙ??????QQQQQQ?PPPPPP??QQQQQQ??????˛??˛?QQQQQQ?ٙ?????ŕ??’????’??Ó?Ǘ???Ĕ?ŕ??Ɩ?Ó??Ó?????ʚ?ŕ??ŕ???ʚ??’???ŕ?????????ŕ?’???Ĕ???’?????ʚ???????Ɩ????ʚ??ʚ?А?RRRRRR??WWWWWW?????ؘ????????QQQQQQ???Ξ??Ξ?̜??˛???Ξ??͝?Ξ??̜??͝??QQQQQQ??Ξ?̜?PPPPPP?͝?ϟ??̜??ё???֖??WWWWWW?ZZZZZZ?ۛ?ߟ????ٙ?\\\\\\????SSSSSS?????QQQQQQ??ݝ?ܜ???______???ؘ??ݝ?ۛ??]]]]]]?ޞ???^^^^^^?????pppppp?ߟ?ᑑ?Ⲳ?Ⲳ?ᱱ??qqqqqq????111111??⒒??ᱱ????PPPPPP???______?Ⲳ??ߟ??\\\\\\?^^^^^^????[[[[[[?[[[[[[?ܜ??ܜ?ᱱ?ZZZZZZ??[[[[[[??ח?ח?WWWWWW???Ԕ??SSSSSS??Ғ??ё???RRRRRR?SSSSSS?????ښ???VVVVVV????Օ?Օ????ӓ?Ғ?UUUUUU?YYYYYY??ϟ?А???Ξ??ё??PPPPPP??˛?SSSSSS???˛?͝??Ɩ?Ǘ?ŕ?’??Ó??Ó??Ĕ?ŕ????ŕ????Ó?ŕ?’?Ó?????Ó??Ǘ?’?????ə??’???????͝?ə??Ǘ??Ĕ??SSSSSS??Ó?????????Ĕ??Ǘ???ə???А??֖?RRRRRR?ܜ?Օ??ӓ?Ԕ?ϟ?ё??Ғ????SSSSSS?QQQQQQ?PPPPPP?Ș?Ǘ?ə?Ξ?PPPPPP?????Ξ?Ξ?ё??̜??????Ξ????PPPPPP?͝?˛??ё??TTTTTT????ޞ??^^^^^^?\\\\\\??ZZZZZZ?ٙ?UUUUUU?RRRRRR??\\\\\\?ӓ???[[[[[[??ޞ?QQQQQQ??????______?______?[[[[[[?ܜ???ۛ?______??ޞ?^^^^^^??^^^^^^?111111?______???000000?PPPPPP?qqqqqq?ᱱ??111111?⒒?111111???000000?ޞ????pppppp???ޞ??]]]]]]???^^^^^^?PPPPPP?\\\\\\???[[[[[[????]]]]]]??ٙ???ٙ?YYYYYY????֖?Ԕ?Օ?Ғ??ӓ??Ғ?ӓ???Ԕ?ӓ?RRRRRR?Ғ?SSSSSS???VVVVVV?WWWWWW???XXXXXX?֖?ח??VVVVVV?VVVVVV?֖?UUUUUU?ӓ??RRRRRR???PPPPPP?Ξ???ϟ?ӓ????QQQQQQ???ϟ?͝?Ǘ?ʚ??ϟ???ŕ?’???Ó??Ǘ????’?ŕ?Ó?Ó?Ó????Ĕ???’??????Ԕ?̜?Ó?ŕ??Ǘ???Ǘ???’??????ʚ????䴴?А?????????ə?PPPPPP?Ș??Ș?ə??̜?Ξ?Օ????ޞ???VVVVVV?Ғ?TTTTTT???QQQQQQ????QQQQQQ?SSSSSS?Օ?͝?͝???̜?ϟ??Ξ??̜??QQQQQQ???̜???ё?Ғ??̜?А??̜?˛?̜?Ξ?QQQQQQ??VVVVVV?]]]]]]?ߟ?]]]]]]??ZZZZZZ??[[[[[[?ܜ?ߟ???SSSSSS??֖?TTTTTT?QQQQQQ??ח?ᑑ????XXXXXX?YYYYYY?[[[[[[?[[[[[[????ߟ??ݝ??ߟ??______?______??ޞ??000000?111111?????000000?pppppp??______?______?ߟ?]]]]]]?ݝ??[[[[[[?ۛ??\\\\\\?]]]]]]??ߟ??\\\\\\?[[[[[[?111111?ర?ݝ?ښ?????ۛ??\\\\\\?\\\\\\?ޞ?ۛ?ٙ?WWWWWW?ٙ???ӓ??UUUUUU????ё?SSSSSS?Ԕ?ӓ?[[[[[[?UUUUUU???Ғ???UUUUUU??WWWWWW??XXXXXX????ח?ח???UUUUUU??Օ?Ғ??PPPPPP?А?Ξ?̜?˛??͝???ϟ?????ϟ?˛?Ǘ?Ǘ??Ɩ?????’??Ɩ???Ó?Ĕ?Ĕ??Ĕ?Ó????’?’?Ĕ????Ĕ?’?Ĕ????Ɩ?Ǘ??ŕ?̜?ŕ??????Ĕ?Ó???Ó?????ё???????????͝?Ǘ?Ǘ?Ǘ???͝?SSSSSS?QQQQQQ?RRRRRR??Ғ?^^^^^^?֖??RRRRRR?RRRRRR?ӓ?TTTTTT?֖?֖??Ԕ?QQQQQQ????Ξ?̜??˛???????̜??̜???̜?ϟ??Ԕ???ϟ?PPPPPP??Ξ?̜?͝??ӓ???䔔??ݝ?ޞ?ؘ??ܜ????Օ????ϟ?RRRRRR????ߟ?WWWWWW??ښ?ZZZZZZ??ZZZZZZ?]]]]]]??222222?ܜ?ۛ???QQQQQQ????Ⲳ???222222??______??PPPPPP?______??ޞ????]]]]]]?^^^^^^?ܜ????ښ?ݝ?______??????ర?[[[[[[?[[[[[[???ٙ??????????VVVVVV?VVVVVV?Ғ??PPPPPP?????Ғ?SSSSSS??ӓ?Օ???SSSSSS??RRRRRR??Ԕ?VVVVVV????????Օ??֖?UUUUUU????????˛?̜????ϟ??ə?Ξ??Ғ???ŕ????Ó????Ó??ŕ??Ó?Ĕ???????’????’???˛??Ó???˛?Ɩ??Ɩ?Ó??ʚ?????Ș??Ó??????????????????Ǘ?????Ɩ??Ԕ??Ξ??PPPPPP?QQQQQQ??RRRRRR?ӓ??Ғ?ё?Օ?Ԕ???ё?PPPPPP?Ξ?͝??А??Ɩ?ə??А?ϟ??UUUUUU?А??˛?͝?˛??˛??ϟ?̜?͝????Ξ??Ξ?Ғ??PPPPPP??ӓ????\\\\\\?Օ???\\\\\\?ݝ?ݝ??ۛ???ӓ?XXXXXX???VVVVVV??YYYYYY?\\\\\\?[[[[[[??ח?????]]]]]]????______??ܜ??^^^^^^????111111???PPPPPP?ᱱ?ߟ??^^^^^^?ݝ?^^^^^^?______?ܜ????ZZZZZZ????????[[[[[[???????XXXXXX?ח?֖????UUUUUU?Ԕ???ח?Ԕ?ӓ?RRRRRR??RRRRRR????А????Ԕ??UUUUUU?Ԕ??UUUUUU???VVVVVV????֖????UUUUUU????RRRRRR??ё?QQQQQQ??ϟ????˛???Ξ?͝???YYYYYY?̜?ؘ?Ĕ?ŕ?ŕ????ŕ??Ó?????Ĕ?’?ŕ?ŕ?Ĕ????’?Ó??ŕ????ϟ???Ó??’?˛?ə?ə??’?Ș????????????????????????????͝?ŕ?Ɩ?Ɩ?˛???͝?А??А??Ғ??Ғ?RRRRRR?UUUUUU?SSSSSS??Օ?RRRRRR???RRRRRR?А??Ș??ʚ??PPPPPP??͝??Ξ???Ξ??ϟ?????ʚ?ʚ?????Ξ????ϟ??ӓ?ర??ח?TTTTTT?֖??ۛ??????PPPPPP?ӓ??֖?֖?????ؘ?ۛ?????ח?\\\\\\?\\\\\\?ܜ?ݝ?^^^^^^?000000??ర??000000????????ᑑ???ߟ?ۛ?[[[[[[?\\\\\\???ښ??ښ?[[[[[[??????XXXXXX?ؘ??ۛ?ٙ?WWWWWW???֖????WWWWWW?VVVVVV?XXXXXX???ӓ????SSSSSS??Ғ?ё??QQQQQQ????UUUUUU?֖??XXXXXX??VVVVVV?VVVVVV?WWWWWW????XXXXXX??ؘ?ZZZZZZ??Ԕ?????QQQQQQ?ϟ?Ξ??ϟ?͝??Ξ?̜??ϟ?ϟ?А?Ș????Ĕ??Ɩ??Ξ?Ɩ???Ǘ??Ĕ?ŕ?ŕ?Ó?Ĕ????Ó?????’??˛?Ó??’???????’??Ĕ?Ș?Ɩ?Ǘ??Ó??????????????͝?????????????Ĕ?ŕ?Ĕ??ə??PPPPPP??Օ?PPPPPP?RRRRRR????RRRRRR?RRRRRR??TTTTTT??ӓ??֖?QQQQQQ?RRRRRR???Ɩ?Ș???˛???˛?˛?˛?̜?͝???̜?̜?ʚ???͝?????Ξ?̜?͝???SSSSSS?[[[[[[?YYYYYY?Օ????[[[[[[?[[[[[[?ܜ?PPPPPP?[[[[[[?RRRRRR?PPPPPP?ݝ?ؘ?ښ?WWWWWW??YYYYYY?]]]]]]???YYYYYY???ϟ?Ԕ?Օ??ZZZZZZ???]]]]]]??ݝ?______???ޞ?ݝ???ర??\\\\\\????ښ?ښ???ZZZZZZ?YYYYYY?[[[[[[??ښ??[[[[[[?]]]]]]????ۛ??ۛ?WWWWWW??YYYYYY?ܜ???TTTTTT?Օ??????SSSSSS??ӓ?Ԕ??SSSSSS?TTTTTT??Օ??SSSSSS?RRRRRR?ӓ??Ԕ?ӓ????ؘ???????WWWWWW?֖?֖?Օ?YYYYYY??ӓ?PPPPPP???͝?PPPPPP??Ξ?̜?ϟ??PPPPPP??ʚ??˛?Ș?Ș???????ŕ?Ĕ?ŕ?Ĕ??Ɩ??ə??Ĕ?Ó??˛????Ó??Ó????Ǘ??Ș??????Ĕ?Ó???Ó??͝?’???????Ĕ?ə????????????????????Ĕ??Ξ????˛?ʚ??ə???PPPPPP?RRRRRR????TTTTTT??ZZZZZZ??^^^^^^?ߟ?000000?ё?Ĕ???Ǘ??ʚ?ё?Ξ?ə??̜???̜?Ξ??QQQQQQ???̜?͝?˛???Ξ??????RRRRRR??Ғ????XXXXXX?ۛ??????????ZZZZZZ????000000??????ё??Ԕ??ZZZZZZ?qqqqqq????[[[[[[?]]]]]]??^^^^^^?]]]]]]?^^^^^^????ؘ???[[[[[[?______????ٙ?XXXXXX?ٙ?ח??ؘ???QQQQQQ?ޞ??ښ??______?ؘ???VVVVVV??֖??TTTTTT????VVVVVV?TTTTTT?UUUUUU?SSSSSS????ח?Օ????Ԕ???ӓ?ؘ???WWWWWW?֖?WWWWWW?XXXXXX???WWWWWW?ח?XXXXXX?WWWWWW?WWWWWW?Օ?Օ??Օ?TTTTTT?А??ё?˛?ʚ?Ξ?????͝???Ǘ?????Ĕ??Ĕ????Ĕ?Ɩ?Ĕ?Ĕ?Ǘ?Ó??ʚ??Ĕ?????????????????????’??Ó?’?????’????????????SSSSSS?????????????????Ɩ??ё??ʚ??Ș??ϟ??А??????ߟ?[[[[[[?ח???Օ?ə??Ĕ??Ɩ???Ξ?͝??ə?˛??̜????˛?ə???ʚ??PPPPPP??͝???͝?QQQQQQ???ח?TTTTTT??WWWWWW??ٙ?ܜ?ޞ?[[[[[[?[[[[[[?ؘ?ח?ח?______?ޞ??ٙ?ٙ??????ח?֖?RRRRRR?А?SSSSSS?ח??ښ?֖??^^^^^^???^^^^^^??\\\\\\?ޞ???[[[[[[?YYYYYY??000000?[[[[[[?ٙ?ZZZZZZ?ZZZZZZ?ٙ??WWWWWW????VVVVVV??pppppp?ؘ?ח?UUUUUU????ؘ??VVVVVV?Օ?Օ?Օ??VVVVVV????ZZZZZZ?YYYYYY??UUUUUU?Ԕ??֖?֖?????UUUUUU?SSSSSS?Ғ?Ғ?ӓ?TTTTTT?[[[[[[?ח???ZZZZZZ?ח??ח??XXXXXX?WWWWWW?UUUUUU????RRRRRR???????ϟ????̜?̜?Ǘ??Ǘ?Ș?Ș?ə?Ș??Ș?Ș?Ǘ?ŕ?ʚ?Ó?ŕ??????ۛ??????’??’??’????????????˛?TTTTTT???Ɩ????Ó????????????Ó?QQQQQQ???????????????????̜?ϟ???˛??ϟ?ܜ?????ߟ?ޞ??XXXXXX?XXXXXX?XXXXXX?ؘ???Ș?Ɩ??Ó??̜????˛?????Ξ??͝?˛???ʚ?˛???ʚ?????RRRRRR???ӓ?Ғ??WWWWWW?ח????ۛ?ZZZZZZ?VVVVVV?Ԕ??TTTTTT?[[[[[[?????YYYYYY??XXXXXX??֖?֖???WWWWWW??VVVVVV?UUUUUU??ܜ??ٙ??ZZZZZZ??ۛ??^^^^^^?ۛ?ښ?ٙ??[[[[[[?ZZZZZZ?\\\\\\??ܜ???Օ??????TTTTTT?SSSSSS??WWWWWW?ٙ?Օ??֖?SSSSSS?ӓ??Ԕ??Ԕ?TTTTTT??TTTTTT???XXXXXX?VVVVVV?VVVVVV?VVVVVV?֖?UUUUUU?UUUUUU?????Ԕ??SSSSSS?TTTTTT???֖?WWWWWW??YYYYYY?ښ?WWWWWW???ؘ???RRRRRR??QQQQQQ??RRRRRR?ʚ?ə?˛?ʚ?ə???Ξ???ϟ??ə?ə????ə????ŕ???Ĕ?Ó??ŕ???ŕ?Ɩ???̜?ŕ???Ĕ??’????????????Ĕ?ϟ??Ĕ??Ó??Ș??Ó???????????????????????????????Ș?Ș??ʚ???̜?Ξ????Ғ?TTTTTT????Օ?ؘ??????ʚ??Ɩ?????ʚ???˛??̜??????????͝?????Ξ??SSSSSS?TTTTTT?TTTTTT???????ښ?ZZZZZZ????UUUUUU????YYYYYY?ח?ޞ?֖??ښ??ZZZZZZ???ښ?ח?VVVVVV?Ԕ????ܜ?ٙ??ۛ??WWWWWW?XXXXXX??[[[[[[??ٙ?ښ?ښ?ښ?pppppp?666666?ښ????֖?Օ?Ԕ??ӓ?TTTTTT???^^^^^^?VVVVVV???ӓ?SSSSSS?RRRRRR?֖?Ԕ????UUUUUU??UUUUUU?UUUUUU?????????SSSSSS??RRRRRR?Ғ?QQQQQQ??Ԕ???VVVVVV????ZZZZZZ?XXXXXX?WWWWWW?֖??Օ?ӓ?ё?PPPPPP?А???˛????ə??ϟ?ϟ????˛?˛??Ș?Ǘ?ŕ???Ș?ʚ?Ɩ??Ó?Ĕ?Ĕ?Ĕ?Ĕ?Ĕ?’??Ó???ё????Ó?Ó??’????????ŕ?Ó???ӓ?Ĕ??’??Ɩ?ʚ?Ĕ?ŕ??????????????????????????????ŕ??ŕ?Ș???ϟ?Ғ??ϟ??VVVVVV??????ٙ?VVVVVV?Օ??VVVVVV??̜?Ɩ??Ĕ?Ɩ?ŕ???ʚ?͝????˛?̜?ə????˛?????PPPPPP?˛??˛???Ғ?Օ?UUUUUU???RRRRRR?֖???ښ???XXXXXX???XXXXXX?VVVVVV???ٙ?ח??Ԕ??Օ?ח?ؘ????WWWWWW??RRRRRR???Օ???WWWWWW?ٙ?WWWWWW?ؘ??ٙ?????ښ?^^^^^^?PPPPPP?]]]]]]?\\\\\\?XXXXXX?ؘ??ח?VVVVVV??TTTTTT???UUUUUU???WWWWWW?ӓ??????VVVVVV?֖?֖???YYYYYY?WWWWWW?YYYYYY??ח?ٙ?WWWWWW?VVVVVV???UUUUUU?Օ?Օ??VVVVVV?TTTTTT???ח??ؘ?YYYYYY??ښ????TTTTTT???А?PPPPPP?ϟ?̜?PPPPPP?Ξ??˛??????̜??͝??QQQQQQ?ʚ?ʚ?ə?ŕ??Ǘ???ŕ?Ĕ??Ɩ?ə??????Ó???Ó?’?Ĕ??Ó??????????Ĕ??ŕ????ŕ??’?Ĕ?Ξ?Ó?Ó???????????????????????????????Ó?ŕ???ə??͝?RRRRRR?Ғ????TTTTTT?QQQQQQ??TTTTTT?ٙ????А?А?RRRRRR?А????ʚ?Ǘ?Ǘ?????Ǘ?ə??????ʚ?ʚ?ʚ??PPPPPP???ə??Ξ?ϟ??RRRRRR????????XXXXXX?YYYYYY?YYYYYY????WWWWWW??XXXXXX?WWWWWW???XXXXXX?ٙ??ח??[[[[[[?ۛ????UUUUUU??ё????Օ?Օ?WWWWWW??VVVVVV?XXXXXX?֖?YYYYYY??WWWWWW???ޞ??^^^^^^?______???????UUUUUU???VVVVVV??Ԕ?TTTTTT?TTTTTT?SSSSSS?ӓ?ח?UUUUUU?Օ??Ԕ??֖??????ؘ???????UUUUUU?Օ???XXXXXX??Ԕ??ZZZZZZ??֖?֖??ח?XXXXXX?TTTTTT??RRRRRR???PPPPPP?Ξ?͝??SSSSSS?Ξ?????ʚ??PPPPPP??ё?????ə??Ɩ?Ĕ?Ó??Ĕ?Ó?Ɩ????Ĕ???’??????????’??????????Ɩ?ŕ??’?Ó??ŕ?ŕ?ŕ?Ĕ??Ĕ???????????????????????Ĕ??????????ŕ?Ɩ??ё?͝???PPPPPP??Ԕ?RRRRRR??Ғ?ӓ?TTTTTT????PPPPPP???PPPPPP?PPPPPP?Ξ?̜??ə?TTTTTT?ə???˛?ə?????˛???Ș?ə??͝?͝??Ξ??PPPPPP?А?PPPPPP?RRRRRR?Ғ??RRRRRR????\\\\\\?ZZZZZZ???ٙ?ؘ???ח?VVVVVV??ח?VVVVVV?[[[[[[???ٙ?YYYYYY??______??Ғ?[[[[[[??]]]]]]?͝?Ғ??UUUUUU??֖???ח?VVVVVV?ח??XXXXXX???ZZZZZZ?______?\\\\\\????ؘ?WWWWWW?ӓ?TTTTTT??Օ?RRRRRR??ٙ??Օ?TTTTTT?Ғ??Ԕ?֖?ؘ??WWWWWW???ח???XXXXXX??ؘ???WWWWWW?VVVVVV??ܜ??????ZZZZZZ???YYYYYY?YYYYYY?֖??֖??ӓ????RRRRRR??А???ə?ʚ?ə???˛????Ș?͝????̜?PPPPPP??ə???Ǘ?Ɩ??Ĕ?ŕ??’??Ĕ???Ó???????’?’???Ó??Ɩ???????ŕ?̜?Ș?ϟ????Ș??????????Ĕ??Ó???Ǘ???????????????????Ó?Ĕ?????PPPPPP??ӓ?̜???Ғ?ӓ?Օ???Օ???֖??SSSSSS?Ғ??Ғ?PPPPPP?ё?????’??Ș?Ș?Ș?Ǘ??Ǘ????Ș?˛????̜???Ғ???ё?А?Օ??ё??ϟ?Ғ?ؘ?????YYYYYY??ٙ???ӓ?TTTTTT???[[[[[[??ZZZZZZ?ۛ?ښ?ח?UUUUUU?WWWWWW??ZZZZZZ???SSSSSS???ۛ?VVVVVV?SSSSSS??ZZZZZZ?֖??ח?YYYYYY?ؘ?ٙ?ؘ?ܜ?ۛ?^^^^^^??ؘ?ٙ?Օ??Ԕ???ӓ?______????UUUUUU????VVVVVV?ٙ?YYYYYY???YYYYYY???ח?ٙ??ZZZZZZ?ؘ??????ٙ???\\\\\\?YYYYYY???YYYYYY???XXXXXX?WWWWWW?Օ?TTTTTT?RRRRRR?????Ԕ?ӓ???˛??ʚ?Ǘ??Ξ?????????Ξ??˛???Ǘ???Ó?Ĕ?Ĕ?Ó?Ĕ?Ș???Ĕ??????’???Ó?Ĕ??’??’?Ĕ???????PPPPPP?͝??ŕ?˛?Ó??ʚ?Ó????Ó?’?????ə??????????????????????ŕ?’?Ó??ə?PPPPPP??ə???RRRRRR??ϟ?Օ?ё?А??Ғ??Օ?SSSSSS????ё??ӓ?ϟ??͝??˛????Ǘ?ʚ?????Ɩ?Ǘ?ʚ?Ș?ə?ə??˛???ʚ?А?ӓ?А?RRRRRR????TTTTTT?????ؘ?VVVVVV?ZZZZZZ???ܜ??֖??UUUUUU?SSSSSS?[[[[[[?ZZZZZZ?[[[[[[???ޞ?000000??ښ?UUUUUU??TTTTTT?֖???VVVVVV??RRRRRR?ё??ؘ??Ԕ???Ԕ?ӓ?ח?WWWWWW?XXXXXX?ښ?______?ߟ?ؘ?VVVVVV?UUUUUU?VVVVVV?UUUUUU????????ח?ח?VVVVVV????qqqqqq????ؘ??XXXXXX?ٙ?ٙ???XXXXXX?ؘ???ؘ??YYYYYY??YYYYYY?ٙ?ZZZZZZ?ۛ??ZZZZZZ????QQQQQQ?????UUUUUU?Ԕ?ӓ?QQQQQQ??ʚ??Ș????А?????̜??˛??Ș?ə??ə??Ɩ?ŕ??Ĕ?Ó??Ó??Ó??Ó?Ĕ?Ĕ??Ɩ????Ǘ???’???’???????Ɩ????Ó??Ɩ??ؘ?ŕ????Ó??????ӓ????????????????????????’??ŕ?Ǘ??ϟ?А?Ξ?ϟ??ϟ????ё?ޞ?Ғ???Ғ?Ԕ???VVVVVV????̜?А?ʚ?ə???Ĕ???Ɩ?Ǘ??Ǘ???Ș?˛?͝?ə?ə????ə?˛?͝??ё??SSSSSS?RRRRRR????TTTTTT??UUUUUU???ZZZZZZ?ٙ??UUUUUU?UUUUUU?А?͝?Օ???YYYYYY?PPPPPP??????UUUUUU?VVVVVV?WWWWWW??Օ????ё?Ԕ?֖?֖???VVVVVV???SSSSSS??֖?UUUUUU??YYYYYY?ٙ????VVVVVV?֖?WWWWWW?UUUUUU????VVVVVV??VVVVVV???ח?????ח??ח??ؘ??YYYYYY?YYYYYY?ח??????ZZZZZZ?ZZZZZZ???[[[[[[??ZZZZZZ??ؘ??VVVVVV??SSSSSS??SSSSSS?ё??Օ??Ғ????ə???ə??͝?ʚ??Ɩ?͝?͝?̜?˛?ə??˛?Ɩ??ŕ?Ɩ???ŕ????’????’??Ó?Ó??Ĕ??Ó?Ó???????????’???Ĕ????Ĕ??’??????????Ó???Ĕ???????????????????’???Ó?????????QQQQQQ?QQQQQQ?ӓ????Ԕ?PPPPPP???ӓ??ё??А?ϟ??͝?̜?SSSSSS?Ș?Ǘ????Ș??Ɩ??ə???ʚ?ʚ???ə?ʚ?ʚ?ə??ʚ??А?PPPPPP???ח?Ξ???SSSSSS??ח?YYYYYY?VVVVVV????Ғ??Ԕ??????ܜ??ݝ??PPPPPP??XXXXXX?ؘ?ٙ?֖?Ԕ?ӓ?ӓ?pppppp?ё?SSSSSS??WWWWWW?UUUUUU????????UUUUUU????ٙ?VVVVVV??VVVVVV????VVVVVV???ؘ?ؘ?ח??YYYYYY?WWWWWW??֖????֖?WWWWWW?XXXXXX?ؘ??XXXXXX?ښ?????ښ?ܜ?ۛ?\\\\\\???ٙ?ښ?ܜ??WWWWWW?XXXXXX?VVVVVV??????ё?SSSSSS?????ʚ??͝?????ʚ??Ș??̜???ʚ??Ș?Ș?Ǘ????Ɩ?Ș?Ĕ??Ĕ??????Ó?Ó???Ó??’???’?????Ĕ???’?Ɩ?Ș???ŕ???Ó?Ó??ӓ?ϟ?????????????????????????????????????͝????PPPPPP?ӓ?UUUUUU??SSSSSS???XXXXXX?Ғ???RRRRRR?ё?Ԕ?Ғ??͝?̜?͝?͝???ʚ?А???Ó?Ĕ?Ĕ??ə?˛?????˛?????ə???А?ϟ??QQQQQQ??QQQQQQ?˛??PPPPPP???VVVVVV?Ԕ??Ғ??WWWWWW?Օ???ё?Օ?ۛ?YYYYYY??ؘ???ؘ?VVVVVV????֖????TTTTTT?RRRRRR??ϟ??ӓ?UUUUUU?XXXXXX?VVVVVV?ؘ??VVVVVV??ӓ??֖?Ԕ??WWWWWW??ח?WWWWWW?WWWWWW?VVVVVV?WWWWWW?֖?ؘ?????VVVVVV?VVVVVV??֖?ח????XXXXXX?ٙ?YYYYYY?֖??YYYYYY?YYYYYY?ؘ??ܜ?ٙ?ښ??????ٙ??????TTTTTT?Ԕ???Ғ?ё??Օ??͝???̜??PPPPPP?ə?ʚ??̜??ə??̜?̜?PPPPPP?˛?ʚ????Օ???˛?Ғ?ŕ??Ó??’??Ĕ???’??????Ó??????’??Ș??Ó???????Ǘ??????????Ó???????????????????????????????ʚ?Ξ?А?̜??А?SSSSSS???ё???Ғ?RRRRRR?RRRRRR?QQQQQQ??ё??QQQQQQ?PPPPPP??ϟ?ϟ???̜?ؘ??Ĕ?’??Ĕ????Ǘ?ʚ?ə?ə??А?SSSSSS???Ξ?̜???Ξ?PPPPPP??QQQQQQ?̜???͝?????RRRRRR?RRRRRR??Օ?ښ?VVVVVV??ښ?RRRRRR?VVVVVV?TTTTTT????VVVVVV?Օ?RRRRRR??ӓ??WWWWWW??????Օ??ё????YYYYYY??ܜ?⒒??ח??XXXXXX??֖?֖?????ښ?֖????ؘ??XXXXXX?WWWWWW????ח?UUUUUU??????ח??\\\\\\?\\\\\\??ؘ???ܜ?\\\\\\?ښ?XXXXXX???ؘ??XXXXXX?______??ח?Օ??????Ԕ?ZZZZZZ?ϟ????͝?Ξ??ϟ??͝?̜??̜?ʚ????ё?͝?ʚ?̜?ʚ????????ŕ???’??Ș??Ó?’?’?’?Ĕ?ښ???Ó??’???’?Ó?Ș??Ĕ?’????’??’?Ɩ??Ǘ????ə???????????????????????????????Ĕ?Ĕ??Ș????????RRRRRR???Ԕ?TTTTTT??RRRRRR?QQQQQQ?Ԕ?Ξ?͝?PPPPPP??QQQQQQ?Ξ??Ș??А???Ș?Ó?’???Ǘ?Ǘ?Ș?Ǘ??ʚ??ʚ?˛?????ə????Ξ?Ξ?̜???ӓ???Ξ??ϟ??QQQQQQ????Ԕ?ޞ?Օ?YYYYYY?֖???WWWWWW??ؘ?Ԕ?SSSSSS?SSSSSS?TTTTTT??ח?Օ?Ԕ??VVVVVV??VVVVVV?֖???UUUUUU?WWWWWW?ݝ??ݝ????VVVVVV???ؘ??UUUUUU???????ٙ??ښ?[[[[[[?ؘ???ח??ZZZZZZ???ZZZZZZ?YYYYYY????[[[[[[??ښ?YYYYYY?^^^^^^?????ؘ??VVVVVV??ؘ?VVVVVV????\\\\\\?UUUUUU????Օ?UUUUUU?Ғ????XXXXXX??͝?̜?͝???????͝?Ξ?ё???Ξ?͝?Ɩ?ŕ??Ș?Ș?ŕ?Ɩ????????????’?’??Ó?Ĕ?’???’?????Ó???ŕ?’?’??????????????????????ŕ??????????????????Ĕ???Ĕ??̜???SSSSSS???Ș??RRRRRR???Ғ??Ғ?ϟ???PPPPPP???Ξ?͝?Ξ??͝?SSSSSS??ŕ?ŕ?ŕ??ŕ????????ʚ??̜???Ș??̜???[[[[[[???Ғ???А???̜?Ξ??А????Ԕ?ӓ??VVVVVV???WWWWWW???VVVVVV???ח???ښ??Օ??SSSSSS??ӓ??Օ??XXXXXX?ښ?Ⲳ??PPPPPP?^^^^^^??????YYYYYY??XXXXXX?WWWWWW???ؘ????XXXXXX?ٙ???ښ?YYYYYY?ؘ?XXXXXX?Օ?ؘ??ח??[[[[[[?ZZZZZZ??ؘ?ח?WWWWWW???ח?ؘ???????WWWWWW?֖?֖?ӓ??ӓ??ӓ?RRRRRR?Ԕ?SSSSSS?Օ?ӓ???QQQQQQ???ٙ???Ξ?QQQQQQ?PPPPPP??˛?????ӓ?Ξ?ё???Ǘ?Ș????ə??Ɩ?Ó??Ó?Ó???Ó?’??????’?Ĕ?ʚ?ŕ????Ó??’??Ó????’??????????????????????????????????????????Ó?Ĕ?Ǘ??˛?PPPPPP?͝??ə?ə?˛?QQQQQQ?RRRRRR?Ғ?ё?Ғ?QQQQQQ??PPPPPP?PPPPPP??Ξ?ϟ?PPPPPP?????RRRRRR???Ɩ?Ĕ?Ĕ?Ɩ?ŕ???Ɩ??Ɩ???????ŕ?ʚ?Ξ?ʚ??ʚ???ё?ӓ?͝???ϟ?Ξ?͝?͝??Ғ?Ғ?????YYYYYY?֖?֖?֖?Ԕ???Օ?YYYYYY?WWWWWW??ܜ??????VVVVVV?ӓ?TTTTTT??SSSSSS?֖?ӓ?YYYYYY?pppppp?⒒?111111??ܜ?ᱱ??ٙ?ٙ??XXXXXX??YYYYYY?ח?֖??????????ښ???֖?WWWWWW?ٙ??[[[[[[?ٙ?ݝ?XXXXXX?WWWWWW?YYYYYY?????WWWWWW??ח?Օ??Ԕ?ӓ?Ғ????Ғ??QQQQQQ?QQQQQQ?ё?RRRRRR??QQQQQQ???ښ?֖???????̜?͝??Ξ??̜?̜???Ș?Ɩ?Ĕ?????ŕ?Ɩ??Ș??Ĕ???’?????????’????’???Ĕ???Ó???????????ŕ??????????ə?????ʚ?????????????????????’??ŕ???ʚ????͝??QQQQQQ??SSSSSS?SSSSSS?QQQQQQ?ϟ?TTTTTT?PPPPPP?ё??ϟ??Ξ??͝?̜?Ξ???Ș????????ŕ?Ĕ?Ĕ??Ǘ?????Ɩ?Ǘ??????PPPPPP??ʚ?͝?Ғ??QQQQQQ?QQQQQQ?Ξ???˛?͝?Ԕ??Ғ?UUUUUU?WWWWWW?֖?WWWWWW?WWWWWW?VVVVVV?Ԕ???Ԕ?֖???pppppp?\\\\\\?ؘ???YYYYYY?WWWWWW???[[[[[[??????111111???ర???֖??ؘ?\\\\\\?WWWWWW?[[[[[[?ZZZZZZ????YYYYYY????ښ?ޞ?ZZZZZZ?֖??ݝ??ؘ????]]]]]]??ח?WWWWWW???Օ?????ӓ????Ғ???????А??А??ϟ??ё??SSSSSS???嵵??RRRRRR?А????̜?ə?˛?ʚ??͝???Ǘ??ə????Ɩ??Ɩ????????????’?Ĕ?Ĕ???Ĕ?ʚ?Ĕ???????Ó??????????̜??????????????????????????????????’?Ó??Ĕ?????Ғ?ϟ?Ξ?Ξ??RRRRRR?ё??????RRRRRR???Ξ??PPPPPP?̜?˛??ʚ?ə??͝??Ɩ?Ĕ??Ó??Ĕ??ŕ?Ɩ?Ǘ??Ǘ?ə??????ə??????RRRRRR????PPPPPP??Ξ?А?ʚ?QQQQQQ?Ԕ?SSSSSS?TTTTTT?SSSSSS?Օ?UUUUUU?ח??ؘ?TTTTTT????VVVVVV?????ח?ח?TTTTTT?VVVVVV??Օ?ח???YYYYYY???WWWWWW?YYYYYY?ٙ?]]]]]]?ښ?ٙ??ZZZZZZ?ᑑ?ښ?ߟ?ޞ??ښ?ؘ?֖???֖?????YYYYYY??֖???ޞ??ٙ?ߟ????TTTTTT???SSSSSS?Ԕ??UUUUUU???ё?Ԕ??RRRRRR??Ғ??QQQQQQ??TTTTTT?ё??QQQQQQ?ё??͝????QQQQQQ?ޞ?ᱱ?Օ?RRRRRR?PPPPPP?ϟ??̜?̜???˛???ϟ?Ǘ?˛?Ș?ŕ?Ǘ??RRRRRR?Ĕ????????????????????????Ó??Ó????????????̜????????????????????????????????????ŕ?Ɩ?????PPPPPP?RRRRRR???ϟ???А??QQQQQQ????PPPPPP?PPPPPP??А???Ξ?ё???ё?ə?Ǘ?ʚ?А??Ó?ŕ???Ɩ??Ɩ?ə??Ș???ŕ????PPPPPP??А?Ξ????͝?ё????А?Ғ?QQQQQQ??ё??QQQQQQ?Ԕ???Ԕ?????TTTTTT??WWWWWW??ؘ????TTTTTT?Օ??UUUUUU?ؘ?UUUUUU?ח?ח?XXXXXX?ښ???ؘ?UUUUUU??ܜ?______?ߟ?ښ?ӓ??TTTTTT?QQQQQQ??ӓ??UUUUUU???ח??֖?WWWWWW?ח?Օ?Օ?Օ?ؘ??֖??ؘ?֖?VVVVVV?VVVVVV??TTTTTT?RRRRRR??Ғ???Ғ????Ғ?QQQQQQ????Ξ?PPPPPP??QQQQQQ?RRRRRR?UUUUUU?ӓ?Ғ?PPPPPP?????ӓ?Օ?Ғ?ϟ?ё?????Ξ?͝??ZZZZZZ??PPPPPP?ʚ???RRRRRR??ŕ?ŕ??’?’????’?Ĕ????????Ĕ??Ǘ???Ɩ?Ĕ?Ĕ?????Ĕ????’?’??’???????????????????????????????????????????Ǘ??̜?Ξ????ё????PPPPPP?QQQQQQ?TTTTTT??Ғ??ϟ??QQQQQQ??ϟ??̜???͝??ə?ϟ???ϟ?Ǘ?Ɩ???Ĕ???Ĕ???ə?????˛?̜?????PPPPPP???ё?PPPPPP??????̜?RRRRRR?ё??Ғ??ё?????ё??UUUUUU????Օ?UUUUUU??ӓ?ӓ?Ԕ?UUUUUU?TTTTTT?UUUUUU?????ٙ?Օ???^^^^^^?QQQQQQ??\\\\\\?VVVVVV?RRRRRR???ӓ?TTTTTT???UUUUUU????UUUUUU?Օ?ZZZZZZ??VVVVVV?Օ?ח?XXXXXX??UUUUUU?Ԕ?????А?RRRRRR?Ғ???PPPPPP?А?QQQQQQ?ё???PPPPPP?QQQQQQ?Ғ?˛??SSSSSS????ӓ?ё??PPPPPP?ё??А?PPPPPP??А?QQQQQQ????̜??ϟ??˛?ϟ?ܜ???̜????Ɩ??Ǘ?ŕ??Ó?????͝?ŕ??????Ĕ??ŕ?Ș??Ĕ?Ó??????˛?Ó?Ó?Ɩ?????Ĕ????????Ɩ?????Ó????????????????????????Ĕ?Ș???’????Ξ??????̜???PPPPPP?RRRRRR?ё?А?ϟ??PPPPPP???ё??̜???˛?Ǘ??Ǘ?ʚ?Ĕ??Ɩ?????Ó?’????ə???Ǘ???ʚ??Ξ?PPPPPP?PPPPPP?͝?͝???PPPPPP??PPPPPP???VVVVVV???Ξ???QQQQQQ??Ғ?RRRRRR??TTTTTT?????QQQQQQ?Ԕ??Ԕ?UUUUUU??Օ??TTTTTT??Օ??WWWWWW?ח???VVVVVV??Ԕ??[[[[[[????֖????UUUUUU?֖??Օ??RRRRRR???ښ??WWWWWW???UUUUUU?UUUUUU?ӓ?ӓ?ӓ?????QQQQQQ?PPPPPP????QQQQQQ?А?А?QQQQQQ??Ξ?ё?QQQQQQ????SSSSSS????ښ?ؘ??Ғ?ё????А?PPPPPP????????Ξ?QQQQQQ??ʚ??RRRRRR???QQQQQQ???Ĕ?Ĕ?Ɩ?Ó??????ʚ?Ș?Ɩ?????Ó?Ĕ?Ɩ?’???Ɩ?Ó?????Ó?’?Ǘ?Ó?ŕ?SSSSSS?ښ??’???Ó??????????????????????????????????’??????Ó???Ș?˛??QQQQQQ?ё?ϟ?˛?А?RRRRRR???Ғ????QQQQQQ??А???͝?QQQQQQ??ʚ??????ə???ʚ??Ó?????Ĕ??Ș??Ǘ??̜??˛?͝??͝?˛?ϟ?????ϟ??SSSSSS???˛????RRRRRR?ӓ?ё?SSSSSS?SSSSSS?UUUUUU???А?Ξ?̜?А???Ғ?ӓ???SSSSSS????ӓ??UUUUUU?RRRRRR????ё?UUUUUU?ZZZZZZ??VVVVVV?XXXXXX?ؘ?֖??Ԕ???Ԕ?TTTTTT?Ғ??Ԕ???Օ??XXXXXX???SSSSSS?Ғ?ӓ??ё?PPPPPP??Օ?͝??PPPPPP???Ξ??PPPPPP??Ξ??QQQQQQ???˛???ZZZZZZ?[[[[[[??XXXXXX????͝?̜???˛?ʚ???̜?̜?˛?ϟ??̜?˛?Ș????Ǘ?????Ɩ???????Ó??’???Ó??????’?’?Ɩ?’??’?Ĕ??Ș?Ĕ????ŕ?Ș???’????????????????????????????????????????????ŕ?Ĕ??̜??????RRRRRR?ё??QQQQQQ??RRRRRR??Ԕ?ё???RRRRRR?Ξ??Ξ?˛?ϟ??Ǘ??Ɩ??Ɩ?Ɩ????Ĕ?Ó???’??Ó???Ǘ??ϟ??̜??͝???̜???ϟ?͝?PPPPPP?QQQQQQ?SSSSSS???ə??̜??А?А?SSSSSS???SSSSSS?SSSSSS?ё?????????Ғ??SSSSSS?ӓ?Ԕ?ӓ?TTTTTT?֖?Ԕ?Ԕ?YYYYYY??PPPPPP?RRRRRR?TTTTTT???SSSSSS??TTTTTT?UUUUUU??VVVVVV?SSSSSS?Ԕ?ӓ?Ԕ???RRRRRR??SSSSSS?SSSSSS???Ԕ?WWWWWW????А??QQQQQQ?Ξ?QQQQQQ?͝????Ξ??Ξ?ё????ϟ???ə?А??ܜ??ϟ?Ғ??Ξ??Ξ????ӓ?ϟ?Ǘ???ʚ?ə???SSSSSS?˛??ə?ŕ??Ǘ??ə?Ĕ?’??Ξ???????Ó?’??’?????Ĕ??’??’?ŕ?Ɩ?ʚ?Ɩ?’??Ó???????????͝???Ɩ????????????????????????????˛????????????ŕ??̜???Ξ???PPPPPP?Ғ???QQQQQQ??А?QQQQQQ????ё?͝?ϟ??͝??ə?Ǘ?ə??Ǘ??ʚ?˛??Ș???????Ǘ?ʚ????͝????ϟ??UUUUUU?Ǘ?͝??ӓ?PPPPPP???VVVVVV?Ξ??Ɩ?˛?ӓ??QQQQQQ?ё?QQQQQQ?RRRRRR?А?SSSSSS??QQQQQQ?͝??̜?????PPPPPP?????Ғ???Ғ??TTTTTT?Ғ??QQQQQQ?ϟ?ϟ?Ξ??????ё??PPPPPP???QQQQQQ??ё?RRRRRR??WWWWWW?SSSSSS?SSSSSS??????ϟ?Ξ??Ξ??͝?͝?̜??˛??А?ϟ?RRRRRR???˛?̜?͝??ϟ???ё?Ԕ?????ё?ё??ə???Ǘ?ŕ?ŕ?Ǘ??̜?Ș????ə??Ɩ?ϟ?ŕ??Ǘ???????????Ĕ?’?Ó??’??’???’???Ĕ???̜??ŕ????PPPPPP??Ó?????’?????????????????????????????????Ó??????????’???ʚ????ё????Ғ??????ӓ?VVVVVV?QQQQQQ?PPPPPP???RRRRRR??͝?˛?ə??ə?ʚ?͝?RRRRRR?ZZZZZZ??ŕ?Ĕ??’?’?Ɩ??˛??TTTTTT??Ғ??????̜?͝?̜?ə?Ԕ?______??SSSSSS??ϟ?Ξ?ʚ???ϟ?А?????ё????????А??А???TTTTTT?UUUUUU?ϟ?Ξ??А??QQQQQQ?QQQQQQ?RRRRRR?QQQQQQ?RRRRRR?QQQQQQ???ϟ?PPPPPP?Ғ?PPPPPP??А?PPPPPP?????PPPPPP??????QQQQQQ????ϟ?̜?ϟ?ϟ??͝?˛??͝??????Ξ????Ξ??Ξ?͝?Ξ???????Ξ?Ξ??Ξ?˛????˛??Ș???Ǘ??Ɩ?ŕ?ŕ?Ĕ????Ș??Ș???????????’?????????Ĕ??Ó?Ó?ŕ????Ĕ?Ĕ???Ǘ?Ǘ??’??’?ё??Ĕ?????????????ə???????????????????Ó??????ŕ??????Ĕ?PPPPPP??˛?А???ϟ??А?PPPPPP?А?Ξ?Ғ?ё?????̜?????Ξ??Ș????Ξ???ə???Ș??????ϟ??TTTTTT?YYYYYY?Ғ?ʚ???PPPPPP??PPPPPP??RRRRRR?UUUUUU????Ξ???Ó????А???????Ғ?PPPPPP???RRRRRR?ё?Ξ?ё?UUUUUU?\\\\\\?ؘ??????А?ϟ?PPPPPP???̜??Ғ?????ϟ?ϟ?̜???̜???PPPPPP??ϟ?А?QQQQQQ????PPPPPP?А???̜?Ξ?͝??̜?̜??˛?˛?ϟ??Ξ?Ғ?Ғ?ϟ?ϟ?͝??Ξ??͝??PPPPPP?Ԕ????VVVVVV?SSSSSS?????͝??ӓ???Ș??Ǘ????Ș??Ș?Ɩ?ʚ????ŕ??Ó??’?Ó????Ǘ?’????UUUUUU???Ó?Ɩ????Ĕ?Ș??Ș?˛?Ș?Ɩ???Ξ?ə???Ó??Ĕ???ŕ????????????Ɩ??????????????????????????????ŕ??SSSSSS??????˛?˛?А??А?Ξ?А??А?А?ϟ??А?ϟ?ё???Ξ?????̜?PPPPPP?̜?ə?Ξ??̜?ʚ?Ĕ??ŕ?????̜?̜?Ғ???Ξ?ё?ϟ??̜???А?PPPPPP?PPPPPP??Ғ??Ĕ??̜?̜???ё?QQQQQQ??????̜??QQQQQQ????ϟ?RRRRRR???͝?ʚ?ʚ???ϟ??ϟ??????????̜?????͝?Ξ?А????PPPPPP?PPPPPP?А?PPPPPP?PPPPPP?ϟ??͝???Ξ??̜??˛?ʚ?˛????RRRRRR????͝??͝?ё?ϟ????Օ?WWWWWW??PPPPPP?ӓ?ё?ё??˛?ʚ???˛???Ǘ??˛?????ŕ??Ǘ?˛??ə???’??Ó????????’?’???Ɩ?Ó?ŕ??Ǘ??Ó?ŕ?Ɩ??QQQQQQ??Ș?ؘ?WWWWWW???ӓ??Ǘ??ŕ??Ó?Ó????????????????????????????????????????Ɩ?ŕ???????RRRRRR?????Ξ????????RRRRRR??????А???ё?Ғ?Ԕ???????ʚ?ə?????˛?̜??ʚ?ʚ??ʚ?ə???????????ё????ŕ?˛?ϟ??RRRRRR?Ξ??RRRRRR?RRRRRR??QQQQQQ?Ξ???ϟ?QQQQQQ??͝??ϟ?Ξ??˛?ʚ?ʚ????̜???̜??̜?̜??ʚ???ʚ??͝???Ξ?͝?ϟ?Ξ?͝?QQQQQQ?????̜??̜????ə?PPPPPP??͝?ʚ???͝???????????ϟ?Ξ?͝?Ғ??ё?Ξ???˛??̜?ə?Ș?̜?͝??Ǘ?Ԕ?̜?Ɩ????Ɩ??ŕ??Ғ?Ǘ?Ș??ŕ?Ó??????’??’?Ó???????Ĕ????ə?ŕ???Ĕ????˛???͝?Ɩ???ʚ??Ó?Ɩ?????????Ĕ?’????????????????????????Ó??????’???Ó??ə??̜??????͝??Ξ?Ξ?͝?̜??UUUUUU?ё??Ғ?ӓ?SSSSSS??͝???ё?Օ?XXXXXX?˛??Ș??ə?Ș?Ș?Ɩ?’?˛?Ɩ?ʚ?ʚ?˛??̜???Ș?̜?Ξ?˛?˛?SSSSSS???ё??QQQQQQ???ٙ???Ǘ?Ș??ϟ?А??Ғ?А?ё??TTTTTT??˛?ʚ????ӓ?̜??͝??˛?????ё????ə?ʚ?PPPPPP?А???͝??͝???ϟ?͝?PPPPPP???Ξ??͝?Ξ?͝?͝?͝?Ξ??̜??˛?ʚ?ə?˛?PPPPPP?????͝?͝??TTTTTT??ϟ???Ξ????А????͝?PPPPPP????˛?̜???̜?ə?˛???ŕ??Ǘ??Ǘ????????ə?Ș?Ĕ??Ó?Ĕ?Ó?’?͝?Ɩ?Ǘ?Ĕ?ŕ?˛????Ș?Ξ?ӓ??Ș??Ǘ?ə????͝???ə??Ĕ???Ĕ???’?Ǘ?????????????????????????????????’???????˛??’?ə???Ǘ?ʚ?̜???̜?͝???̜?Ξ??А?ӓ???ర???А?Ξ??????QQQQQQ?Ғ?˛?ə??͝????Ĕ???Ǘ?Ș?Ș??А?Ξ?͝?Ξ?ϟ?˛?͝??Ξ?А??̜?͝?Ғ??YYYYYY???Ǘ?????QQQQQQ??QQQQQQ?ϟ??ؘ???͝????˛???˛??????ə???ܜ??Ξ???ʚ???ʚ?????˛?̜?ʚ???????̜????Ξ?ʚ?ə?????͝?RRRRRR????͝??ə???ϟ?QQQQQQ?QQQQQQ????ʚ???Ξ?Ɩ???PPPPPP?ʚ?ə??̜??ə??????Ǘ?Ɩ?ŕ??Ș??Ǘ???Ĕ?Ĕ?ŕ?Ĕ?Ɩ?Ԕ?Ξ?Ó?Ó???ə??Ғ?Օ?Ș?ə?ʚ??ə???Ǘ??Ɩ?ŕ????͝?Ǘ?ϟ??Ξ?Ș??Ó???????????????????????????????????ə???????????Ɩ???Ó?Ĕ??ϟ?Ș?ə?ʚ?˛????ʚ?Ș?͝??ϟ???Օ?ݝ??ݝ?Ғ?͝??А?͝?ϟ?ϟ???А?QQQQQQ??А?͝?˛?ə?Ξ?ə????ŕ??ʚ??̜?̜?PPPPPP?А???͝??ϟ?ə?˛??ə?͝?А?QQQQQQ????Ǘ??Ș?Ξ??????SSSSSS??RRRRRR????Ǘ??˛???????˛?ʚ?͝??Ғ??͝??????ʚ???ʚ?ʚ?ʚ?ʚ?Ș???˛??Ξ?˛???ʚ?͝?˛???ʚ??????ə?˛?̜??ʚ??ʚ??͝?ϟ?????ϟ??Ξ??̜?ϟ??̜??˛?ʚ?PPPPPP??̜?PPPPPP???̜?˛?Ɩ????Ĕ??????Ǘ????Ɩ?ӓ?͝????ʚ???̜?TTTTTT??RRRRRR?ё??ŕ?ʚ?Ԕ??ŕ?Ó?????Ó?Ɩ?????Ǘ????????????????’???????????????????????????????UUUUUU?ə??Ǘ??Ǘ?Ǘ???Ǘ?ə?̜?????ə??Ș?˛??RRRRRR??Ԕ?????̜??͝?˛?ϟ????????Ș?ə??Ĕ??’???˛?Ξ?̜??˛??SSSSSS?????͝?Ξ??Ғ????˛?ə?ʚ????ϟ?ϟ???PPPPPP??SSSSSS?QQQQQQ?͝?̜?ʚ??̜??͝?ʚ?ʚ?̜??ʚ????ח???˛???˛?ə?ə??Ǘ?????̜???˛???̜???ʚ?˛??PPPPPP??͝??˛???Ș????Ԕ?ё??̜?Ș?ə?Ș?ϟ?PPPPPP????˛??˛?˛??˛????˛?Ǘ?˛?ϟ?RRRRRR???Ș??ʚ?ʚ?̜?̜???????͝???Ǘ??Ξ????ə?ə?͝?Ș????˛???Ǘ?Ɩ?Ș?ʚ?Ξ???Ǘ?Ș??ŕ?Ĕ??VVVVVV??Ș??????’????Ó????????Ғ?????????????????????????????Ĕ?˛??Ξ?Ξ??’??Ĕ?????˛?̜?Ǘ???ə????Ԕ???А?PPPPPP?RRRRRR??Ғ?Ξ???̜?̜?Օ?TTTTTT?ё?˛?Ș????˛??Ǘ?ŕ????˛??˛???Ξ?А??ϟ?Ξ?˛?̜??ə???????Ș??ϟ?А?˛?SSSSSS?͝?͝?͝?ё??А??˛??̜??˛?Ș?̜?̜??ə??ə???ё?̜??UUUUUU?ə?????RRRRRR??ə?Ș?ʚ?ə?Ξ???̜?Ξ?ə???˛?͝??̜?̜???˛??˛??˛?Ξ?˛??ϟ??ʚ?ʚ??????Ξ?ʚ?Ξ??Ξ?̜???Ǘ??̜?ʚ??А??????????UUUUUU????˛?Ș?̜?TTTTTT?ʚ?˛??ŕ?ə?????͝?Ԕ??ʚ??͝?ϟ?????Ǘ??????Ɩ??ŕ?Ĕ??????Ĕ????Ɩ??Ó?’???????????Օ???????????????????????????А????Ș?????Ǘ?Ĕ??Ɩ?Ǘ?ə?Ș?ə?????Ǘ?Ǘ??ٙ??PPPPPP???ё?ϟ?PPPPPP?ё??̜?̜?UUUUUU??????ə???͝?ʚ??Ș??Ǘ?Ș??Ș?ə??????ϟ?PPPPPP??QQQQQQ???˛???ϟ???Ғ??ʚ??Ǘ??̜??QQQQQQ?Օ?ϟ???TTTTTT?Ԕ?ϟ?А??YYYYYY??̜?????˛??ə???ʚ??ə?ʚ??Ș??ʚ??ʚ?ə??˛???̜?̜?̜??ə?̜???????ʚ??ʚ?ʚ??ʚ??RRRRRR?QQQQQQ?̜??˛????ə?̜?Ξ?˛?Ξ????ʚ??Ǘ??Ɩ?Ș?Ș?ʚ???ʚ?Ș?ё??ʚ?ϟ??ʚ?͝?Ǘ?Ɩ?ə?ޞ???PPPPPP?????А?˛?˛??ʚ???????????Ǘ?ŕ?’??Ó?Ǘ?Ș?ʚ?Ĕ???ə???Ɩ????Ĕ??̜???ϟ??????Ĕ??’???Ó??????????????????????????А?ŕ??????Ĕ?Ĕ?Ĕ?ŕ???Ɩ?Ǘ????ə?Ǘ?Ǘ????А?А?RRRRRR?RRRRRR??ϟ?PPPPPP?XXXXXX??ϟ?PPPPPP?^^^^^^??Ξ?????ʚ?ə?ϟ?͝?ʚ?Ș???Ɩ???????̜?ӓ?А??ϟ?PPPPPP??˛?̜??̜??ϟ????ϟ??ŕ?Ș?ʚ?Ξ?ϟ?SSSSSS?RRRRRR?ə??TTTTTT??ə?PPPPPP??˛?̜??˛?͝???̜???PPPPPP?PPPPPP??TTTTTT?˛?????ʚ?ə??ə??˛???̜?Ξ??̜??ϟ?А?SSSSSS?QQQQQQ????ʚ?PPPPPP?̜??͝?Ξ?̜?QQQQQQ??͝?ӓ??ə????̜??̜?ʚ?͝?Ș??Ξ?˛?˛??Ș????Ǘ?ӓ??˛???????Ξ?˛??Ș?ʚ?˛?˛????̜???˛??Ǘ??ə?Ǘ?̜??Ș?ə?ʚ?˛?Ξ?ə???ښ??Ó?Ĕ???Ĕ??Ĕ????ϟ?˛?ŕ?Ó???̜??Ɩ?ŕ??Ǘ?ŕ????ŕ???????????????????????????????????????Ó????Ș??ŕ??Ș?ʚ???Ǘ??PPPPPP??ϟ?PPPPPP??ϟ?????QQQQQQ??PPPPPP?QQQQQQ????͝????А??˛?ʚ??ŕ???͝??ё??˛???ё?PPPPPP??Ξ?PPPPPP????SSSSSS??RRRRRR?͝?˛???˛???ʚ?Ξ?QQQQQQ?ϟ?А??Ξ??????̜??͝???ə??̜?˛????Ξ?А???????͝??ə?˛?˛??ʚ???ə??ʚ??͝??̜??˛?˛???Ș?֖?̜?SSSSSS?QQQQQQ?SSSSSS?̜??А??А??˛?Ș?Ș?Ș??Ș?ϟ??ə???͝??˛????Ǘ?ŕ?Ǘ?ϟ?Ǘ????Ǘ?ʚ??ʚ??????˛????А??ʚ??Ɩ?Ș???Ɩ?̜?ʚ??????Ó??˛?͝?’?Ɩ???ŕ?Ɩ?˛???Ǘ??Ș????Ó?Ɩ??ŕ????Ǘ?͝?Ĕ????Ĕ?????????????????????????????ӓ?’?’????ŕ??’??Ĕ?Ș?ё????????Ξ??ʚ??Ξ?Ξ??Ξ???͝?QQQQQQ?????̜?ٙ???ə?˛?̜?000000??̜??ʚ???Ɩ??ʚ?ʚ?͝?͝?˛??ϟ??QQQQQQ?ϟ???Ξ??ϟ????Ș?Ξ???̜?Ξ??QQQQQQ?ё???Ș??ϟ??Ξ??̜?̜?ʚ??Ξ?Ξ?PPPPPP????͝?SSSSSS?̜?̜???̜?̜???̜??̜?ϟ??PPPPPP?ə?̜?˛??͝?ʚ???˛?˛?PPPPPP??PPPPPP??Ș??Ș???͝???˛???????Ǘ??ə?Ɩ?Ș?˛??QQQQQQ?˛?PPPPPP??͝?˛???ё?˛?Ĕ??PPPPPP?Ɩ?Ǘ??Ș?̜?Ɩ??ə?Ǘ??͝?Ǘ??Ș?????˛???Ǘ?Ǘ?Ș??Ĕ?QQQQQQ??ə?ŕ???Ó?’?’?Ó?’????ŕ?????͝?Ĕ????’?????’??Ș??Ɩ?????????????????????????????????????’?????Ó?Ǘ??Ɩ?ŕ?ŕ??Ǘ??Ǘ???Ĕ?Ĕ??Ǘ??ё??̜???RRRRRR?ϟ?PPPPPP??ʚ??Ξ??RRRRRR?Ξ?SSSSSS???ə?ё????Ɩ?Ɩ?Ó?Ó?Ș??ʚ??Ξ?͝????ё?SSSSSS??QQQQQQ???ӓ???Ξ??ŕ??Ɩ?̜?А????ϟ??̜???PPPPPP?͝?̜???ϟ??͝?͝?͝?ϟ?А?Ξ?͝??А?А?ϟ?QQQQQQ?͝??ӓ???ʚ?͝?Ξ??͝??Ξ?ʚ?˛??˛?̜?̜??˛?̜?PPPPPP?˛?͝??????PPPPPP??????̜?̜??͝?ʚ?ə?SSSSSS?ח?SSSSSS?Ξ?ə?PPPPPP?ə???˛????ʚ??ʚ?????????’???Ǘ??Ξ?͝??Ǘ???ŕ?ə??PPPPPP?̜?ʚ??ϟ???Ɩ?Ɩ?Ǘ?Ĕ?ŕ?’?Ó?Ĕ?????Ǘ?Ĕ????Ɩ?Ǘ??ŕ???Ó?Ó?’?Ĕ?ə?Ĕ????????????????????????????????????????ə????????ϟ?????ʚ??Ǘ??Ɩ?Ș?Ǘ??ϟ?ʚ?PPPPPP?Ξ?͝??ё?QQQQQQ??А??А?QQQQQQ??]]]]]]?ܜ??А?QQQQQQ???ʚ???ʚ?ŕ????Ș??ə?ə??˛????͝????˛?ʚ??Ξ???Ș???Ǘ??˛?Ɩ???Ș??̜???PPPPPP?Ξ?̜????̜?̜?̜?ё?̜??UUUUUU?????ё?ϟ?͝???PPPPPP?Ξ?̜?͝?А?ϟ???ϟ???͝???͝?̜??????????ʚ?˛???PPPPPP???UUUUUU?ə?˛?ə?͝?̜??????Ξ??ϟ????̜??̜?ʚ??Ɩ?ə?ŕ??Ǘ???Ó?ŕ?Ɩ???Ș??Ǘ???ŕ?Ĕ????ŕ?̜?˛??͝??ʚ???ŕ?????QQQQQQ????Ĕ?Ĕ??Ș?ŕ???Ɩ?ʚ?Ǘ???ŕ???ʚ?Ɩ?Ó?’?̜?Ĕ??????????????????????????????????????????????????̜?ŕ?Ǘ?Ș?Ș????Ș????PPPPPP??PPPPPP??Ғ??????XXXXXX?????ё???ʚ?˛?PPPPPP???ʚ?˛??Ǘ?Ǘ???˛?????WWWWWW?֖?????͝??ʚ??Ǘ??ə?Ξ??Ș??ʚ?ŕ?Ɩ??Ș??ʚ??ʚ???˛?̜??QQQQQQ??ϟ???А??͝?А??QQQQQQ??˛?˛??ϟ????͝????VVVVVV??Ξ??̜?ϟ??̜????̜??Ғ??Ǘ????PPPPPP?PPPPPP??ʚ?˛?ʚ???????˛?QQQQQQ???˛?ʚ???ə?Ș?Ș?Ș?Ǘ??ə?Ɩ?ŕ?Ɩ??Ɩ?Ɩ?Ɩ?Ɩ?Ɩ??ŕ??Ș???Ɩ?ʚ?Ɩ????Ɩ???Ǘ?Ș????Ɩ??ŕ????Ĕ??Ĕ?Ĕ?Ĕ??Ș??’??̜?Ó???Ĕ?Ó??Օ??????????????????????????????????????????????????????Ɩ??????Ǘ???????͝???ё?Ғ?TTTTTT?QQQQQQ??Ξ??RRRRRR???Ξ?ϟ????Ξ?Ɩ?Ǘ??ʚ?XXXXXX?ё?Ғ??˛?˛?͝???͝?͝?PPPPPP??XXXXXX??\\\\\\?ϟ?ʚ?Ș?ə?Ɩ?Ɩ???˛??ə?͝??ʚ????????ə?˛?QQQQQQ??ʚ?ə?̜?͝?ə?̜???̜?Ξ?ʚ?̜?ϟ?RRRRRR?А?͝?˛??А??˛?͝??ϟ??А?rrrrrr?QQQQQQ??ӓ?ϟ?˛??̜??ə?̜?Ξ?ʚ????˛???Ξ??̜?̜?̜??Ξ?ə?Ǘ?̜??˛?ə??˛?????Ș?˛???Ș?ŕ??˛?ŕ???Ǘ?ə?Ș?Ǘ?Ș??˛?Ǘ??Ĕ????ŕ?Ĕ?Ĕ??Ǘ????ŕ??Ɩ??ə??ŕ?Ĕ???Ǘ?ŕ?’??????Ĕ?Ɩ?Ĕ?’??Ǘ?Ó?’??????̜?Ɩ???Ɩ????????????????????????????????????????????’?ŕ???ŕ?Ξ?ŕ???????Ɩ?Ǘ??ə?˛?ӓ????\\\\\\?ӓ???????Ғ?SSSSSS??ؘ?RRRRRR???Ɩ?Ș???А???˛??QQQQQQ?ʚ?Ș?Ǘ??Ғ?QQQQQQ?222222???PPPPPP??͝??ə???А??̜?ϟ?˛?????ʚ?ʚ???̜?ʚ?˛????Ș?Ș????ʚ??˛?Ξ?˛?ʚ??RRRRRR??˛?˛?SSSSSS??ϟ?Ξ??????????̜?̜?ʚ?ʚ?????А?͝?????А?Ξ????ʚ???PPPPPP?А??QQQQQQ?̜??ə???VVVVVV?PPPPPP?Ǘ?Ǘ??ʚ??Ș????ŕ?ŕ??Ɩ?Ɩ???Ɩ??ʚ??ʚ?ŕ?Ĕ?????????Ǘ?ŕ??ŕ??Ĕ?ŕ???Ǘ?ŕ??Ĕ?Ɩ???Ĕ??’??ŕ?Ɩ??ŕ?Ó??Ĕ??’???Ĕ??’?’??Ó??????????????????????’??????????????????????Ĕ?Ó???Ǘ?ŕ????Ș??Ș?ʚ?QQQQQQ?Ɩ?ŕ?Ǘ?????WWWWWW???TTTTTT??А??˛???ё?ۛ?Ԕ?Օ?SSSSSS??ə?˛?ϟ?ʚ??А?Ξ?ϟ??ϟ?ח?????PPPPPP?Ԕ?????ʚ???????̜?̜?QQQQQQ??͝?͝??ʚ???̜?͝????ə?˛?????˛?????ə????ə?˛???Ξ?ϟ???????А????????˛?Ɩ?Ĕ?Ș?ʚ???̜?Ξ?А?Օ?PPPPPP???ə?ə???ə?ϟ?Ș??????PPPPPP??А??ə?Ξ????͝?Ɩ?Ɩ?Ó??Ĕ??Ĕ?Ș??Ș???Ǘ?Ԕ?Ǘ?Ξ?ŕ?Ĕ?Ĕ?Ș?Ɩ?Ș????Ɩ??ʚ?̜??’?’?ŕ???Ɩ????’????Ĕ?Ĕ?Ĕ???????????Ĕ?’?’??Ǘ???????????????????????ə????????????????????’?’?Ĕ????Ǘ?̜??Ǘ?Ĕ????˛???Ǘ?Ș??ʚ?ӓ??PPPPPP?А???Ξ?˛?͝???Ғ??????Ԕ???Ș??А?ϟ?QQQQQQ?А??PPPPPP??ؘ??SSSSSS???Ξ?˛???˛??????ʚ?ʚ?˛???͝????̜?Ɩ??Ș????ʚ?ə??ə?Ǘ?ʚ?ʚ??Ș?ə?Ș????Ș????Ғ???PPPPPP?͝???ʚ?Ɩ????????ə?Ș???ŕ???А???ϟ???VVVVVV???ё????ʚ?˛?ə??Ș?˛?ʚ?Օ?Ԕ?А?А??Ξ?PPPPPP????͝?Ǘ?˛??Ĕ??Ɩ?Ɩ??Ĕ?Ɩ??Ĕ?ʚ?Ɩ?ŕ???ʚ?ʚ?Ș??Ș?Ǘ??????Ó??????????’?Ǘ??Ó?ʚ??????Ɩ?ŕ??PPPPPP???ŕ???Ó??ŕ???’????????????????????????????????????????Ș?Ș??????ə???Ɩ????ŕ?????Ɩ????ʚ??ё?RRRRRR?PPPPPP???ʚ?QQQQQQ???А??Ғ????͝?̜??Ǘ???А?PPPPPP???QQQQQQ?WWWWWW?WWWWWW?SSSSSS?ٙ?ə??ə?Օ?ܜ?ϟ?ʚ?Ș?ʚ??ə?ʚ?͝?ə?ʚ?Ǘ??ϟ??QQQQQQ?̜??̜??Ɩ???͝?Ș?Ғ?ə?Ș???ʚ??ʚ??ʚ?????ʚ?Ș???̜???Ǘ?Ǘ??Ǘ??Ɩ?ə?ə?ə??????Ɩ?Ɩ??Ș?ʚ???QQQQQQ?ٙ?ښ??RRRRRR?ϟ??̜??QQQQQQ??А????ʚ??Ғ???˛????ϟ????????Ǘ??ŕ?Ó?Ó?Ĕ??Ɩ?Ó?’???ӓ??ə?Ɩ?Ș??ʚ???Ɩ?’?’?Ó?’???Ș??Ó???Ĕ??Ĕ?Ǘ?ʚ???ݝ?PPPPPP?ŕ??UUUUUU?ŕ??̜??Ó?Ĕ?SSSSSS??Ș?Ó?Ó?Ó??Ó?????????????????????????????????????????̜?Ǘ??’?????Ó??Ɩ???Ș???Ɩ?Ɩ??Ǘ??Ǘ???֖???ϟ????ϟ?PPPPPP?SSSSSS?????ʚ?̜??Ξ?˛?ʚ?̜?ϟ??˛???Ғ??RRRRRR?RRRRRR?˛?Ș???ё?˛??ʚ??????ŕ?????Օ??Ǘ??Ǘ??Ɩ?PPPPPP?ŕ?????˛?Ș????̜??Ș??˛??ə??ə?Ǘ??͝?ϟ?ʚ?ʚ?ʚ????Ș??Ɩ???ə?ŕ?ə??Ș??Ɩ??ə???Ș?Ξ?Ғ?͝????А?ё??А?͝?Ș????Ș??ϟ????????ŕ?’?Ĕ??ŕ?????Ș?ŕ?Ó???ŕ?Ĕ?̜?А?͝??ʚ???ə?Ɩ??Ĕ?????Ó??????ŕ?ϟ?Ɩ?Ó?’??Ĕ?Ș?ښ???Ǘ?Ǘ?Ș?ϟ???Ɩ???????’?ё??Ĕ?Ó???????????????????????????????????????SSSSSS?Ĕ????’???’?????Ғ?Ɩ??ʚ???Ș?ə??Ǘ?ə???А??˛?PPPPPP?͝??Ғ??ё?PPPPPP??А?Ξ??ə????ё?????֖?TTTTTT???WWWWWW???????????͝?Ǘ?Ș?Ș?Ɩ?ə????֖?Ξ??ŕ???Ș?ŕ?’??ŕ?Ɩ?Ǘ???˛?ʚ??RRRRRR?ə??ʚ?Ș?Ɩ??˛??ʚ?ϟ?˛??ʚ??ʚ??Ș??Ǘ?????ŕ??ʚ?Ɩ?????ʚ?ə??Ș??Օ??̜?А?ё??ϟ?PPPPPP?QQQQQQ????Ǘ??Ǘ????Ɩ????Ĕ?Ó???Ó??Ǘ??Ĕ??TTTTTT?Ɩ???Ɩ?Ó?Ɩ??̜?RRRRRR????Ɩ?ŕ???Ɩ??’??Ó??Ó???????Ĕ??’??ŕ??ŕ????ʚ???ښ?Ԕ????Ș??Ó?ŕ?’?Ó??Ǘ?Ǘ???????????????????????????????????????????’??PPPPPP?Ǘ??ϟ??ə??’??Ĕ?Ĕ??ŕ??Ș?ə??Ș?˛???ϟ???PPPPPP????UUUUUU?ϟ?????ʚ??А?А????ϟ???ӓ???ܜ?А?Ξ?͝??????Ɩ?Ǘ??ʚ?Ș?Ș?ʚ?Ǘ??ʚ??ؘ???ʚ?Ș??Ĕ???????Ɩ??ʚ??Ș?˛??ə??Ɩ????͝?ϟ??ə???̜??͝?Օ?Ș?Ɩ?????Ĕ?Ɩ???ŕ???ə?Ɩ??Ǘ?̜?Ș?ŕ??˛?ʚ??ϟ???͝???ə?Ǘ?Ɩ?????????Ĕ?’??’?Ɩ?Ó?ŕ??Ó?ŕ?Ĕ??Ɩ?ʚ??Ǘ?ŕ?Ɩ?ŕ?Ș???˛???͝?Ĕ?ϟ??’????ŕ?Ó?????????Ĕ??Ó?????Ǘ??Ɩ?Ǘ?’????͝??ə???ŕ?????Ș???????????????????????????????????????????ŕ??ʚ?Ó???Ĕ?ŕ??’?Ĕ????????Ș?ə?????ʚ?͝??RRRRRR?PPPPPP????ё??RRRRRR??????????А?А???ח?Օ?ܜ?PPPPPP??А???Ó?Ș???ʚ??̜???̜?˛???Ξ??ə???Ș?????Ș??ŕ??ə??Ǘ?ə??˛???Ș??Ɩ???Ɩ???˛?͝??Ș??ʚ?А?ʚ?ə?Ɩ??ŕ?Ĕ?Ĕ?Ĕ?Ĕ?Ɩ????Ǘ??Ǘ?ə?Ɩ?Ɩ?ə?˛?̜?Ș??А??ə?ə?˛??Ǘ?Ĕ?Ș??????????ŕ??Ɩ?ŕ?ŕ?Ǘ????Ɩ??Ǘ???ŕ????ə?Ǘ??Ɩ???Ó?˛????’???’?Ó?????’?’?Ó?’???͝?????Ɩ?ŕ???????ϟ??Ǘ?????Ó?Ó??????????????????????????????????????????Ș??RRRRRR?Ɩ???Ǘ?’?Ǘ??Ɩ?ʚ?SSSSSS?Ĕ???ə?Ș??Ș????^^^^^^???А?VVVVVV???ח??А?ё??А?Ξ?Ξ????̜?͝???????ۛ??YYYYYY?ӓ???Ɩ?Ĕ???Ș????˛?Ξ?ʚ?Ș?͝?ё????Ș????Ɩ???ʚ???Ó??Ș?Ș?Ɩ???ʚ???WWWWWW?Ș?ʚ????Ɩ?????Ș??ʚ?Ș?ŕ?Ɩ????Ĕ?????Ș?Ɩ????ŕ??Ɩ??ʚ??Ș?ŕ?А?ӓ?̜?̜??̜???Ǘ??Ɩ?ϟ?ŕ?ə?ё?Ɩ???Ǘ??ŕ????ŕ??̜?̜??ə??Ĕ?ŕ???Ǘ???ŕ??ʚ?ŕ?Ó???Ó?Ĕ?’?????????????Ș?˛???ŕ?Ξ???ŕ??????Ɩ?ʚ?’??????PPPPPP?TTTTTT??????????????????????????????????????????TTTTTT??Ξ????’?Ó??’??͝????Ó???ϟ??????Ғ??̜??А??ϟ???А??Օ?TTTTTT?ё?PPPPPP??PPPPPP??PPPPPP?̜?˛?͝?ʚ?QQQQQQ?֖??????XXXXXX??ё?Ξ?ʚ?͝??Ǘ????Ș?ə?ə?̜????PPPPPP?Ɩ?Ɩ????Ɩ???ʚ?А?ӓ?Ó??̜??ə?PPPPPP?ϟ????Ǘ?’?ŕ???Ș??Ș?ŕ??Ó?͝?Ɩ?????ŕ??ŕ??ŕ??Ǘ??ə????ŕ?ŕ?????ϟ???ə???А?ə??ŕ???̜?RRRRRR?А???Ǘ???QQQQQQ???Ó??Ș??˛?ϟ?Ξ?Ɩ?QQQQQQ?ŕ?Ɩ???????Ɩ?Ĕ?Ó?Ĕ?Ɩ?Ó?ʚ?ŕ??’??????’?????’?ə??ŕ???ӓ?Ș???̜?Ξ????Օ?̜??ϟ???’??Ǘ??Ĕ???????????????????????????????????????????’???Ǘ?ŕ????’?’????ə?’?????Ó????ϟ???????QQQQQQ?Ξ?ܜ?QQQQQQ?Ғ?ё???Օ??ё???Ξ?˛?ё????ᱱ?Ԕ??ח??˛?ə?͝?PPPPPP?UUUUUU?ё??Ș???Ǘ???PPPPPP?ё?ŕ?????Ó???Ɩ???Ĕ??TTTTTT?????Ǘ?͝?ʚ?˛?Ǘ???Ș??Ǘ???ə???’??ŕ??ŕ??Ĕ????Ĕ?ə?Ĕ??Ɩ?ə?Ĕ???Ĕ?Ĕ?ŕ?Ǘ?ŕ??PPPPPP?Ș??Ș??PPPPPP???Ǘ?ŕ?Ǘ?Ǘ???\\\\\\?ϟ????Ș??Ǘ???ŕ?ʚ?’?Ĕ??Ɩ????Ĕ?Ĕ?͝???Ș?Ǘ?ŕ?Ɩ??Ɩ?Ó??Ó?Ɩ???????’??Ó?’?’??Ɩ???Ǘ?Ɩ??ə????Ɩ????QQQQQQ?Ξ???Ó???Ĕ????’????????????????????????????????????????????Ĕ?Ș????ŕ??????’???????ŕ??Ǘ???PPPPPP????˛??ϟ?Ξ?͝?PPPPPP??TTTTTT?QQQQQQ?PPPPPP??А?ё?PPPPPP??͝?????˛??QQQQQQ?QQQQQQ?А?ӓ???͝?̜??PPPPPP?Ǘ?Ș?Ș?ə?Ǘ?Ǘ?????Ɩ???ŕ?Ĕ??ŕ?Ǘ??ŕ??ӓ?????ʚ?????ʚ???Ǘ?Ǘ?ə?ə?˛?ʚ?????ŕ????Ĕ?Ĕ?ŕ??UUUUUU?Ǘ??ŕ??Ó?Ɩ????Ó??ŕ?Ɩ???????Ɩ????Ɩ?Ĕ??ʚ?˛?ʚ????ٙ???͝????ŕ???Ĕ?Ɩ?Ĕ?Ǘ??Ș???Ǘ?????Ǘ?А????????Ĕ?Ó???’?Ĕ?Ɩ?ŕ??Ɩ???˛???Ĕ???Ǘ????QQQQQQ?ə???????????ʚ?????????????????????????????????????????????Ɩ????’?Ĕ?????Ó?????????˛?ŕ?ŕ??˛???ə?????Ξ?͝?RRRRRR?Ғ?SSSSSS???TTTTTT?QQQQQQ??͝?ϟ??͝????QQQQQQ?ʚ?̜?А??ϟ??ё?Ξ???ə?̜??Ǘ?Ǘ?Ɩ?ʚ??ϟ???˛?Ș??Ĕ?ŕ???Ɩ???Ɩ???ŕ?ŕ?ŕ?ʚ?͝?̜?ʚ??̜??˛???ʚ??ʚ?Ǘ??SSSSSS?ё?Ǘ?Ɩ?Ĕ?????Ș?Ș???Ɩ??ʚ?Ș?Ĕ?ŕ?Ó?ŕ?ŕ?Ǘ????Ș?????Ĕ?’???Ɩ?Ǘ?Ș???RRRRRR?Ξ?˛?͝?͝?Ɩ???ŕ?ŕ???Ó???ŕ?Ɩ?ϟ?ŕ???????Ɩ??Ǘ????Ǘ??????Ó?Ó?Ĕ???Ɩ??TTTTTT?Ғ???ŕ???UUUUUU??ŕ?Ĕ???RRRRRR??Ɩ??Ĕ?ё?Ǘ?Ĕ?????????????????????????????????????????????????????Ĕ?Ó??Ĕ?????Ó?Ĕ????????Ĕ??Ĕ??Ғ??Ξ?Ɩ????ё??͝?˛????PPPPPP????Ғ?Ξ?RRRRRR??ϟ??̜????̜?ϟ?????ё?RRRRRR??Ғ??Ǘ?ϟ?Ó???RRRRRR??ə??Ǘ???ŕ??Ǘ??˛??ŕ?ŕ???ŕ???֖?RRRRRR?ϟ?SSSSSS?PPPPPP???͝?А??Ș?Ɩ?Ș??????Ș??Ș?ʚ??????ʚ?ʚ??˛????ŕ??Ɩ?Ș???Ș?Ș??Ș?Ɩ??????ə?˛?Ș????ʚ?ʚ?ʚ???ə??Ɩ?Ó?????Ș?Ɩ??Ǘ?Ǘ?̜?Ǘ?ŕ???Ɩ?Ó?Ǘ?Ș?̜?Ǘ?˛??Ɩ?????Ó?Ó??ʚ?RRRRRR???????????͝?Ĕ?Ǘ?’???Ɩ???Ғ???А???????????????????????????????????????????????????’??Ғ???’?Ĕ??Ó?????’???????Ó???ə?˛???ə??Ș?Ș?ə??QQQQQQ???̜???ϟ???Ξ?˛?PPPPPP????А?Ǘ???ʚ???PPPPPP?Ғ?\\\\\\????PPPPPP?????͝?̜??ə??Ș??Ĕ??Ș?̜???ə??Ɩ?Ș?ŕ????QQQQQQ???Ξ???˛?Ԕ????͝?ə?ə?Ǘ??ʚ??ϟ???˛?̜??ə?ʚ?Ǘ?ə?Ș???????Ɩ????ŕ??Ǘ???????Ș??Ǘ????ʚ??ə?ϟ??ʚ??Ǘ?Ĕ?Ǘ??Ĕ??Ɩ?ŕ??Ó?ŕ??Ɩ?Ɩ??????Ɩ?ŕ????Ó?’?’?????ŕ??????ᱱ????^^^^^^????Ó???’????UUUUUU???’?Ĕ?ŕ???????????????????????????????????????????????????????????Ɩ?Ǘ?????Ó??˛?Ó?Ǘ???Ó???˛?ə?Ɩ??˛?Ș??????ə???PPPPPP?͝?͝?Ș????А??ZZZZZZ??XXXXXX?Ξ???̜?????[[[[[[?͝??Ó??Ó?ŕ??ŕ??Օ?Ǘ?Ĕ?ʚ?Ș??Ș?Ș?̜?Ș??Ǘ???????ʚ?ʚ?ə??ʚ?Ș?А?ϟ?Ș???Ɩ??????Ԕ?ϟ?Ξ???ݝ???͝???Ș??ʚ?ϟ?ʚ???Ɩ?ŕ???Ɩ??Ɩ?Ș??ə???????ʚ?????ə????˛???ŕ?????˛???Ĕ??Ĕ?Ș?Ș?Ɩ?Ξ?PPPPPP?QQQQQQ??Ɩ??ŕ?Ǘ?ŕ??Ĕ???Ó?Ɩ?̜?Ș?????Ξ?ϟ???̜?̜?Ɩ???Ș?Ó?ŕ?Ĕ??Ș??RRRRRR?Ɩ??’???????????????????????????????????????????????????????ʚ??˛?Ǘ?ŕ??????????????Ó???ŕ??˛??ə?Ǘ?˛?????ʚ?Ș?ʚ??˛??̜?ʚ??ϟ?Ξ??VVVVVV???????’?ʚ?PPPPPP????Ξ??Ǘ?Ĕ?Ɩ?Ǘ?Ș?˛?Ǘ???ϟ??Ǘ?Ș?ʚ?????Ǘ?ə???Ɩ??Ɩ??ʚ??͝?˛?????Ɩ??ʚ?ə??ə???WWWWWW?Ғ?????ϟ?Ξ?Ξ?͝?Ș?ə?Ǘ?Ɩ????Ɩ?Ɩ?ŕ?Ɩ?Ș?Ɩ????ə??Ș???Ɩ?Ǘ???Ș?Ɩ?ŕ??Ɩ?????ŕ???ʚ??̜?ə?Ǘ??Ș???’?Ɩ?֖???333333???ʚ??Ó?Ș?Ó???Ǘ???Ó??????˛?????????’??????ŕ?˛????????????????????????????????????????????????????????????Ξ???ŕ??????????Ó????’?Ĕ?Ǘ?Ɩ?ə??ə??Ǘ?Ș??Ș???Ș??????ϟ???А??RRRRRR??֖?UUUUUU???TTTTTT???Ș?Ǘ????ŕ??Ș?ŕ????ϟ?̜?Ԕ??˛????͝?ə?˛?ϟ???Ș???Ǘ?ə????Ș?̜?ϟ?????˛?ə?ٙ??˛?͝????TTTTTT??ח?Օ?[[[[[[????ʚ?Ș?Ș?Ș??Ǘ?Ș???????ə?ə?͝?˛???Ș??͝?˛??ʚ?Ξ?Ĕ?ə?ə?Ș?Ɩ??͝?Ǘ?Ɩ???Ɩ??ʚ??Ș?Ǘ?Ș??’??’?͝??ϟ????Ș??ŕ??ŕ??’?ə????ŕ???ŕ??Ɩ??’?’?????ŕ???’???ё???WWWWWW?PPPPPP??????????????????ŕ?????????????????????????????????????????Ĕ???????Ɩ??????Ó?Ғ???ə??Ĕ?Ĕ???????Ɩ?ʚ??QQQQQQ?ŕ?Ǘ?????????˛???А??\\\\\\??Ғ?RRRRRR?PPPPPP?Ɩ?ŕ?Ó??Ó?Ĕ?ŕ?Ĕ?????Ș?Ș???ʚ?˛??А??Ξ???Ș?ʚ???ϟ?˛??ŕ???ʚ?˛?˛?ϟ?Ș?ʚ??˛??ə?Ǘ???А?Ξ??ښ?000000??UUUUUU?Ғ?UUUUUU?Ξ?̜??Ș?ə?Ǘ????ŕ?Ș?ə???????ё?̜??ə???Ξ?̜?Ǘ??????Ǘ???Ɩ??ə?Ɩ???ŕ?Ș????Ó?????ŕ?ə?ʚ??Ș??Ĕ?ŕ?????????Ĕ???Ó?Ș?ё????Ԕ????????Ɩ?Ĕ?Ɩ???SSSSSS?ϟ?TTTTTT???????????????????????????????????????????????????????????Ғ??Ĕ??’??????’???А???ŕ??’?Ĕ?Ɩ????Ĕ??Ɩ??ə?ؘ??????̜??̜?˛?̜????Ξ??ӓ????PPPPPP?̜?ə?’?????Ɩ??Ǘ??Ǘ??Ǘ?Ǘ?ə?ʚ?ϟ?Ғ?????ʚ??А?ə??ə????͝?ə??ə?ʚ?PPPPPP????PPPPPP???Ɩ??Ғ???Ԕ???ߟ?ZZZZZZ?????ə?????ŕ?Ɩ????Ɩ??ʚ???PPPPPP?˛????Ξ???Ǘ?ə???˛??Ǘ?ʚ??PPPPPP????????Ǘ???????Ó???????˛?ŕ?Ĕ??????ŕ????’????Ó?Օ????????Ó??Ș?????PPPPPP??Ĕ????????????????????????????????????????????????????????????ʚ???’???????????’???????˛??Ǘ?Ĕ??Ș?Ș?ʚ??ə???ə???ʚ??Ǘ??̜?Ș?ʚ?͝?????Ԕ?SSSSSS?QQQQQQ??Ș?˛?????Ɩ???ə?Ĕ?ŕ?Ɩ???̜?PPPPPP?PPPPPP?А??˛?ə??Ș???ə????˛??̜?PPPPPP????ӓ?ϟ???͝?ə?̜?UUUUUU??Ғ????͝???]]]]]]?Ғ?̜?ə?ə?ə?ʚ?Ǘ????Ǘ?ə?Ș??Ǘ?Ξ???PPPPPP?͝??̜??ښ??̜?Ș???Ș???ə???Ɩ?Ɩ?Ǘ?͝?Ǘ?PPPPPP?ё???PPPPPP???Ș???Ĕ?̜??͝????Ɩ?ŕ??Ĕ?????????????Ɩ????ŕ??????Ǘ?Ɩ??Ĕ?’?Ĕ?ʚ?Ɩ?Ĕ????????’??????????????????????????????????????????????????̜???????????????Ǘ????’??Ǘ???ŕ?Ǘ?Ș?˛??˛?Ș??Ș???˛?ʚ?ʚ??ʚ?ə?Ș?ё?ʚ?А??䔔?YYYYYY?ё??А??А?ə?Ș???Ǘ????Ș??Ɩ??Ɩ??Ș?ʚ?ٙ?PPPPPP?Ξ?̜??QQQQQQ??Ǘ?ə???˛??ʚ?͝?˛??˛?˛????˛???PPPPPP?͝??Ǘ?????ə?QQQQQQ??tttttt?qqqqqq?Ғ?QQQQQQ??PPPPPP?Ș???ə?Ɩ??Ɩ?ə??????Ξ?Ξ?ə?????ʚ?ʚ????ʚ?ə????????Ξ?QQQQQQ??͝?ʚ??͝???Ξ?ə??Ǘ?Ɩ???????ŕ?Ĕ??Ó?????Ó??????Ĕ??????Ó???’??ŕ??Ɩ????ŕ?Ș???????Ɩ?????????????????????????????????????????????????͝?ӓ?ʚ?Ξ??Ș???????????????Ǘ???Ó?’???ŕ?Ɩ??Ș??Ɩ???ŕ???ə?˛??SSSSSS???ʚ?ʚ??ϟ?ϟ????ё?ʚ?А?̜?Ș??Ș??ə?̜?Ξ?Ǘ?Ɩ?ŕ??Ɩ????Ɩ??ʚ??ə???ʚ??˛?Ξ?ח?̜?˛??ʚ???ʚ??Ș???͝??Ξ????ʚ??ʚ??QQQQQQ??̜????RRRRRR?˛??Ξ?ə???ʚ???ə???PPPPPP?RRRRRR??͝??ʚ???ʚ?˛???Ǘ???ʚ?Ș?Ɩ?Ș??͝??̜???PPPPPP??˛??͝?̜?ə??Ξ?̜??ə?Ș??Ǘ?Ɩ?Ɩ???ŕ?Ĕ?Ó????????Ó????????’??????’?Ĕ????Ș?Ó?Ǘ??Ó???????’???ϟ??????????????????????????????????????????????????Ĕ????????’???ŕ??Ó???Ș?????Ǘ?̜?А???ʚ???Ș?Ɩ?Ǘ????Ɩ??PPPPPP?QQQQQQ??ə?ʚ?ʚ??̜??А?RRRRRR?Ԕ??˛??͝???А??ϟ?Ғ?VVVVVV?Ɩ?????Ș?ə?Ǘ?Ǘ??˛?Ǘ?Ș???˛?͝???Ғ?????????˛??????QQQQQQ????ə?UUUUUU????͝????ʚ?ʚ???А?˛???ʚ?ə?Ғ????QQQQQQ?Ξ?Ξ?ʚ?ə?˛???ə?ʚ?ŕ??Ξ??Ɩ????˛??ʚ???ʚ?Ξ??ϟ?PPPPPP??Ξ?ə???Ǘ?ə??Ĕ???Ɩ?Ɩ???Ó??’??????’?ŕ???????????????Ș??????’????????????????Ĕ???????????????????????????????????????Ó????????Ĕ??ʚ?????????QQQQQQ?????’????Ĕ?Ș?ə?PPPPPP?Ĕ?Ș?֖??Ș?ŕ???Ĕ???Ɩ?Ș?Ș?ə????А?А?̜???ϟ?̜?̜?Ξ??˛??͝???ϟ?ϟ?Ɩ?Ĕ??Ɩ??Ǘ?ə??Ó????????Ǘ???А????˛?UUUUUU?ϟ??Ș?ʚ??????ʚ?’???Ɩ?Ș?????̜???̜??Ξ?̜??SSSSSS??Ɩ?Ǘ?Ș????ϟ??PPPPPP???SSSSSS????ə?ə?Ɩ??͝?QQQQQQ??Ǘ????͝??ʚ??ܜ?PPPPPP?QQQQQQ???SSSSSS?PPPPPP???Ǘ?ʚ???Ó??ϟ??Ĕ???????????’?Ó?Ó??Ғ??’??????????Ĕ??????????????????????????????????????????????????????????????????ə??А???????????Ɩ?????’?Ó????ŕ?ϟ????Ó????TTTTTT?Ĕ?Ó?????Ǘ???RRRRRR?͝?Ԕ?А?ϟ?̜?????RRRRRR?ё?Ξ?ϟ?ʚ?А?WWWWWW?______??˛??Ɩ?Ǘ?ə??Ɩ??Ǘ?ə?PPPPPP?Ɩ???Ó?˛?Ɩ?ŕ??Ș??͝?А?ё??А??ə??ʚ?ʚ?˛?RRRRRR?ӓ????ŕ??ə?͝??˛????Ɩ?Ξ???˛??ə?RRRRRR?ϟ???Ǘ?ə??А???PPPPPP?ϟ?ə?Ș??SSSSSS?˛???˛?˛?̜?Ғ??Օ?QQQQQQ?Ξ???ʚ???֖??ё???Օ???Ș?Ș?̜?ŕ??Ó???ŕ????’????Ó?Ó???Ĕ??А????Ó???’?????????????????????????????’???????????????????????????????????????????????Ɩ????????????????Ó??’???SSSSSS?ϟ?SSSSSS?͝?Ǘ??ə??Ĕ?Ĕ??’?’?ŕ????ʚ??Ξ???˛?Ș?ʚ??ʚ?ٙ??PPPPPP?RRRRRR??QQQQQQ??Ξ?Ξ????Ɩ?ʚ????ʚ??RRRRRR??Ɩ?????Ǘ??Ɩ?Ɩ?ʚ?ʚ?̜?Ғ?͝?͝??ʚ???Ș?ʚ?˛??SSSSSS?А?PPPPPP??Ǘ??ʚ?̜???ə?????ϟ?˛??˛?Ξ???ŕ?Ĕ???ʚ???ə?Ș?Ș?ə?Ș?ʚ??ə?????Ș?Ξ?̜???ϟ????Ǘ?˛?Ξ?????͝?Ș?ə??Ɩ????Ĕ?Ĕ????????????????????????????????ŕ??????????????????????????????????????????????????????????????????VVVVVV?ŕ??Ó??????’????Ó???TTTTTT???֖?Օ?͝???ə???ŕ??ŕ??̜?????????˛??[[[[[[?ʚ?͝????VVVVVV??PPPPPP?XXXXXX??XXXXXX?̜?˛?ə?Ǘ??Ǘ??Ǘ???ё????????Ĕ?Ș?ŕ?ŕ?ŕ?????????˛??ŕ??Ǘ???˛?̜?ə??ə????Ș??Ĕ?????ʚ??ё???Ǘ????Ǘ?ʚ?ŕ???Ɩ???ʚ?ʚ???ʚ?VVVVVV?̜?Ǘ?ʚ?ə?ё????Ǘ?????Ș???̜??Ș???Ș?????ŕ?’?’?Ó?ŕ?’???͝??????????Ș????ʚ?????’???????’?Ó????????????̜??????????????????????????????????????????????????????????????Ó??Ĕ??ə???????????ŕ?ŕ??PPPPPP???????’???ə??˛?ŕ????Ǘ?PPPPPP??[[[[[[??ё???????ə?ʚ??Ɩ??QQQQQQ???ŕ??̜?̜?ʚ??Ș??Ĕ????Ɩ?Ǘ??ϟ??????PPPPPP??ʚ?ə??Ĕ?Ș???ə??ŕ?Ɩ?Ș?Ĕ???Ș????ŕ??̜??????Ș?ə?ə??Ș?Ǘ???Ǘ?Ξ???????ϟ?ə?ə?ϟ???ϟ?Ș????Ғ??͝??ə?͝??ʚ??ə??Ɩ??Ĕ?ŕ?Ԕ?ə??˛???Ǘ???Ξ?ŕ?????’?А?????Ĕ????’??’?????’?ŕ?Ó?ё???’??Ɩ??Ĕ????Ó???Ĕ?????????????????????????????????????????????????????Ó?Ξ?Ș???????????ؘ?ښ??Ó??’?Ș?Ξ?Ǘ??ŕ?Ǘ???????Ǘ??Ó???Ș??Ɩ??ŕ?ŕ?ŕ??ϟ??Ғ?А??Ⲳ?ݝ?ӓ???’??Ǘ?Ș???ə?Ɩ??А?˛?ё?̜?ŕ???Ɩ????Ǘ??ϟ?̜??ə???^^^^^^?Ғ?ʚ??Ó??ŕ?Ǘ?’???ŕ?˛???ə?ŕ?Ɩ?˛?Ǘ??Ǘ??ə??Ɩ?Ǘ?Ǘ?ə???Ǘ????̜?˛??͝??ϟ??͝?͝?̜??RRRRRR?Ǘ?ə?˛?˛?ϟ?ə??Ɩ?Ĕ?̜?ə?UUUUUU?Ș?ʚ??ə??Ș?Ó?Ξ?????’?QQQQQQ?Ș?Ó??RRRRRR?ϟ?Ș??ٙ?RRRRRR?Ĕ????Ó??[[[[[[?ŕ?Ó?’?ŕ???????’??????Ó?Ó?А?Ξ?Ǘ?Ĕ??????˛??А?’??????????????????????????????????????????????????????????????????????Ĕ???Ó???’?’?ŕ????̜??Ș??Ɩ?Ó????Ĕ???????QQQQQQ??Ș?ϟ?ə?Օ??А?Ξ??Ó???Ĕ?????͝??Ĕ?ŕ?Ǘ?Ó??ŕ?Ξ?ŕ??ŕ?Ș?Ș?˛?????ə?ZZZZZZ????????’???Ș??????Ó??ŕ?Ș?Ĕ?Ș????ŕ????ə?ʚ?ʚ?Ǘ?ə?ϟ?Ș???˛??ё??̜?˛??ϟ?ʚ???Ș?͝????˛?Ɩ??Ĕ?Ɩ??ə??’??Ó?????ŕ?’?Ó?Ĕ?ə??ŕ???????????Ó?Ó?Ó??̜?Ó?͝??????Ș????Ș????Ɩ?ŕ?Ғ??ŕ??ӓ??Ԕ?㓓?444444??˛??Ó????????????????????????????????????????????’??????????Ǘ????????????????Ó??????PPPPPP?ə?PPPPPP??\\\\\\??̜?̜??Ĕ?????’??Ĕ???Ĕ??ё??Ǘ????˛??Ó????Ɩ??Ș???’?Ĕ??Ĕ???Ĕ?Ĕ??Ǘ??ŕ?Ɩ?Ǘ???ŕ???Ĕ??ϟ???Ș??Ó?’?Ó?’?Ĕ??ʚ?Ĕ?Ĕ???ŕ?Ș??̜?Ǘ????Ǘ?Ș?Ǘ??Ɩ???Ș?ʚ??ʚ?͝??UUUUUU???ʚ?ٙ?ʚ???˛?˛?ə??Ș???Ǘ??Ɩ?Ɩ?????Ó??Ó?Ĕ??’?Ĕ???’??Ó???’??????ʚ??Ĕ???Ĕ????Ó?’?????Ǘ???Ĕ??Ș????ŕ????А?Ξ?Ξ?PPPPPP?Ԕ?̜?Ғ?______?Ⲳ?涶??Ǘ?Ó??Ș???????????????????????????????????????????????’???????????????Ó???????’???ə???ϟ??RRRRRR??PPPPPP?Ș???????????Ĕ?’??’???̜?Ș?RRRRRR?ӓ?Ǘ?Ș???ŕ?ŕ?Ĕ??Ĕ?Ĕ?ə?Ǘ???’???Ó??Ɩ????Ǘ?ə?Ĕ??ŕ??Ĕ?Ĕ?Ɩ??ə?ʚ??Ó???Ó?’???Ĕ?Ɩ?Ǘ?ŕ?ŕ?Ɩ??Ĕ?Ĕ???????Ǘ?????Ɩ??ŕ?˛?ʚ?Ξ????PPPPPP????˛??Ș??VVVVVV?˛??ʚ?ʚ?ə????Ș?Ó?Ó??????͝?’?Ó????’?????????VVVVVV?Ɩ???Ĕ????????Ó????ŕ????ϟ???????͝??????Ԕ???RRRRRR?qqqqqq?㳳??˛?Ԕ??????????????????????????????????????????????????????????????Ғ???ə??????????ŕ?ə?Ԕ?ߟ?Օ?Ғ?RRRRRR?YYYYYY??PPPPPP?Ĕ????????’??Ó?Ĕ???Ĕ?Ș?̜?ə?ŕ?Ĕ?Ĕ?Ó??̜?Ó????Ɩ????Ĕ?Ó???Ó?ŕ???ŕ?Ĕ?֖??Ǘ?ŕ?Ǘ?Ĕ??????’?????Ó?’??ŕ?͝??Ó???Ɩ?Ĕ???ŕ??Ó????Ș?ŕ??Ɩ??Ș??Ș??ӓ???͝?ʚ???Ǘ??Ԕ???Ξ??Ș??RRRRRR?XXXXXX?ϟ?Ǘ??Ɩ?’?Ĕ?ŕ?Ɩ?????’?Ó?????’????????Ó???’?’???PPPPPP???’?ŕ???Ǘ?Ɩ????Ó?ə????’???’???QQQQQQ?ښ??ᱱ?ܜ??SSSSSS??ؘ??ə?RRRRRR??ŕ???’?ӓ????????????????????????????????????Ɩ????????????????????????Ĕ????Ĕ?Ó?????˛?ə??XXXXXX?]]]]]]?Ғ????ŕ?????’???˛?PPPPPP???’??А?Ĕ?ŕ?̜?Ɩ?Ĕ?ŕ?????’???????Ó??’??’???????ŕ?Ĕ???Ó?????’?ə?Ĕ?Ó??Ĕ???Ĕ??Ĕ???ŕ?Ó??Ș?Ș???ŕ?’??Ғ?Ó???Ș???Ɩ?Ǘ?˛???Ș??˛?ʚ?˛?̜?̜???Օ?????Ǘ???PPPPPP?ə?Ɩ??Ԕ????Ǘ??QQQQQQ??’???ŕ?Օ?’?’?’??’?????ŕ????’???Ɩ??????PPPPPP??Ó?Ǘ?Ɩ?????Ɩ????Ó?’??ŕ?WWWWWW???SSSSSS?Ǘ?ٙ?????ə???ӓ?Ĕ??ŕ?VVVVVV????????????????????????????????????˛????????????????????QQQQQQ????ŕ??Ɩ?Ǘ??Ó?’????UUUUUU?ŕ?PPPPPP??????Ξ?????ŕ??Ĕ?????Ó??????Ĕ?˛??Ǘ??????’??Ɩ??????????????’??’??’??Ó?Ĕ?????ŕ?ə???????????Ĕ?̜?Ξ?Ɩ?Ɩ?????Ó???Ɩ??Ɩ??ʚ?TTTTTT??Ș???ŕ??Ǘ??????PPPPPP???RRRRRR??Ɩ?RRRRRR???Ĕ??Ɩ?Ǘ??’???’?’??Ǘ????????Ɩ??Ɩ??’??ŕ??Ǘ??’??ӓ???Ó?ŕ?’??͝?????Ó??????̜?????Ó?ӓ?Ó?̜???Ɩ?˛?ŕ?͝?’??Ǘ?’???Ó??????????????????????Ó?????????’?????????˛????????????????????WWWWWW?????’??UUUUUU?Ó???͝??PPPPPP?Ξ?????PPPPPP?Ɩ???Ǘ???????????’????Ó??Ĕ??Ɩ?ŕ??Ó???Ǘ??Ǘ??Ó??Ó??????????Ó???Ó?ŕ?????????’????????????ё???ŕ??Ĕ?ə?Ɩ?Ó????Ǘ????Օ???ʚ??QQQQQQ??͝?pppppp????˛???Ș?͝???Ǘ????Ó??????Ó??Ó?????????????Ǘ??????Ɩ???????ʚ?’???Ĕ??’?????Ș?Ó???????????ё???Ș?????˛??Ĕ?А?ŕ?????????????????????????????????????˛?????????????????????˛??Ó???????’?Ó?Ó?????SSSSSS???͝?Ξ????’???’??’?’????????’??Ĕ?Ó?Ó?????Ó??’?Ǘ????????????????ŕ?Ó?????????????????’?????Ĕ?ŕ?PPPPPP?ŕ?’?????’??Ș?͝?˛???Ԕ???QQQQQQ??Ĕ?Ĕ?Ɩ??ʚ?ё?ח?А???????’?Ó?Ǘ???????????????????????Ó???’??ё????Ș?̜??͝?Ĕ????ŕ??????̜?Ǘ?????????????’??Ɩ????????’?Ĕ?ə????????????????????????????????????????????????????????Ɩ?______?WWWWWW??????’????’??’?ޞ?PPPPPP?ʚ???Ɩ?ŕ??????????????????’??’???Ó????ŕ?Ó?Ĕ??Ș?????Ǘ?Ó???????????????????????????????’?’?Ó??Ɩ?˛????Ó?ʚ???Ș????ۛ?ݝ???Ǘ?Ɩ???Ĕ?ʚ??ŕ?Ǘ?Ĕ??Ǘ??’????’?????Ó????????????????ʚ???????Ĕ???Ǘ??̜?Ó???????’?Ó??????͝???’?Ɩ?ŕ?Ó???˛???????????Ĕ????????????????????????????????????????????????????????????Ĕ?’?Ғ???ʚ?????Ξ??????͝?Օ??ə?’????????Ĕ???????Ó?????Ó?????????Ĕ?’?Ξ??ə?ח????ŕ?Ó???????????????????Ǘ????ŕ?’??????????ə??͝?[[[[[[?SSSSSS?????Ǘ?Ș???]]]]]]???XXXXXX?YYYYYY??ə??Ĕ?Ĕ?’??Ĕ????Ó??’???’?ŕ?Ó???????????????????????????????Ғ??ʚ??RRRRRR??????????????????Ó?Ĕ?Ĕ???????’??????????????????????????????????????????????????????????????????Ĕ?????Ș????͝??Ǘ????????????????’????Ó????’??????????Ó?’??’?’??Ĕ?????????’???????PPPPPP??????????????????????????Ó?ʚ??Ĕ????’??Ó?ə?Ǘ??RRRRRR??Ⲳ??’?????Ó???Ó?’??Ș?Ɩ???ə???????’????????????????????Ĕ?????’???SSSSSS?Ɩ???????????????Ĕ??????????????????????????????????????????????????????????????????????????????Ɩ???VVVVVV???Ó?ŕ??Ɩ??ߟ?\\\\\\?ϟ??????????????’????Ĕ?Ó??ŕ???Ó?????????’???????????????????????????????????????Ɩ??????????????͝???????PPPPPP??ӓ???Ó???’??Ĕ?Ó?????ŕ?Ǘ?Ɩ??˛?YYYYYY??????????Ɩ?????????????????Ĕ?’?????˛???’??ə?QQQQQQ????Ó?’?????????????????????????????????????????????????????????????????????????????????????Ș?ZZZZZZ?Ș?ʚ?ʚ?ŕ??Ó?Ǘ?ё??TTTTTT??ʚ?????????????’?????’?Ĕ?????????Ǘ?Ĕ?’????????’???’??????’?????????Ó????????????????????????Ɩ???QQQQQQ????Ĕ?’??Ĕ??Ғ???ӓ?TTTTTT?˛?????Ș?Ξ??????????QQQQQQ?’??Ó?????????????????????Ĕ???????Ó?????ʚ?????????????????????ə?Ɩ????????????????????????????????????????????????????????????????????????Ǘ?ϟ?Ó???????ښ???SSSSSS??ŕ?????????????Ó?’??????Ɩ??Ș??̜???Ĕ?????????????Ó?’?????’????????????????????????Ó???????’???????????Ĕ?’???Ɩ????????֖??Օ???????????Ș??ŕ??????????????????????Ș??????????’?????Ĕ??????????????????????????????????????????????????????????????????????????????????????????ӓ???????Ĕ??VVVVVV???˛?Ξ??Ó????????????ŕ??’??Ĕ??’??Ș??ӓ?ϟ?А?ŕ?????’?’??????????????????’???????????????????????????????????????Ĕ?????????????͝???????’????????????????????????ŕ?????ʚ???????????????????????????TTTTTT??????????????????????????????????????????????????????????????????????????????ϟ?Ĕ???????Ĕ??????’????Ǘ????????????ə?????Ǘ?UUUUUU?ϟ?????????????’????Ĕ?Ǘ?Ǘ?Ǘ??Ó????’?????????????????????????????’????????????????????????????’?????????????????????????????????????????????????????Ǘ????????????????????????????????????????????????????????????????????????????????????͝?ё??͝????Ĕ??ŕ?Ó????????????’???????Ó?’???????Ɩ?ё???????????’?????????????Ó?????????????????????????????????????????QQQQQQ????????????????Ó????’???????Ǘ??????????????????????????????????????????????????????????????????????????????????????????????????????’?????’???’?’?????’?’????????Ɩ???????Ó??????Ɩ??Ó?Ĕ??Ǘ?ŕ??Ǘ?Ș???’??Ș?Ɩ?͝?PPPPPP??UUUUUU?^^^^^^??͝?̜??ə?ё??PPPPPP?ŕ?ŕ?ŕ?Ɩ??Ɩ??Ǘ???’?????Ξ?Ĕ?Ĕ??Ó???????Ǘ?ŕ???Ó???Ó??????’??Ǘ??Ĕ?Ó??ŕ???Ĕ?Ǘ?Ș?ʚ?Ǘ??Ș?Ɩ???Ɩ??Ș?Ǘ??Ĕ??Ǘ????PPPPPP?˛??Ĕ???’????Ó?͝??Ǘ?Ș?˛??Ξ?̜???????̜??Ó??????Ξ????ə?Ǘ?Ș??Ó?Ǘ?Ó?Ó?Ó?ə??’?Ó???????????????????????ŕ???????????????????????Ĕ??’???????????????????????’???’??’???????Ɩ???????????’???????Ĕ?ŕ?Ĕ?ʚ?Ɩ????ϟ??Ĕ?Ó?ŕ?ŕ??Ɩ?Ĕ?Ĕ??Ǘ?Ĕ??Ɩ????WWWWWW?ᑑ??А?????Ғ?̜?ə?ŕ?Ǘ??Ș?Ĕ?????Ĕ??????ŕ????????Ó???Ĕ?ŕ?Ó?’????Ĕ??’?Ó?Ĕ?Ó???’?’???Ó?ŕ?ŕ??Ș??Ș??Ɩ?????Ĕ??ŕ??Ĕ?ʚ?ŕ??Ǘ?ʚ??Ș???Ĕ?Ǘ??????ŕ?ə????ə?ӓ???RRRRRR??SSSSSS?ӓ?RRRRRR?Ξ?RRRRRR?ϟ??͝?͝?Ǘ??ӓ?˛??Ș??Ĕ?Ĕ????????Ĕ?Ĕ?Ó?’??Ĕ??????????????????????????????????????????????????????????????????????????????’?Ɩ????’??’????Ó???????Ș?Ĕ?Ɩ?Ɩ?Ó?Ĕ???А?Ĕ???????ʚ??Ó????Ó??Ó???RRRRRR??ӓ????Ǘ?????Ș????Ɩ?Ɩ?Ǘ?Ĕ?Ĕ?Ĕ?ŕ??Ɩ?Ó?Ĕ?Ó??’???Ó??ə?????Ĕ???’?Ș??Ó?Ɩ???’??Ĕ????Ǘ?Ɩ?ŕ?ŕ?ŕ?Ĕ?Ǘ??ə???ə?͝?Ș???̜?ə??Ș?͝??ʚ?͝??Ɩ???˛????Ǘ?ʚ?˛?????ʚ????Ɩ?UUUUUU??PPPPPP?RRRRRR?RRRRRR?QQQQQQ?Ξ???QQQQQQ???А??ϟ???̜???ŕ??Ɩ?Ș?Ș???Ș?Ó?Ǘ?Ĕ?????’???????????????????????????QQQQQQ?????????????????????’??????????????’???????????????Ó??Ĕ???Ó?????Ĕ?Ó?’?????’?ŕ??’?Ǘ?Ɩ??Ɩ???ʚ?˛?Ǘ?ə?Ǘ?ʚ?Ɩ?ŕ?’??ϟ??????Ó??????????UUUUUU??Ғ?SSSSSS???Ǘ?Ǘ?Ɩ?˛???ŕ?ŕ??Ó???????ŕ?’?ŕ?Ɩ?ŕ?Ó???????’?ŕ?Ó?ŕ?ŕ?Ó?Ó??ŕ?ə?ʚ??Ɩ?ə?Ǘ?ŕ??Ĕ??’??ŕ??Ɩ?˛??˛?ə?˛?PPPPPP?̜???????ə?̜?ʚ???ə?Ș??Ǘ???Ș?ʚ?Ĕ?’??Ș?˛???ə??Ξ??̜???XXXXXX???TTTTTT?ё?TTTTTT????PPPPPP??ϟ??Ǘ?ə??Ɩ?Ɩ???’?’?Ó??Ĕ??ə?’?Ó????????ŕ??????????????????Ɩ??’?˛????????????????????????????????Ó???’????Ó??’???????Ó????Ó????????Ó????????ŕ????Ó??Ǘ?ŕ??????Ș???ə?Ĕ?˛??’?Ó??Ĕ?Ó???ə?̜??Ș??ϟ??Ξ??ʚ?ə?ŕ?Ĕ????’??Ó????Ɩ???’??Ǘ??Ó?Ó????’??’??Ĕ????’?????Ó??Ĕ?ё???ʚ???Ǘ?Ɩ?Ó?Ó?Ó?ŕ??Ó??ŕ?ŕ??ϟ??ʚ?PPPPPP???̜???ʚ??Ξ??˛?PPPPPP?̜?̜?ŕ??̜?ə??ə????͝?????ʚ?˛??SSSSSS?Ԕ?XXXXXX???QQQQQQ??????͝?RRRRRR?ё???????’?????Ș?Ĕ??ə???????????????????????????ʚ?ŕ?Ó?Ɩ???????????????????????????Ș?????’????????Ó?’???????????????Ɩ???Ĕ??Ó?Ó?Ó?Ĕ?’???Ǘ??Ɩ??Ɩ??Ó?Ó???Ǘ??Ǘ????Ó?Ș?????ŕ?ϟ?Ɩ??ə?ə?ŕ?????Ǘ???ϟ????ŕ?Ș??Ó??’???ŕ?Ɩ??Ɩ???Ǘ??????QQQQQQ?????????Ó?’????Ó??ŕ????????ʚ?????Ó??ŕ?????ə??TTTTTT????˛?˛??QQQQQQ?ϟ???̜?QQQQQQ?ʚ?̜?ŕ???ϟ??̜???Ɩ???Ǘ??ϟ??SSSSSS?Ԕ?TTTTTT?Ԕ?RRRRRR?QQQQQQ??֖?Ғ??А??UUUUUU?Ξ??Ԕ???ə???ŕ??Ɩ??ŕ????’?’???????????????????????????Ɩ??????????????????????’??’?????’???Ó???????????????????????Ĕ?Ɩ????Ó?’?Ǘ??ŕ?’?ŕ?Ĕ??Ɩ?̜????’?Ɩ???Ĕ?’???ϟ?QQQQQQ?pppppp???Ɩ??????????Ɩ??Ɩ?Ĕ???Ǘ?ŕ?Ɩ?ə?ʚ???Ɩ?Ĕ??Ɩ???Ó?Ĕ??Ɩ?Ɩ?ŕ?PPPPPP???’????????????????Ĕ???????????Ĕ???ŕ??Ó??????Ș????Ɩ???ё?QQQQQQ??ё?ϟ?RRRRRR?͝?Ξ???ё??ŕ??ŕ??RRRRRR?Ξ???????ʚ??Ĕ??????UUUUUU?VVVVVV??SSSSSS?ё???PPPPPP??ё??Ғ?????Ǘ???Ǘ????Ó????Ĕ??’???????????????????????????????PPPPPP???????????????????’????????Ó???????????????????Ĕ??Ó??Ó???Ó????Ĕ?͝?Ɩ?????PPPPPP?YYYYYY???Ĕ???ŕ?Ǘ?ə?ŕ?Ĕ?Ξ???555555?VVVVVV?Ĕ?’???????Ș?ŕ??ŕ?ŕ??Ɩ?’?ʚ?Ĕ??ŕ?Ș??ʚ?ϟ?ӓ?ə?Ǘ??Ɩ??Ɩ???Ó????Ó?????????Ó?Ǘ????’??’?Ĕ????Ĕ?Ó??Ó????????ŕ??????ʚ?Ǘ??Ǘ??ŕ??ʚ?ϟ???ZZZZZZ?ӓ?А?QQQQQQ?PPPPPP??̜??Ғ?˛?Ǘ??Ǘ?QQQQQQ???RRRRRR?UUUUUU???Ɩ????Ɩ??Ғ?ё?ё??TTTTTT??֖?Ғ?ӓ??Ғ?Ԕ????Ԕ?????ŕ?Ɩ??Ó?Ș?????’???’???????????????????Ǘ?ŕ???????’?͝??????????????͝?SSSSSS?’??’????Ĕ????Ș????????Ĕ????????????????????Ó????Ĕ?А?ə??А?ə?Ɩ?Ԕ?Ș????Ș??ə?А??ŕ?ŕ??Ó?ə????Ǘ?Ɩ?Ĕ??????Ǘ???ŕ?ŕ???Ɩ???Ɩ?Ǘ????SSSSSS?ٙ??Ș??ŕ?Ĕ???Ĕ???Ĕ??Ĕ?’??Ĕ??˛???????’??????Ó?ŕ?’??????????’???????Ɩ??̜?˛???ə?ŕ?ŕ???ŕ??А????А?ϟ????ϟ??PPPPPP??ə?⒒??А????͝?Ó??ʚ?Ɩ??RRRRRR?PPPPPP?QQQQQQ?QQQQQQ??QQQQQQ??ZZZZZZ?______?ё??͝?]]]]]]???ё?А??Ғ??Ǘ??ŕ??Ǘ?Ș??????’????????????????????????????????????????????????????’??ə?ŕ?Ĕ????????????Ĕ??????’?????ʚ?????Ǘ?ŕ??А??Ĕ??ə?ё?ʚ?Ɩ?ŕ???Ș?????Ғ?Ɩ??ə?Ĕ????˛?Ĕ?Ó?Ó?Ɩ?ŕ???ŕ?ŕ?ŕ??Ǘ???Ș?Ó?Ó?Ĕ?Ó??Ɩ?ə?ۛ?XXXXXX???Ǘ?ŕ??Ĕ?Ó???Ĕ?????Ș???????????????’??’??Ó?Ĕ??Ó??Ĕ??’??ŕ?’?Ó??Ó?’?Ξ?????ʚ?ŕ?˛??????Ǘ?Ξ??YYYYYY??PPPPPP?TTTTTT?PPPPPP?PPPPPP??PPPPPP?ӓ??????TTTTTT?ϟ??А?QQQQQQ?PPPPPP?ʚ?Ó?’?ə?XXXXXX?????222222?????SSSSSS??ϟ?????ϟ??̜?Ξ?Ș??ŕ??Ɩ??’????Ó?Ó?????????’??????Ғ???????????????????????????’????Ǘ?????Ɩ?’????????????Ó???????’??????ŕ??Ǘ?˛?ё?ŕ?ʚ??Ó?Ɩ???ʚ???Ș?Ξ?Ș?????ʚ???ʚ?ӓ?PPPPPP??Ǘ??Ĕ?ŕ????Ǘ?’??Ĕ?Ǘ???Ó?ŕ?˛??Ɩ?Ĕ?Ó???????Ɩ?А?????Ș?˛?Ɩ???’?Ɩ???Ó???Ó?Ó?Ĕ??’???????Ǘ???Ĕ?Ĕ?’???’??’??Ó?Ĕ?Ó??Ó???????Ĕ??’????̜????ŕ?Ó??ё????QQQQQQ?QQQQQQ??Ғ?ϟ??ϟ?Ξ?ʚ??ə?˛?͝?______??Ғ?Ξ??Ξ????ё?ё?PPPPPP?RRRRRR????Ԕ?ё??ښ?Ғ??VVVVVV??ӓ?PPPPPP????Ǘ??˛???Ș?????Ó??А???????????????Ó?????????????ŕ?Ĕ?Ó????????????ʚ?????TTTTTT??’???ϟ?Ș??????????̜?Ɩ?’??’??????Ó???Ɩ?Ǘ?Ó??Ó??͝?SSSSSS??Ĕ?Ó?А?ʚ??ŕ??ŕ?Ș?ə?ŕ?Ǘ?А??Ș?ə???Ș??̜?ʚ?Ĕ??Ǘ??Ǘ?ŕ??Ó???Ǘ?Ș?ŕ??Ǘ????????????Ξ?Ǘ?̜?ޞ?ё??ŕ???ŕ?ŕ???Ғ?Ó?Ĕ????ʚ?’??’??Ĕ????Ó?’??’???’??Ĕ?’????????’?????ٙ???????Ǘ??ə?Ș?Ɩ???ə?˛???˛?ϟ???????TTTTTT???ə?Ǘ?Ș?Օ?Ғ??͝??????Ғ?Ԕ?ё???֖?Օ?Ғ?QQQQQQ??Ғ?ӓ?ٙ??ؘ?ZZZZZZ???˛?˛?????̜??Ĕ??Ó?̜?ʚ??Ǘ????????????’??????????????????????????????????’?Ɩ??ʚ?????????????Ó??Ɩ?Ĕ?’????????Ó??’?Ĕ?ŕ???ӓ???Օ??????????Ĕ?ə???Ĕ?Ó???ŕ???ŕ?Ó??ё?ʚ?Ɩ??????’??ʚ??ŕ????Ǘ?Ó?Ó?????????Ĕ??RRRRRR?ؘ?????????ŕ??????’?????Ó???????’??Ó????Ó??’?’??’????ŕ??Ǘ??Ș?ʚ?А?Ǘ?Ĕ???Ǘ??Ɩ??ŕ??Ș?Ǘ?ə??͝???ϟ??Ξ?PPPPPP?͝???PPPPPP??Ǘ???ٙ?̜???ח?????ϟ?͝???Ғ?qqqqqq?QQQQQQ?ϟ??ё?Ԕ??VVVVVV??ܜ??̜?RRRRRR???????̜??ŕ???Ɩ??’???????????????’??????????????Ĕ???????????????????˛?ŕ?Ș???’?Ó??ə??Ǘ?Ó???Ĕ???Ɩ?Ó????????’??????Ș??͝??Ɩ?А?̜????QQQQQQ?Ǘ??????]]]]]]?Ș???????Ó??Ĕ?Ó????????Ó????ŕ??????????????????ϟ?????’??Ǘ?Ǘ??ʚ????ϟ?Ó??’??Ș??Ĕ??’??’?’??Ó??Ĕ?’?????Ó??’?????ŕ?Ó??Ɩ?ə?Ɩ?Ș?˛?Ǘ??Ǘ?Ș?Ș??Ǘ?Ɩ??Ǘ??Ғ??͝?Ξ?̜??̜?ϟ?А??PPPPPP??˛?ʚ??̜????ӓ?SSSSSS??Ɩ??ə?Ξ??Ғ?YYYYYY??YYYYYY??PPPPPP?А?Օ?UUUUUU??ߟ?\\\\\\??????Ξ?????Ǘ?Ɩ???ə?ə??????Ó?’????????’????????????Ĕ??????????’??????????????????’?????????????’????Ó??˛????Ó?ŕ??ŕ?ə???˛?Ș?̜??ӓ?VVVVVV??ё?????Ó?Ó?????????Ó?????Ó??’????ə???Ɩ??͝????Ĕ???Ĕ??’???’????͝???ŕ?Ó?Ș????????˛??Ξ??Ĕ???’??ŕ????Ĕ??Ɩ?’?’??Ĕ?Ó?????Ó?ŕ?’??????Ĕ??Ș??QQQQQQ??Ș??ə???Ș???ŕ??ŕ?Ĕ??˛???А???TTTTTT?ӓ??͝??ə?Ǘ??̜?А?PPPPPP?QQQQQQ??˛????????Ғ?VVVVVV???Օ???SSSSSS??SSSSSS?Ғ??????Ξ?˛?Ș??Ɩ?????˛?Ǘ??’???Ĕ???ŕ???’?’???’??’???????????’??’???????????????????’??Ĕ???????’??????????Ĕ?Ó?????Ǘ?ŕ???Ɩ???ə?ʚ?˛?Ǘ???????˛????Ɩ?Ó?????????????’??ŕ?Ó??Ɩ???Ǘ????Ĕ?Ɩ?QQQQQQ?Ó?’??????ŕ???’?’???Ó???’????ə?Ó??Ĕ?̜??’????Ó??????ŕ??Ó?Ɩ??Ĕ????Ó?Ó?Ĕ?Ș????ŕ???????Ĕ?Ɩ???Ǘ?ʚ?ʚ?PPPPPP??ʚ???Ș???ŕ??????Ξ???˛?ϟ????ٙ?ə??????ʚ??˛???????ŕ???ח?֖?YYYYYY??qqqqqq?XXXXXX??SSSSSS?RRRRRR?PPPPPP???̜?̜?????Ǘ?Ɩ?Ɩ?Ĕ?ŕ?ə????’?????????????????????????’????????????????????Ó?????????̜??????’?????????????????˛?Ǘ??ʚ??˛?ə???Ɩ???˛?????Ó?’???????????Ɩ?Ǘ??Ĕ?ŕ???’??Ɩ?????QQQQQQ?Ĕ???PPPPPP????’?А??’????????Ó??Ó?????ŕ??Ó??˛???ə?Ĕ????ŕ?Ɩ????ŕ?ŕ?Ó??Ɩ?Ǘ??ʚ??ə??Ĕ??ŕ?’??????ŕ???’?͝?XXXXXX????ʚ??Ǘ?????????˛?PPPPPP??PPPPPP?̜?А?PPPPPP?̜???Ș?˛?ח??Օ??˛????̜?͝??ə?’?Ó?ӓ?ӓ???ᑑ??SSSSSS?UUUUUU??̜?˛?ə??˛????ə?̜??????ϟ?Ξ?????????????’????????????????Ǘ?’?????????????Ó?????Ó???????̜???????RRRRRR?͝???????Ĕ??Ĕ?͝?Ó????ə?˛?ʚ??Ξ??Ғ???Ĕ??˛?Ɩ?Ɩ?Ǘ??ŕ??Ɩ?Ș?????Ɩ??’???Ĕ?Ó?????Ó?’?’?Ĕ??’?Ĕ????Ĕ?????’??????’????’?????Ĕ?’???Ó???Ó?’??[[[[[[???ŕ?Ɩ?ŕ????ϟ??Ĕ???ŕ??Ɩ??ə???Ș?ŕ????’??Ĕ???????’?Ǘ??Ĕ?Ĕ?ŕ?ə?Ș?Ɩ?Ș?Ɩ??Ó?Ɩ?Ɩ??̜?ʚ?ӓ?͝???̜???̜??Ș????Ξ??ϟ?˛?Ș??ə?ʚ?ʚ?Ɩ????ё??Ԕ??????????ϟ?ə??ŕ??Ș?Ǘ??Ξ???’??Ǘ??????Ó???????ŕ?Ó??Ó????????ʚ????Ǘ?Ɩ???????????????????’??’???????Ĕ??Ĕ??TTTTTT??????????Ó??Ɩ????ŕ???????Ó??Ɩ?YYYYYY???ʚ?ʚ?ə?Ɩ?Ǘ?Ǘ????Ĕ?ŕ???Ó?’??ŕ??????Ĕ?Ó?Ó?ŕ??????’???’??’???’???Ó?????’???Ș???Ĕ??Ó???Ó????ŕ?Ɩ?Ɩ???Ɩ?Ɩ???Ǘ?ŕ?ŕ?Ĕ?Ĕ?Ɩ?Ș??Ǘ?Ș?Ș??ŕ?Ǘ?Ǘ????Ĕ?Ó??Ɩ?Ɩ?Ĕ?Ɩ??Ó??Ó???ŕ?ə???Ɩ??ŕ???Ĕ?Ɩ?͝?????Ξ?̜?˛?QQQQQQ??ϟ?ə??Ɩ??Ғ??ח?QQQQQQ??Ș?Ș?Ș??Ș??’?????SSSSSS???TTTTTT?Օ?SSSSSS?QQQQQQ?????˛???ŕ??????Ɩ?Ǘ?Ĕ?????’?Ó????????’?’?????????Ș???Ɩ?ə???????????’?????????????ۛ?ə???????’??????????Ó??Ĕ?Ǘ???????ϟ?Ξ?Ɩ?Ɩ??ŕ?Ғ???XXXXXX?ə?Ɩ?Ғ??Ɩ?Ɩ????Ɩ?Ș?ŕ???????’????ŕ?Ó??Ĕ??Ĕ?Ĕ???Ó????????Ɩ?Ĕ?’??Ĕ??’???’????’??Ĕ?’???Ĕ????ŕ?Ș?ŕ?Ĕ?Ó?????Ó?Ĕ???Ɩ?Ǘ???Ǘ?Ɩ?Ǘ?ə??Ș?ʚ??Ș???ŕ?ə?????Ǘ?ŕ??Ș?ŕ?Ĕ?’?ə?˛???ə?Ǘ?????Ǘ?ʚ?SSSSSS????̜?Ș?ʚ??ϟ?˛?ʚ?ʚ?ʚ???ϟ?͝???ə?ə???ʚ???ŕ?????ؘ?VVVVVV?TTTTTT?Օ?SSSSSS??QQQQQQ?͝?ə??ʚ?ʚ???ə?????ŕ?’?’??Ó???????????’??Ó???’???????????Ó???????????????ŕ???Ĕ?????????Ĕ???Ó??????’??Ó?Ó?’???????Ĕ?Ș??Ǘ??ə?ӓ???XXXXXX??777777?WWWWWW?????Ó???Ș?Ĕ?????ŕ???ŕ????’???ŕ?’?Ó?Ó??’???????’????????????’???????Ó?Ó?’??’?ə?ŕ?????Ĕ??Ó??????????ə??Ĕ??Ɩ?Ɩ????????ʚ?ʚ?ʚ??ə??ə?ə??ʚ??Ǘ?Ɩ???˛??˛??Ș?˛?Ξ?ə?ə????˛????Ș?Ξ?ϟ???˛??ə??ʚ?????̜???Ș??Ĕ??Ș????Ԕ??WWWWWW??Օ?UUUUUU?SSSSSS??͝?ӓ?ʚ?????ښ??????Ɩ????Ĕ????ŕ?ё??’?????????Ó?’?Ĕ?’????????’??????????’?????ʚ?’??????Ș?Ó??’????????Ɩ??ӓ??Ĕ?????ə??ʚ?ʚ?Ɩ?????QQQQQQ???[[[[[[???̜???Ǘ????Ó????????ŕ?Ĕ?Ó?Ó?’?Ɩ?’????????Ó??’???’??’??????Ɩ?Ó???Ó???’????Ĕ?ŕ?’??ʚ??Ĕ?˛???ŕ??????Ɩ?˛???Ș?Ǘ?????Ǘ????Ɩ????Ș?ʚ?ə?Ξ?ə?Ș?˛???˛?˛???Ǘ???Ș?Ɩ??ʚ?Ș??͝?Ș?͝?Ξ??ə???Ǘ???̜??ə??А??Ԕ?А????ʚ?͝???̜?ə?Ș??Ș?????˛?˛?????Ԕ??ӓ?Ғ?UUUUUU?ᱱ?Ξ???̜???ə?Ǘ??Ɩ?ӓ?ŕ?Ó?ŕ??Ș?????Ǘ?PPPPPP???????’?Ĕ????????͝????ϟ???????????’?????ܜ?Ĕ?Ĕ??’?’??͝?̜?Ĕ??????’?????????Ó??Ĕ?’??ŕ?ښ?ə???’???Ξ??ח?Օ???Ó??????Ó?Ĕ?Ĕ?????????Ó?’?Ɩ????’?????Ĕ???????Ɩ??Ĕ?Ĕ???????Ó?Ó?Ó???’??’??Ó??Ó?Ș???Ɩ?ŕ??Ǘ??Ǘ?Ɩ?Ɩ?Ș?ə??ʚ????????ə???Ǘ??ŕ?’??ŕ?ʚ?ʚ????Ξ?ё?̜????Ǘ????Ǘ????Ș???Ș?˛?˛??˛???ϟ?Ǘ??͝???̜??Ξ???͝???ϟ???ə?Ș?Ș?ʚ????Ĕ???Ĕ????\\\\\\??SSSSSS?TTTTTT???Ғ???͝?А??˛??Ǘ?Ɩ????Ɩ??ŕ?ŕ???????’???ŕ????????Ĕ?????Ó???ŕ?????????????Ó????ə?????ŕ???Ó?ŕ????’????Ĕ???Ĕ?’?Ó?’?Ó?ə???Ó?Ĕ??ŕ??Ó??ŕ???Ș?Ǘ??Ǘ?Ó????Ĕ?????ŕ?ə?Ș???̜?Ǘ?Ǘ????????’?’?ŕ??Ó?Ĕ??Ǘ?ŕ?Ó?Ó?Ɩ?Ǘ?????Ĕ??Ó?ŕ?Ó???’????Ɩ?Ó?Ó??Ó?Ó?ŕ?Ș???Ɩ?Ĕ??Ó???ŕ?Ɩ?Ǘ?Ǘ??Ǘ??Ș?˛??Ξ??Ɩ?ʚ?QQQQQQ??Ǘ?Ɩ???Ǘ?ə?????UUUUUU???Ǘ??????Ș??Ɩ?Ǘ??Ǘ?ə???ə?А???ʚ???Ǘ?ŕ?ʚ???ə??QQQQQQ??Ξ??Ξ?͝?ə??̜?˛?????̜???Ǘ??????ϟ?Ғ?ٙ???QQQQQQ??Ǘ?̜??Ξ?͝????Ĕ????Ĕ?Ĕ??Ǘ??˛?Ǘ?Ĕ?Ɩ?Ó?Ĕ?Ĕ?Ó?Ɩ?Ó??Ĕ????’??̜???Ĕ??????Ɩ???????????ϟ?WWWWWW?????Ɩ???Ǘ???Ó?Ó???Ǘ?Ĕ????Ó??????Ĕ????ŕ??Ó???Ó?’???Ó?Ó?Ó?????ё??Ș??ə??ŕ?Ǘ?????ə?Ș?А?Ɩ??Ĕ?????Ɩ????ŕ?Ș?Ǘ????QQQQQQ???Ĕ?Ĕ??ə???Ó?Ɩ??Ɩ???’???ŕ?ŕ??ŕ?ŕ?Ĕ??Ɩ??Ɩ??ŕ?ŕ??ŕ?ŕ?Ĕ??Ó???Ĕ?ŕ??̜??ə?ə?PPPPPP??Ǘ??Ș??Ǘ????Ǘ?????Ξ?ə?Ɩ?Ǘ?Ș?Ɩ???˛?ʚ?ϟ?Ș??ə?ə?Ș?ə??Ǘ??͝????ə??ə?ŕ?????Ξ?̜?ё???̜???˛?ʚ????ϟ??ʚ??Ș?Ɩ??Ξ???Ξ?RRRRRR???ӓ??˛?А????А?͝??ə??ŕ??ŕ????Ɩ??Ș??PPPPPP????Ĕ??Ɩ???’??’??????????????????ə?????Ǘ?̜??Ó?Ó?Ĕ??ʚ?Ș?ŕ??Ó??Ó?Ó????Ó?Ó?’??’???Ó?????Ĕ????’????Ĕ?Ó??Ĕ??’??ə????????’?ə?˛?Ǘ?Ǘ??Ɩ???˛???Ĕ?ŕ??Ó??Ĕ?Ó???ŕ??ŕ??ŕ??ʚ?Ɩ?Ĕ?Ɩ??Ș?Ɩ?Ǘ??Ș???Ĕ????Ɩ????Ɩ?ŕ??Ĕ???Ó?ŕ?????ŕ??Ĕ???ŕ????ə??Ξ??ʚ??PPPPPP??????Ǘ?Ĕ?Ĕ??????̜?А?ə?ŕ???Ǘ?ə?̜??˛?͝?ə??ə??Ɩ??Ɩ??ϟ?ϟ?̜?˛??Ɩ?Ó?ŕ??Ș???????͝?͝?˛?̜???˛??͝?˛?˛?͝?̜????̜????ח?Ԕ?ZZZZZZ???ϟ????Ξ????Ɩ????Ǘ??Ĕ?Ɩ?ŕ??????Ǘ???’???Ó??????????Ș????Ǘ???????????Ó????Ԕ??’???Ɩ?Ĕ??Ǘ???Ĕ??????????Ó??????Ó???’??????Ĕ?Ó?Ó?’????ə?VVVVVV???ə?̜?ŕ??Ɩ??ŕ?Ó?????PPPPPP?Ǘ??’?????Ĕ?Ĕ??Ĕ??Ɩ???Ɩ?Ǘ?˛?Ǘ?Ș??Ǘ??Ξ?͝???ŕ??Ǘ???ʚ?Ǘ??Ș?Ǘ?????Ș?Ș???????Ș?Ǘ?Ɩ?Ĕ???ŕ?Ξ?ə?Ș????SSSSSS???????Ɩ?Ɩ?ŕ??̜?Ξ??PPPPPP??ə?Ș?ʚ?QQQQQQ?Ș?Ǘ?ʚ?????????Ǘ?ŕ?Ǘ?Ɩ????ʚ?ə??Ɩ?Ó?Ó?Ǘ???ə??ϟ?ё??˛??̜?ə????Ξ?Ξ???͝?Ξ?ʚ?ə??ϟ?ё????RRRRRR??ӓ??????А????????Ǘ?Ǘ????ŕ??ə???Ɩ?????’??????’?RRRRRR??????Ó?ŕ??’?????????????Ғ?SSSSSS?PPPPPP?Ó?ŕ???Ǘ???????????????Ĕ???????Ĕ?ŕ???Ĕ????????Ǘ??ʚ?ח?666666?ᑑ??ʚ?Ǘ?ə???ə??’??Ș?Ɩ?Ξ?Ɩ?ə?Ĕ???Ĕ??Ĕ?ʚ??Ĕ????Ǘ?PPPPPP?ə?ə???Ș??Ɩ??ə??ə??ʚ?ə??˛?ə?ʚ????QQQQQQ???͝?̜??????????Ĕ?????˛?ʚ??Ș?Ɩ?А??SSSSSS???ŕ?Ɩ?̜???Ɩ??Ɩ?ə?Ǘ??????͝????ə?̜?Ǘ????Ș?Ș?????????ə?Ș?Ș?ə?Ó??ŕ?Ĕ??ə?ə?ϟ?А?Ξ?А?˛?̜????̜??ϟ???ϟ?А?͝??ə?????̜?ϟ?ϟ??TTTTTT??PPPPPP?QQQQQQ???QQQQQQ??ə?ʚ?ə????Ĕ?Ĕ???Ó?Ɩ?ZZZZZZ?Ǘ??Ɩ?Ó??’?Ó?Ó?????’?’????Ó?Ɩ????’??Ó?Ǘ??????????͝???Ǘ?Ș???\\\\\\???’???????Ĕ???????Ĕ?’???????Ĕ?Ó?Ɩ????ŕ?Ɩ?????А???뻻??ϟ?Ξ??ə??Ș?ə??Ǘ??Ɩ?ə???????Ș????ŕ??ŕ??Ǘ?ə?QQQQQQ?Ɩ?Ǘ?Ǘ?͝?͝?͝?ʚ???Ǘ?Ș??ʚ?Ș?ϟ??А??ϟ??Ξ???˛??̜??ə?ə?˛?Ș?Ξ?Ɩ?ŕ??ŕ???Ǘ?Ǘ?Ș????ё?Ș?͝?А???Ǘ?Ș?????????̜?????ё?ə?˛?ʚ????ʚ?͝?ё?ə??˛??ə?ʚ?????ʚ???ŕ??Ǘ?ŕ?Ɩ?Ɩ???????͝??ϟ?˛???˛???А?Ξ??ʚ?ʚ??Ԕ???А??Ξ?ϟ?ё??????RRRRRR?ə?Ș??ə?ə?Ș?ŕ??????̜??А????ŕ?Ó???????Ɩ?’?Ó??Ĕ?Ó?Ó?Ó?Ĕ????’?Ó???????????Ó?Ɩ?????????????’????’??Ó?’??ŕ?’?’?Ó?’???Ș?̜??ŕ?’?Ó?ŕ?Ó???Ș???ϟ?[[[[[[?999999?666666???????????ə??ŕ?Ĕ?Ĕ?Ș?͝?ŕ?ŕ?ə???Ș??Ǘ?Ɩ?Ǘ?ŕ?Ĕ????Ș??????˛??????ʚ??Ξ?????̜?ə???ʚ???ŕ????Ɩ???Ɩ??Ɩ??Ɩ??Ɩ?Ǘ?ŕ???ə???Ɩ??PPPPPP?˛????Ĕ?????Ĕ??˛?ё?Ξ?ə??PPPPPP?̜?ə?˛?QQQQQQ???˛?ʚ??????ə???Ξ?ə???ŕ??Ó??Ș??˛?VVVVVV?˛?˛????͝?͝????ə????????TTTTTT?А??Ξ?ӓ????ٙ??㓓??Օ??ə????͝?˛?Ǘ???ŕ??????PPPPPP?’???’????Ó???????Ĕ?’?????ŕ????????????????????Ξ?’????Ĕ??????’?Ó???????’??Ó???̜?֖??Ĕ??Ó?Ó?Ó?Ξ?ŕ???Ξ??TTTTTT???Ғ?̜???Ș???Ξ?А??̜?˛????А????Ɩ???˛???Ș????Ș?Ș?ə?ə???̜?????ʚ?Ș??̜?˛???RRRRRR?˛????ŕ???Ǘ?Ɩ?ŕ?Ɩ?Ɩ?WWWWWW?Ș?Ǘ??Ș????Ș??Ǘ?ŕ???Ș???Ș?Ξ??̜???????’???ŕ??QQQQQQ?????’?ə??Ș?ə??̜?ё?PPPPPP??ə?̜?ə?Ǘ??ə?ə?PPPPPP??Ɩ??Ɩ?Ǘ?’?Ɩ?Ɩ?Ɩ??Ξ?̜??QQQQQQ?̜?̜?????̜?ʚ??????̜?ʚ?ə??Ǘ???QQQQQQ???RRRRRR?ٙ??????????ə??Ș?’???????Ĕ???’?????Ó??Ó?Ó??Ó????Ó??ŕ??’?ŕ????Ĕ??????????Ó????’?????????Ó???’?’???????Ó????Ĕ?Ó?Ǘ???????ŕ?ə?????ښ??Ξ?ϟ??ə????ŕ?Ǘ??ϟ???ӓ?QQQQQQ??ʚ?Ș???ŕ?ŕ??’?Ǘ?ə??ə?Ɩ?Ǘ?ə??Ɩ?ʚ?͝???̜??͝???˛?˛?????̜??ə?Ɩ?Ǘ????ӓ?Ɩ?Ǘ?Ǘ?Ɩ?Ș?ʚ?Ǘ?Ș?ʚ?Ș?????Ș?????Ó?Ó????VVVVVV?TTTTTT?ə???Ó?Ĕ????????ə?͝?????ŕ?ʚ?˛?ϟ???А?˛?Ǘ?Ĕ?????Ș???Ó?ŕ?QQQQQQ?ŕ??’?Ĕ???ё?̜?SSSSSS?ё?Ғ??Ξ?ʚ?Ș??̜??ə??ə???̜?Ғ?Ǘ??Ș????˛?˛??Օ?YYYYYY?Ⲳ?ర???SSSSSS?Ξ???ʚ????Ĕ???????Ó??Ǘ?Ó?????????????’?Ó?ŕ?ŕ?Ɩ?Ó?ŕ?Ó?ʚ?˛?̜??Ó?????????????????????Ɩ??????Ó?????ŕ??????Ĕ??Ĕ?Ó?ŕ?ŕ?˛??Ξ?QQQQQQ?ӓ?ӓ??̜?ӓ??ʚ?ŕ?Ǘ??͝??̜???ʚ??????’??Ĕ??Ș?Ĕ??̜??ə???ə??͝?˛?˛??PPPPPP???Ξ??ʚ????͝???Ș??ʚ?ə????ə??˛??˛??Ǘ?Ǘ?Ǘ?????ə?ʚ????Ɩ????Ĕ??’?Ș?ʚ????ZZZZZZ?Ɩ????Ó?Ĕ?’??ə?Ș??????Ĕ?Ɩ??ə?QQQQQQ??͝?Ξ?ʚ?˛??Ǘ?ə?Ș??????’??ə??’?̜???RRRRRR???QQQQQQ?Ξ??̜???Ș?ə??ʚ???ə????ϟ?͝???’????ə??ߟ?䔔?ښ?VVVVVV?А????Ɩ?ʚ??̜???????Ó??Ó?ŕ???’????’??’??????’?Ĕ??Ĕ?ŕ?ə?RRRRRR??Ó????Ó???????????????˛?Ó????’?̜??Ɩ????ə??Ș??ŕ??Ó?????’?Ĕ??ŕ???Ó?’??͝???ə???Ǘ?PPPPPP?Ǘ??͝?PPPPPP??А????ə???Ș??Ĕ?Ĕ??Ó?ʚ?ŕ????ə???͝?UUUUUU?PPPPPP??̜???̜??????̜??ʚ?͝??Ξ???̜?Ș??ə?̜??ə?ə?ə?ʚ??ʚ?Ș??Ɩ?Ɩ?ə????Ș?Ș??Ɩ????Ĕ?Ǘ????Ξ????Ǘ?Ǘ?Ĕ?ŕ?ŕ??Ғ??ʚ?˛????̜?˛?Ɩ????Ș?????VVVVVV?Ș??Ɩ??̜?RRRRRR?Ǘ???Ɩ??ŕ?Ǘ?А?Ó??????͝??ʚ?̜???ʚ?Ǘ??˛??˛??̜???PPPPPP??Ǘ?????’??ర????ӓ?PPPPPP??А?ə??Ǘ?Ɩ?Ǘ?Ó?ə??Ó??Ɩ??’?ŕ??Ĕ??ŕ???????????’?Ĕ?Ș?Ɩ?ə?WWWWWW?Ξ?????’?????Ĕ??????Ĕ?Ó?Ĕ?̜??RRRRRR?Ɩ?Ó??Ó?Ɩ??????????’??Ș?’????Ș??Ĕ?˛??????’???Ó????Օ??ə?˛?ʚ?UUUUUU??ϟ?WWWWWW?˛?ʚ?͝?ə??˛?Ș??????Ș??ə?ə?̜?Ξ?͝???ё?͝??ϟ?͝??͝??͝?͝???Ξ??ə????А?̜?ʚ??̜?͝?ʚ????̜?ϟ???ə??Ɩ?ŕ?ŕ?RRRRRR??ʚ?ŕ?Ǘ?Ǘ?????ə??????PPPPPP?Ș?Ș?Ǘ?Ɩ??Ɩ?????ŕ?˛?Ș?Ș?’???Ξ?Ș??ʚ?˛?Ș???ʚ??ŕ?Ș?????????Ǘ???ŕ??Ĕ????̜?̜?Ξ?˛?˛?˛?ʚ?ʚ?ʚ??˛??͝??ϟ?А??͝?Ɩ?Ó???Ș??̜???UUUUUU??Ғ??Ғ?????Ǘ?ə??Ɩ?Ĕ?’???????Ĕ?Ó??Ó?Ĕ????????’???Ó??’??Ǘ?’?ə?Ɩ?Ș?Ɩ?’?Ó?Ɩ???????’?Ó?Ɩ?ŕ?’?Ș???’???????????ŕ?’?’??Ș?ŕ?’?????Ó?ŕ???ŕ?Ó????’?’?Ĕ???Ғ???̜??͝?͝?ё??Ԕ?̜??Ξ?PPPPPP??Ɩ??Ș???ə??ə??Ξ??͝?͝??PPPPPP??ё?Ξ??А??̜??Ξ???˛???А?А???ϟ???Ξ????ʚ?̜??̜?ə?˛??Ș?ə????ŕ?Ĕ???ŕ?????Ș?Ș?ʚ??А??ё??ё?Ǘ????͝???Ǘ?Ɩ?Ɩ?Ĕ?Ǘ????ϟ?Ó?ŕ??˛?Ɩ?ё?Ǘ??ə?Ɩ???????Ó???ŕ??Ɩ????Ó??͝?ə???ə??˛??˛?Ξ????̜?Ξ??ϟ??̜??ŕ?Ó???RRRRRR?ə???PPPPPP?Օ???WWWWWW?Ξ?˛?Ǘ?Ɩ???Ξ??Ș?Ɩ??Ĕ?Ɩ?Ĕ??????ŕ?ŕ????ŕ???Ĕ?’????Ó????Ɩ?TTTTTT??˛?ŕ?Ĕ???????Ĕ?Ó??Ĕ??Ĕ?’?Ĕ?ŕ?͝????’?Ó??Ș?????ϟ????ŕ?˛??Ó?’????Ĕ?ŕ??Ǘ???Ɩ?Ó?????Ɩ?̜??ϟ??Ξ?Ξ?QQQQQQ??Ș???ə?̜?QQQQQQ?̜????̜??͝?̜???ϟ?ϟ?ϟ?????QQQQQQ???SSSSSS???͝?͝?Ξ??ӓ??͝???PPPPPP??RRRRRR??Ԕ??Ξ?̜?͝??QQQQQQ?˛?RRRRRR?ϟ??PPPPPP?͝???Ș??ŕ????ŕ?Ǘ?Ǘ?Ș?Ș??Ș?Ǘ?ŕ??????PPPPPP????ϟ?͝?Ξ?Ș?Ɩ??Ɩ?Ǘ?ё?Ɩ??’?Ǘ?Ɩ?Ĕ?Ɩ?ʚ?QQQQQQ??ŕ?Ĕ???Ɩ??ʚ?????Ξ?????ŕ????Ĕ?Ș??̜?˛?????Ξ?ʚ??˛?PPPPPP?̜??????’??Ș??ʚ????А?ϟ?ӓ?ٙ?Ғ?SSSSSS??˛???˛??Ș?Ǘ?ŕ??????Ĕ?Ó??Ó?ŕ?Ĕ?Ó?Ó?Ó???Ó???ə?Ɩ?’???’??’???ŕ?Ó?????’?????Ș?Ș?ϟ???????????Ó???Ó?Ó?̜?ё??Ș?ə?ŕ??????’???Ɩ???ŕ?’????Ɩ??Ɩ?Ǘ??Ș?˛????TTTTTT?̜?А???ʚ???????̜?͝?RRRRRR?ə??А????ϟ??QQQQQQ???RRRRRR??ё???ё?Ԕ?RRRRRR??QQQQQQ??ё??QQQQQQ??ϟ?Ғ????ӓ??А???˛??˛?????̜?˛???Ǘ?ə?Ǘ?Ǘ?ŕ??ŕ??????Ĕ??ŕ?ə?ё?ə?Ș??˛??????Ș??Ɩ??SSSSSS??̜????ŕ?Ș??Ĕ??Ó??Ó?????Ș?Ǘ?Ɩ???ə??ʚ??ʚ?ʚ????Ξ?ʚ?˛?ʚ?ə?˛??ə???PPPPPP??XXXXXX?????̜???Ĕ??????Ξ??Ԕ??Ԕ??Ξ???ə?ʚ?Ș????Ɩ??ŕ????ŕ??Ǘ????Ó?Ó??’?????ӓ??Ĕ??Ĕ??Ó????Ĕ?’???????Ɩ??’???QQQQQQ??’?’?Ĕ??’???’?’?’?????Ξ????????’??’???Ó??’?ʚ??????Ĕ???Ș?ʚ?Ș??ə?Ξ?͝???̜???PPPPPP???ə?ə????̜?͝???PPPPPP?QQQQQQ?А?QQQQQQ?????ӓ???RRRRRR?SSSSSS?PPPPPP??RRRRRR??XXXXXX?????ӓ??Ғ?SSSSSS???Ғ?SSSSSS???????ʚ?˛?͝??Ξ???˛?̜?ʚ?˛??Ș?Ș?Ș?Ș?Ș????Ĕ???Ĕ??Ξ?ʚ?ʚ??Ɩ?ə??ʚ????Ș?Ș?Ș?А????ə?Ș??ə?ʚ?Ǘ?Ș?????Ǘ?Ɩ??Ș?ŕ?Ǘ???ʚ???Ξ?Ԕ????Ĕ??Ǘ????˛?̜?͝???ə?Ξ??????˛??Ș??Ĕ???Ó??ŕ?̜???TTTTTT??ё?̜?͝?Ș??ə?ŕ???Ǘ??Ó?ŕ?’?????ŕ???’????’???’???Ɩ?Ǘ???Ó??????’??????ə??????????????????’??Ó??PPPPPP??Ғ????Ĕ?’???ŕ?Ξ?Ĕ?Ó???’???????ʚ???Ԕ?̜??PPPPPP?ӓ?PPPPPP?ʚ?ϟ?Ξ?˛?ϟ?????ё???̜?ϟ?????Ξ???QQQQQQ?Ғ?Ғ???UUUUUU??ϟ??Ғ??XXXXXX?Ғ???RRRRRR??Ғ??ӓ?ӓ?Ғ?Ԕ?SSSSSS???ё???RRRRRR?????ϟ???͝??˛?ʚ?ʚ???Ș?ə??ə?????Ǘ?Ɩ???ə?˛??????ə?˛????Ǘ?͝?͝??QQQQQQ???ʚ?Ĕ???PPPPPP?ŕ?˛???Ǘ??Ξ?ʚ??Ғ??TTTTTT???ʚ???͝????ŕ?ə?˛???˛?Ǘ?ə??ə??˛?????˛?̜?͝??Ǘ?ŕ??Ó??Ĕ??ŕ??RRRRRR?Ξ????͝?ə???Ș?ʚ?Ɩ?Ș??ŕ?????’???’?’????????’??Ĕ????????Ǘ?ʚ??’?’???????ŕ?Ξ??’??????Ĕ?’???’???????Ó?ϟ??ŕ?͝??Ǘ??Ș?Ó?’???Ó??’????Ó??Ɩ?ŕ?ə???˛????ӓ??Ξ?̜??А??PPPPPP?RRRRRR??Ξ?????֖???Ғ?˛??ə?ϟ?ϟ?PPPPPP?PPPPPP??А????SSSSSS?PPPPPP?ӓ?QQQQQQ?ח?А????Ғ?SSSSSS??TTTTTT?ӓ??Ғ?????А?̜?̜?SSSSSS?̜?ə??͝??RRRRRR?QQQQQQ?ϟ??͝?͝???˛?̜?А?̜??ə?ϟ????ə??Ɩ?˛?͝?̜?̜???˛?ʚ?̜?ə?Ǘ?ə?˛?????А???Ș?Ǘ?????Ɩ?Ǘ?ŕ?Ǘ????ə?ə?ӓ?˛???ə??˛??ə??Ș??̜????Ș????А???А??Ξ?Ξ?ʚ?˛????Ǘ?????Ĕ??̜??QQQQQQ??˛??????ŕ?Ĕ?ə??Ǘ??Ĕ?Ó??Ɩ??Ɩ????????????Ș???Ɩ?’???Ĕ???’???А?????ŕ?ə?ʚ?’???Ó?Ĕ???’?ŕ?????????˛??Ĕ?ə??Ɩ???PPPPPP?А???Ĕ?’???Ĕ????ŕ????ə?????TTTTTT??[[[[[[??SSSSSS??Ξ??ё?А???Ξ??ə???PPPPPP?ϟ????Ξ?PPPPPP??͝??Ξ??TTTTTT?ZZZZZZ?ё??ϟ?QQQQQQ???Ғ?ё??RRRRRR?Ғ?UUUUUU??ӓ?TTTTTT?TTTTTT???RRRRRR?SSSSSS?PPPPPP?͝??˛?QQQQQQ??Ғ?˛?ϟ?SSSSSS??Ԕ?UUUUUU??VVVVVV?ё?Ξ?ё?͝??͝???Ξ???ё??????̜?̜?̜?̜?Ξ??Ξ??̜?͝??Ξ?ϟ?Ғ??͝??˛???Ș?Ș?Ɩ???????Ǘ???Ș?Ǘ?˛?А?PPPPPP?Ξ???ё?ʚ?????PPPPPP??ʚ?ə??ə?Ǘ?А??ϟ?Ξ?А?̜?Ξ?Ξ???ə??Ɩ?˛?????Ș??Ǘ?͝??ʚ??˛??ʚ????Ș?Ǘ???˛??’??ə?Ó?Ó?Ó???????’??’?Ș??Ԕ??Ó????????’??Ĕ?????????PPPPPP?Ɩ?????͝??Ĕ???’???Ó?ϟ?’???Ĕ??Ǘ?????ŕ?Ĕ?????Ó?????͝?А?YYYYYY?ə??????QQQQQQ?ӓ??ё?PPPPPP??̜?ϟ???А?SSSSSS????Ξ?QQQQQQ?Ξ??SSSSSS?Օ????͝???Ғ?QQQQQQ?Ғ????QQQQQQ???RRRRRR??ӓ?Ԕ?TTTTTT?Ԕ??ٙ?Օ?Ԕ?ё?RRRRRR?Ғ?SSSSSS??ə?Ș?ϟ?????QQQQQQ??֖?UUUUUU?SSSSSS?????Ғ?TTTTTT?QQQQQQ?Ξ???ё?А??˛?Ξ??͝???̜?Ξ??ϟ??RRRRRR?А?ё?PPPPPP??̜?PPPPPP?Ξ?????QQQQQQ??????Ĕ?Ɩ?ə?Ș??PPPPPP???˛?ə?ə?ŕ?ə??ə?˛?˛?????Ș?Ǘ?RRRRRR???˛???ʚ???????ϟ?͝???̜?ə??Ș????Ĕ??˛??Ǘ??Ș??RRRRRR???̜?ŕ????Ș??͝????’?????????Ș??’??Ǘ????ə???????Ó??????’??Ɩ?????˛???Ĕ????’???’???????????????Ɩ????Ĕ??ʚ??’??˛?̜???Ξ???QQQQQQ??WWWWWW?VVVVVV?QQQQQQ???ə???̜?˛????Ξ?ϟ?VVVVVV??А?PPPPPP??ӓ?ۛ?^^^^^^?ϟ?Ξ?̜?ϟ?А?QQQQQQ?ё??Օ?[[[[[[?ؘ???XXXXXX??Ғ??YYYYYY????֖?ӓ????SSSSSS?Ԕ?????SSSSSS?֖?UUUUUU?TTTTTT??ӓ?֖??TTTTTT??Օ?Ғ?֖???RRRRRR??PPPPPP??А???ӓ?ϟ?͝?А?˛?͝??ϟ????ϟ?QQQQQQ?ё?QQQQQQ??PPPPPP???ə???А?Ș?ʚ?Ξ??̜?Ǘ???ə?ə?ə?ə?ʚ?Ș???ə??Ș???????ʚ???˛?????͝?PPPPPP??Ғ?SSSSSS???Ɩ????͝?ϟ?ϟ?˛??ŕ??Ó????Ǘ?Ǘ?̜?????˛?̜????ŕ?ŕ?˛?Ǘ???Ó?’?Ó?Ó?????’???Ɩ??’?Ó??Ĕ??Ó?Ó?’?’?????????????????Ɩ?Ɩ?ŕ?Ó?Ǘ??’?????’?’???????Ĕ????’?Ĕ??ə??????Ǘ???????ӓ??PPPPPP?ϟ????͝?͝???̜?Ғ?͝?Ξ?PPPPPP???ʚ????͝???̜?ӓ?SSSSSS???PPPPPP????TTTTTT??SSSSSS?֖???Օ?SSSSSS?Ғ???֖?ؘ?????ӓ?Ғ???VVVVVV????TTTTTT?֖????______?Ԕ?ٙ????UUUUUU?UUUUUU?ח?TTTTTT????PPPPPP??PPPPPP?Ξ??QQQQQQ???QQQQQQ??ə??PPPPPP???QQQQQQ???PPPPPP??PPPPPP?ϟ???˛?Ξ????????˛?̜?Ș??Ș?Ș?Ξ?Ș?͝??ʚ?ʚ?̜??ʚ?ə????Ǘ??ŕ?Ɩ?̜??˛?ə?͝?˛??̜?Ξ???˛??????Ξ??Ξ?͝???ϟ???’?ə?????А??Ξ?̜?͝?ə?ŕ?ŕ??ŕ??Ĕ??Ɩ???????’?’?????Ó??Ĕ?Ĕ?Ĕ?Ĕ?Ó?Ó??????????????Ó??’??????????Ĕ?Ó?Ó?Ĕ??Ĕ???????Ó?????????ϟ?ʚ??ŕ?ʚ???PPPPPP?QQQQQQ?PPPPPP??ё?QQQQQQ???XXXXXX??А????PPPPPP??ё??PPPPPP?PPPPPP???ϟ??RRRRRR??PPPPPP???PPPPPP?˛?А?ӓ???SSSSSS?XXXXXX?ݝ???֖??ٙ???YYYYYY??YYYYYY?֖???ӓ?TTTTTT?RRRRRR?Ғ?SSSSSS?SSSSSS?TTTTTT??UUUUUU???VVVVVV????ᱱ?ؘ?WWWWWW?YYYYYY??嵵??ؘ?UUUUUU???TTTTTT????QQQQQQ?͝?ϟ???RRRRRR?ё?UUUUUU????˛?Ξ?QQQQQQ???А???̜?А???͝?͝??͝?ϟ?Ș?Ǘ????ϟ???Ș??ʚ??͝?ə?Ɩ??Ș?˛?ə??ʚ??ʚ????Ɩ?Ǘ?????ϟ?ʚ?PPPPPP??Ξ?Ɩ??ə????͝?ё???ё?\\\\\\??ʚ??ʚ????Ĕ?ə?͝??ё?QQQQQQ?Ξ?͝??Ɩ??Ĕ??Ɩ?Ɩ?Ǘ?ӓ?Ɩ?Ɩ??’?’???’???’??Ó???PPPPPP???Ɩ?Ĕ?Ɩ?????????’?????ʚ???Ǘ???’??????Ó??Ó?’?’???????’?Ó??????Ɩ??˛??ə?Ǘ??Ɩ?ʚ?̜?TTTTTT???̜?͝?????XXXXXX?Ξ??PPPPPP?RRRRRR?QQQQQQ?͝?ϟ?ё??А???Ғ?А?RRRRRR?ё???Օ?RRRRRR??Ғ??______??ܜ?????ܜ?????ܜ??ؘ?֖?YYYYYY??UUUUUU??ZZZZZZ???ח?VVVVVV??Օ?Ԕ?Օ?ٙ???ؘ?????PPPPPP?uuuuuu???UUUUUU??ӓ????UUUUUU?QQQQQQ?̜??QQQQQQ??ӓ?Ғ?Ғ?SSSSSS?Ғ???PPPPPP????͝??Ș??˛?Ș?ʚ??Ԕ?̜??˛???Ɩ?Ĕ?Ș?ə??̜??ə???̜?????ə?ʚ?ə????˛?????Ɩ?ϟ??ё???Ɩ???ŕ?ŕ?ə??˛?͝?Ξ?͝??А?А?Ξ???ə?̜???Ĕ?͝??͝?????͝?˛?ŕ??Ɩ?Ǘ??Ǘ????ʚ?’??Ĕ?’????Ș?ŕ????’?’????’??’?’?’????ʚ?????????Ɩ?ŕ???’?’???’???Ǘ?’?Ó??Ó????Ɩ???ŕ?ə?Ș??????Ɩ???Ǘ?Ǘ?????ϟ?͝??ə?ə?̜?ϟ??֖?А?Ξ?????ё??[[[[[[????PPPPPP??ё?SSSSSS?֖??RRRRRR?Ғ?TTTTTT?Ғ?XXXXXX?蘘??SSSSSS??^^^^^^??333333?SSSSSS???qqqqqq?㳳??000000?֖??ח??[[[[[[??????ٙ??\\\\\\??Օ?Օ?SSSSSS?RRRRRR?ښ?ܜ?ݝ??Ғ?XXXXXX?ZZZZZZ?^^^^^^????UUUUUU?Օ??WWWWWW??Ԕ?SSSSSS?????????ӓ?Ғ???А????̜?QQQQQQ??????˛??Ξ?ʚ?˛?̜??ϟ??PPPPPP????????͝???˛?͝??ə??̜?˛????˛?̜??????ə?Ɩ?ə??’?Ǘ??ʚ???ϟ??ϟ?ϟ?˛?˛??˛?ŕ???????Ξ??ϟ??А?˛?Ĕ?Ɩ??ʚ?Ș?ŕ????ŕ??Ĕ?ŕ??’???Ǘ??????????Ó???Ó?????Ó???????Ó????Ɩ?’???’??Ɩ?˛?ŕ?Ș?Ĕ???Ó??’??????ʚ??Ó???ʚ?Ĕ?Ș?Ǘ????Ĕ???Օ??ʚ?ə?Ș??Ș??Ɩ??????˛?????Ғ?Ғ?Ԕ??А??Ғ??ё??QQQQQQ?SSSSSS?Օ??䴴???ݝ???333333?999999?000000??]]]]]]?222222?ۛ??ZZZZZZ??ӓ?XXXXXX???UUUUUU????ర?ܜ????UUUUUU?????pppppp?ښ???UUUUUU???YYYYYY?]]]]]]???______?XXXXXX?WWWWWW?UUUUUU?UUUUUU??ח?TTTTTT????TTTTTT?Ԕ???TTTTTT??ё?PPPPPP????А??Ĕ?????PPPPPP?QQQQQQ?QQQQQQ?ϟ??ϟ?]]]]]]???ʚ??????ϟ?VVVVVV?ё???̜??ʚ???̜??????????QQQQQQ??ʚ??Ș????ə?ə???ϟ???˛?ϟ??̜?Ó????˛???Ξ???RRRRRR?ё?ʚ??????Ș??Ĕ?Ĕ?ŕ??’?’?????’?????Ó????Ĕ??’??????????Ξ?’??????Ó?Ξ??’?????Ĕ???????ŕ??Ĕ???Ș??˛?Ɩ?ŕ????Ș?ʚ???Ǘ???Ș???Ș?Ș??ϟ?А??˛??Ș?˛??Ș?˛?А??ё??PPPPPP???ё?QQQQQQ?PPPPPP?QQQQQQ?ё???PPPPPP??RRRRRR?Օ??ښ??\\\\\\????ۛ??pppppp?YYYYYY?ؘ?QQQQQQ?ܜ???VVVVVV?UUUUUU?TTTTTT?֖?VVVVVV????Ԕ?֖??WWWWWW???TTTTTT?UUUUUU?XXXXXX?????ܜ?ח???֖???YYYYYY?ۛ???????ӓ?UUUUUU??????TTTTTT??????????PPPPPP??ŕ?Ǘ???А?PPPPPP?QQQQQQ?Ξ???SSSSSS?PPPPPP??˛?Ó?̜??Ó??TTTTTT?ᱱ??PPPPPP?????ʚ?PPPPPP????ʚ?Ɩ?Ĕ??ə????̜?ϟ??????Ɩ?ə?ʚ??Ξ?Ξ???А???Ĕ?????PPPPPP?ʚ?͝?ϟ?PPPPPP?PPPPPP?Ξ?Ǘ????ə?Ɩ?Ǘ?Ș???Ó???Ó?Ó????????ŕ???????????????Ó??Ó????????˛????’???Ó?Ĕ??’??Ó?Ó?’???Ĕ??Ó???Ǘ?Ǘ???Ó?????ə?ŕ????Ǘ??˛??˛??˛?ə???̜?˛?ϟ???WWWWWW??̜??˛?ϟ???А?˛?ё?ё???Ғ??QQQQQQ??Օ?Ғ??Օ?ۛ?[[[[[[??SSSSSS?ܜ???ؘ?[[[[[[?ۛ??XXXXXX?֖??QQQQQQ?Ԕ?????RRRRRR?SSSSSS??SSSSSS??ښ?ؘ?ٙ?ٙ??ߟ?^^^^^^??ח??ӓ???֖?֖??YYYYYY???ޞ?ؘ??Ԕ?PPPPPP???֖?֖?????SSSSSS?RRRRRR?PPPPPP??Ғ?Ғ?ё?QQQQQQ?̜?ə????Ξ?PPPPPP?ϟ??VVVVVV??RRRRRR???Ǘ?Ó????ʚ?PPPPPP?ӓ???Ξ?ϟ?????Ξ??ϟ?ə?Ǘ???Ɩ??͝?А?RRRRRR??˛??Ș????????????Ξ?ϟ?˛???Ó?Ĕ??̜?PPPPPP??̜?͝?̜?ə?ʚ?˛??͝??Ǘ???Ĕ??Ǘ?Ĕ???????Ĕ?Ĕ?’??Ó??Ɩ??????????????’?Ǘ???Ó????’??Ó?Ɩ??Ǘ?͝?ʚ?͝?Ĕ?Ĕ?Ǘ?????’???Ș??ŕ???ŕ?Ó??ŕ????ŕ??Ĕ?Ș???˛???ʚ???ə???͝?PPPPPP?SSSSSS??А?ϟ?Ξ???Ǘ???Ș????Ξ???QQQQQQ??ё??ё?ё??RRRRRR?XXXXXX?VVVVVV???VVVVVV??VVVVVV?VVVVVV?ؘ?YYYYYY?XXXXXX??????TTTTTT?SSSSSS???TTTTTT????WWWWWW???ח??ZZZZZZ????ZZZZZZ???????Օ??ٙ?ח?[[[[[[?֖?WWWWWW??[[[[[[??ӓ???Ԕ???TTTTTT???RRRRRR??ё????Օ??ϟ?ϟ?̜??Ξ?PPPPPP??SSSSSS????ё??PPPPPP???̜?Ǘ?˛??QQQQQQ?А?ϟ??ə??ϟ?˛????Ș????Ĕ?Ș??А??ϟ?PPPPPP?˛?Ș?ʚ?˛??̜?˛?А??Ξ??PPPPPP???ϟ?̜?ٙ????Ǘ?Ɩ?ə?˛?QQQQQQ?А?̜??????????Ǘ??Ǘ?Ș?Ó??Ĕ?Ó???Ó??Ó???Ó?Ĕ?Ɩ????ə?????’??Ĕ??Ó?????????????Ξ???ܜ?UUUUUU???Ǘ?Ĕ?’????ё??’??ϟ??ŕ??’?ŕ?Ξ??Ɩ?ʚ?ŕ??Ș?Ș??̜??Ғ????????PPPPPP?̜???ʚ???˛???Ș??Ǘ??Օ?PPPPPP????Ξ?ϟ?ϟ?QQQQQQ?ё??PPPPPP????????UUUUUU?ח?XXXXXX?????WWWWWW?????SSSSSS????Օ??Օ?Ԕ???\\\\\\??Ғ???ؘ??ח?WWWWWW?ؘ??ח??ח??Օ????XXXXXX???TTTTTT?Ғ??ӓ???ӓ??ӓ?TTTTTT?ӓ??????SSSSSS?ё?А?ϟ?А?QQQQQQ?Ғ?SSSSSS??ӓ?Ғ?SSSSSS??А??ϟ??????Ξ?Ξ?ʚ????˛?QQQQQQ??Ξ??????ə??Ғ?ӓ?ϟ???Ǘ??ʚ?˛??̜???͝???А?ϟ?˛?̜???????Ǘ?˛??QQQQQQ?̜??ʚ?̜????͝?̜?RRRRRR?˛???’?’?Ó??’???????????Ĕ??????????’????ə?Ó?’?’?Ó?Ĕ?????SSSSSS?̜?Ǘ?Ξ??SSSSSS?Ɩ??????Ș??֖????Ɩ?ŕ?ʚ?Ș?̜?Ó??Ǘ?????Ș?PPPPPP???TTTTTT?SSSSSS??Ξ?QQQQQQ???SSSSSS?ϟ???А??͝?˛????Ș?Ș??????А?ё?TTTTTT?TTTTTT???ё??VVVVVV??Ԕ????XXXXXX?֖??ؘ?ٙ????SSSSSS??WWWWWW??WWWWWW?UUUUUU?Ғ?SSSSSS?Օ????UUUUUU??????UUUUUU?ӓ???ٙ??XXXXXX??ٙ??Ԕ?VVVVVV??WWWWWW????ٙ?WWWWWW?VVVVVV??????ӓ?ё?SSSSSS????????UUUUUU??TTTTTT?Ғ?TTTTTT??RRRRRR????ח?ܜ?Ғ?ӓ?Ԕ??????ϟ??А?ϟ?PPPPPP???ə??̜?ϟ??А?ϟ????Ɩ???ܜ??Ξ??^^^^^^??ə??Ǘ???˛???PPPPPP?PPPPPP??А?˛?????????˛??͝?ə???ə??͝?ə?˛?̜??Ξ?ə?????’???’?Ĕ??????ŕ?Ó?’??’????????’?ʚ??????Ó?Ĕ?’???͝????Ɩ?Ó??ŕ?Ĕ?’?’?Ó?Ó?ϟ??Ș?Ș???ŕ??Ș??ə??ŕ?????ʚ?Ș???Ғ?TTTTTT?ϟ?ϟ??ϟ????Ғ??ϟ?Ξ??˛??ʚ??Ș?PPPPPP??????Ș?ə?ё?VVVVVV????VVVVVV?Ԕ??TTTTTT?Ԕ?????Ԕ??YYYYYY?Օ?UUUUUU?Օ??֖?ё???[[[[[[?______??ё?????RRRRRR???Ԕ?Օ?Օ??֖?֖?ח?YYYYYY?ZZZZZZ??[[[[[[?YYYYYY?????ٙ?VVVVVV?ח?ؘ?WWWWWW??????????Ғ?RRRRRR???SSSSSS???SSSSSS????SSSSSS?Ғ??Ғ??SSSSSS?RRRRRR??VVVVVV?UUUUUU?RRRRRR?SSSSSS???SSSSSS??ӓ?͝??А??А?PPPPPP??????͝??ϟ?ʚ?А??Ǘ??Ǘ?̜??ۛ??PPPPPP?????ʚ??̜??͝?̜?ϟ?QQQQQQ?ϟ??͝??̜?’??????ə??ə?̜?PPPPPP??̜?Ξ?????͝??Ɩ?Ĕ?Ó??’???Ș??’??ŕ??Ș?Ó??Ó???Ó??’????Ĕ????????Ғ?Ɩ???Ó????Ĕ??Ɩ?’?’????????Ĕ?Ĕ??Ǘ?Ș?Ș?Ǘ??˛??Ɩ?Ǘ??̜?QQQQQQ??ʚ??ӓ??RRRRRR??Ξ?˛???VVVVVV????А??̜???ʚ?PPPPPP?TTTTTT????????А??PPPPPP??ӓ??䔔?ޞ???Ξ??ӓ?Օ????SSSSSS??TTTTTT?????????RRRRRR?Ғ??˛?Ξ?Ғ??RRRRRR????ח???VVVVVV??Օ????ZZZZZZ?ܜ?ؘ???ٙ?VVVVVV?ח?ؘ??000000???ח?ח?VVVVVV?SSSSSS?SSSSSS?TTTTTT?????RRRRRR??RRRRRR?QQQQQQ????ӓ????TTTTTT?SSSSSS???Ԕ?ӓ???ё?RRRRRR?RRRRRR?Ԕ???ϟ?ϟ?ϟ??????̜???̜??Ξ??Ș?˛?Ș??Ș???А??А??????͝?????Ξ?PPPPPP?͝??˛???Ɩ???????????̜?PPPPPP?ϟ??̜?ʚ?̜??̜?Ș?Ɩ?Ó??’?Ĕ??????͝?Ó????’????’????????????’????’?Ĕ????Ș?Ș?Ɩ??ŕ?ŕ???Ǘ?Ș??ŕ?Ș?ə?????Ĕ?ŕ?Ĕ?Ɩ?Ɩ??PPPPPP?RRRRRR???А?PPPPPP?͝???˛?̜??̜??ə?????˛????ə?Ғ???ё?QQQQQQ?TTTTTT?RRRRRR?PPPPPP????PPPPPP?ё????ٙ??Ԕ??PPPPPP??????XXXXXX?WWWWWW??Ԕ???SSSSSS??QQQQQQ?RRRRRR??ё?Ғ?Ғ?Ș?А?QQQQQQ??ё???Օ?֖?UUUUUU?UUUUUU??UUUUUU?Օ?ۛ?VVVVVV?YYYYYY??]]]]]]?ٙ??֖??WWWWWW??֖?WWWWWW?YYYYYY????ښ?֖??ӓ??Օ??Ԕ?SSSSSS??QQQQQQ?А??PPPPPP?А?QQQQQQ?ё??Ғ?????ӓ?UUUUUU???????ӓ??RRRRRR???Ξ??QQQQQQ?QQQQQQ?PPPPPP?͝?????Ξ?ϟ?ϟ?͝??ə???Ɩ??Ș???̜?͝??ə??ʚ?˛??̜????PPPPPP?ϟ??????????QQQQQQ?QQQQQQ?ə?̜?͝??˛???ʚ?˛?ʚ??͝?UUUUUU???ŕ???????ŕ??Ĕ??Ĕ???Ó??????˛?Ξ?Ɩ????Ĕ????Ó???????ŕ?ŕ?ŕ??ə?????ŕ??ə???Ɩ???Ĕ?Ĕ??Ĕ?ŕ??ʚ?˛??А?͝?͝?ə?˛?͝?Ξ??˛?˛?͝?͝??˛?PPPPPP??Ξ?˛?ə?ə??ə???????YYYYYY?PPPPPP?PPPPPP??А??QQQQQQ?PPPPPP???QQQQQQ?Ғ??WWWWWW?TTTTTT??ϟ??QQQQQQ?SSSSSS??ӓ?QQQQQQ?XXXXXX??QQQQQQ?ё?Ԕ??PPPPPP??PPPPPP?PPPPPP?А?͝?˛?ϟ?Ԕ???ח?ח????ӓ?Ԕ?UUUUUU?Օ??????ח?ח?֖?VVVVVV?WWWWWW??XXXXXX???ښ?YYYYYY??]]]]]]??ח??WWWWWW??UUUUUU??Ғ?????ё???????SSSSSS????Օ??????Ԕ?ӓ???ϟ???ϟ?ϟ?Ξ???ʚ???͝?????PPPPPP????˛?Ș?Ɩ??ʚ?PPPPPP??????ʚ?Ξ?Ғ??PPPPPP?Ξ??ϟ?ʚ?˛?Ș????Ș???Ԕ?TTTTTT??ʚ??͝??˛?ʚ?̜??ʚ??ə?????’?Ĕ?Ɩ???Ĕ?????????ŕ????’??’???Ó?Ó???Ó?ŕ????????Ó????Ɩ?Ɩ???Ĕ?Ɩ??ŕ????Ș?Ĕ???ŕ?ʚ??̜?ʚ?˛?????̜?QQQQQQ?̜??˛????А?͝?ʚ??Ξ?˛?̜??ʚ?˛???ё??Ξ??RRRRRR??Օ?Ԕ?ӓ?А?ϟ?А?А??UUUUUU?????Օ???ϟ?ӓ?Ԕ?ӓ?VVVVVV???Ԕ?А?ϟ??˛?͝?͝????ə?˛???RRRRRR??֖??֖??Ԕ?ӓ?ӓ?VVVVVV????֖???YYYYYY??ٙ???VVVVVV??֖??ٙ?ٙ?ZZZZZZ???ښ??ښ?XXXXXX???ӓ?TTTTTT??UUUUUU?ё??QQQQQQ??ӓ?SSSSSS?TTTTTT??SSSSSS??ё?RRRRRR?ӓ?֖?UUUUUU??TTTTTT???SSSSSS?RRRRRR??ё????PPPPPP?Ξ??PPPPPP?ϟ?ʚ?ʚ??ʚ?????Ξ?ϟ?ϟ???ŕ?Ǘ?˛?̜????ə?ŕ????ϟ???ϟ??????Ș?Ɩ?Ș????????͝??˛?˛???ə?ə??ŕ?Ĕ??Ĕ???????’????Ó????????????’?Ó?Ɩ???????Ĕ?Ǘ?Ó?͝???Ĕ???Ó??ŕ?Ɩ??Ǘ??Ĕ?͝?Ó??Ș?ŕ?Ó?ŕ??ʚ?ə?ϟ??ϟ?͝???UUUUUU??RRRRRR?ϟ?Ғ?PPPPPP??̜????Ξ??̜?Ξ???̜?ʚ?Ș???QQQQQQ?А???PPPPPP????Ғ?ϟ??А?ё???֖?Ԕ??VVVVVV?????TTTTTT?Ԕ??Ԕ?PPPPPP?RRRRRR?А????ə?Ǘ?˛?QQQQQQ?Ξ?ə??͝??SSSSSS??WWWWWW??Օ?֖???Օ???TTTTTT???ח?ښ?000000??[[[[[[??ښ???VVVVVV????XXXXXX?ٙ???]]]]]]???ٙ??????TTTTTT?ӓ?ё??Ғ??RRRRRR????ё?Ғ?ӓ?TTTTTT?UUUUUU?UUUUUU?TTTTTT?TTTTTT?֖?SSSSSS??RRRRRR?Ғ???ё??А???ϟ?ʚ?˛?˛??̜?͝?Ξ????PPPPPP?RRRRRR?Ԕ??ŕ??͝??ə??Ɩ??Ĕ?Ș????ϟ??ϟ?ϟ?А???˛?’?Ĕ????????˛????˛?????????’?Ĕ??Ĕ???’????Ɩ?ŕ???ə??????’???Ó?????????????Ó?Ĕ??Ĕ??ŕ???ϟ?Ɩ??’??Ĕ?ŕ???Ǘ??Ǘ??̜?ʚ?А?SSSSSS????ٙ????ϟ?А?????͝?Ξ?˛????Ǘ?Ș?Ș??Ξ??PPPPPP??SSSSSS?TTTTTT?Ԕ?ё???TTTTTT?Ғ??Ғ?Ғ??VVVVVV?TTTTTT??PPPPPP????֖??[[[[[[?ח??А???͝????ŕ??˛?˛?ʚ?̜?А???RRRRRR????Օ?֖????UUUUUU?VVVVVV?Օ?Ԕ???ؘ??ٙ?YYYYYY?XXXXXX???Օ??Ԕ?UUUUUU????WWWWWW???ښ?XXXXXX??ZZZZZZ?ښ?ZZZZZZ??ٙ?ח?????TTTTTT??Ғ?ӓ?Ԕ?Ғ??ӓ?ӓ???Օ?Ԕ???SSSSSS??SSSSSS?Ғ?ӓ??Ғ??Ғ???̜?̜?͝?̜????А?PPPPPP?А??ϟ???Ǘ??Ș???????Ș?ʚ?ϟ??????ϟ?͝??????Ș??Ɩ??̜??PPPPPP???͝?ə??Ș??????ŕ??Ĕ???????’?????????????Ɩ??Ǘ?PPPPPP??????Ș?Ó?ϟ???Ó??ŕ?Ɩ??Ș?ŕ??ŕ???Ĕ???Ó????Ǘ?˛?????͝?͝???SSSSSS???PPPPPP????ח????˛???UUUUUU?˛????Ș?Ș?̜?Ξ?????Ғ?ё????ӓ?А??ё?RRRRRR?QQQQQQ?QQQQQQ????UUUUUU?ؘ?[[[[[[?ܜ?ߟ?ssssss??ё?ё?Ԕ??ʚ?Ǘ?????̜???ӓ?Ғ?SSSSSS??VVVVVV????YYYYYY?ٙ???WWWWWW??YYYYYY????\\\\\\????ZZZZZZ??????Օ?ؘ?ۛ?ܜ??YYYYYY?ښ????ښ????????XXXXXX?VVVVVV?Օ??TTTTTT??Ԕ?TTTTTT??SSSSSS??SSSSSS?UUUUUU??Ԕ?TTTTTT?Ԕ?TTTTTT???SSSSSS????Ғ?Ԕ?TTTTTT???Ɩ?̜?RRRRRR?RRRRRR?????ϟ???ϟ???Ɩ??ʚ?ʚ?Ĕ?Ó???Ó?ʚ?͝??͝?͝?PPPPPP?ё??ə???ə?Ɩ?Ș?Ξ?Ǘ?ŕ??˛?˛??QQQQQQ?Ξ?͝????ŕ?Ĕ?Ĕ?Ĕ???Ĕ??ŕ????????????????Ó?’?’???Ĕ?Ĕ?’???????????ŕ?ŕ?Ĕ??ŕ???Ó?’?ŕ??’????Ǘ?ŕ??Օ?RRRRRR???ϟ?Ξ?????Ԕ?А??ϟ???ӓ??͝?ϟ?Ξ??͝??ə????Ǘ?ŕ???ϟ?????ё??ё?Ғ??WWWWWW???Ғ??ϟ??UUUUUU???Ғ??֖?????ё?PPPPPP?Ξ?˛??ϟ???͝?PPPPPP?А??????Օ???TTTTTT???ܜ??ܜ?֖???WWWWWW?XXXXXX?ٙ??ښ?YYYYYY?XXXXXX????????PPPPPP?777777?111111?\\\\\\???YYYYYY?YYYYYY?XXXXXX?YYYYYY??[[[[[[?ZZZZZZ???ZZZZZZ??\\\\\\?XXXXXX??ӓ?UUUUUU?TTTTTT??TTTTTT?ӓ?TTTTTT?Ԕ???Ԕ?Օ?֖?ZZZZZZ?TTTTTT?SSSSSS??Ԕ?ӓ?Օ?ӓ??ё???Ǘ??Ғ???ё?ϟ?ё?RRRRRR?PPPPPP??А??Ξ?̜???????Ó???͝??Ξ??TTTTTT?PPPPPP??͝???QQQQQQ??Ș?͝?ʚ??ё?ʚ?ʚ??˛??ʚ??Ș??Ó?Ĕ???????????????Ó???ə????Ĕ?????Ɩ??Ɩ????RRRRRR???Ó??????Ĕ??Ĕ?ŕ????’??????ə???Ǘ???̜??ϟ?QQQQQQ?А?Ғ?Ғ??ٙ?WWWWWW??TTTTTT???PPPPPP?ϟ?˛???͝????Ɩ?????ё???ϟ?ё?ϟ?PPPPPP??ϟ?RRRRRR??А?QQQQQQ?ϟ?Ғ?????Ξ?ŕ?ə?˛??????Ғ?А?Ξ?ϟ?А??̜??ё?QQQQQQ?ӓ???ӓ?Օ??TTTTTT???Ԕ?????ߟ?]]]]]]??ח?ؘ?WWWWWW?WWWWWW?XXXXXX???YYYYYY??Օ?VVVVVV???ۛ?\\\\\\?______?㓓?XXXXXX?⒒?ۛ?YYYYYY?ٙ??ח??YYYYYY?ښ???\\\\\\????????Ԕ?TTTTTT???SSSSSS?ӓ?VVVVVV??TTTTTT?UUUUUU?֖???ؘ?ӓ???TTTTTT?Օ?Ԕ????˛?Ɩ??PPPPPP????ϟ?PPPPPP??ё?А??˛?˛?̜?̜???Ɩ???Ĕ??̜????Ξ?ϟ??̜?̜?˛???̜????ŕ?ŕ?ŕ??͝????˛?͝?Ó?Ĕ?Ș??’???Ǘ?’?Ó????Ɩ???Ó?ŕ??̜?Ɩ?Ɩ??Ĕ?????’??Ș?˛?Ǘ?Ɩ?Ǘ?Ɩ??Ĕ????Ĕ?Ĕ??Ɩ?Ĕ?Ɩ??Ĕ?ŕ??Ó??Ó????Ș??ʚ?̜?ə?˛????А?ӓ???֖?SSSSSS?А??PPPPPP??RRRRRR?QQQQQQ?А?˛?????ə??Ș??ʚ?А?Ξ???PPPPPP?͝?А???А?͝?͝????ӓ???ϟ??ϟ???˛?̜?QQQQQQ?А?Ғ??RRRRRR???А?????QQQQQQ???TTTTTT???Ԕ?Ԕ?WWWWWW?UUUUUU?ӓ?Ԕ?UUUUUU?WWWWWW???ܜ??111111????֖?ח??WWWWWW??TTTTTT?ӓ?Օ????ܜ?[[[[[[????ర??______??ۛ????ۛ??^^^^^^?000000???ۛ??ٙ????Ԕ????ӓ?VVVVVV??ӓ??֖?XXXXXX?ؘ?֖?ٙ??Ԕ?TTTTTT?Ԕ??Օ?ח??А??̜?ϟ???????Ғ?QQQQQQ???͝?ϟ?ϟ?PPPPPP?ё???’?Ĕ?Ɩ??ϟ??????ϟ?QQQQQQ?Ș????????PPPPPP?Ș??˛??˛?ʚ?Ș??Ó??Ɩ??’???????Ɩ?Ó??Ĕ???Ǘ????Ɩ???Ó?Ó?Ĕ???Ĕ?ə?̜????Ɩ?’?ə???Ĕ?????’???ŕ?Ó??Ɩ???ŕ?ŕ?ʚ?ʚ?ʚ?ʚ??̜??Ξ?SSSSSS?Ξ?А?ӓ?______??ӓ??SSSSSS?Ξ?А?PPPPPP?TTTTTT?Ξ???˛???ə????Ξ?RRRRRR?Ξ??PPPPPP???????А?͝?PPPPPP?PPPPPP?ח?֖???QQQQQQ?ӓ?А??????RRRRRR??ё??Ғ?????А???SSSSSS?QQQQQQ?ӓ?SSSSSS?WWWWWW?Օ???XXXXXX?XXXXXX?ٙ???ؘ??ؘ???ٙ??[[[[[[??????RRRRRR??Ғ???ٙ?XXXXXX???UUUUUU?Օ???ښ??ޞ??ܜ?ښ?Օ?ٙ?\\\\\\??000000???XXXXXX???ݝ?YYYYYY??VVVVVV?ٙ?TTTTTT??SSSSSS?ח?SSSSSS?TTTTTT?SSSSSS??VVVVVV??????WWWWWW??VVVVVV?SSSSSS?ё??SSSSSS?Ξ??ϟ?????Ғ?SSSSSS?SSSSSS?Ԕ?ё??˛??ϟ?ϟ?????ŕ???Ξ?ϟ?ϟ?͝???ʚ?Ɩ??˛??͝?˛???ϟ?Ғ?Ξ?PPPPPP?͝?А?А?̜???Ɩ?ə???ʚ?Ó??’?Ó?ŕ?Ĕ?ŕ???Ĕ?Ǘ???Ó?ŕ?Ĕ?’??ŕ?Ĕ?ŕ?’??Ĕ???ŕ????Ș??ŕ?Ɩ??Ĕ?Ɩ?Ĕ????Ɩ?Ɩ??Ó?ŕ?ŕ?Ɩ??Ĕ??PPPPPP?̜?̜?ə??ё?ӓ???А????????QQQQQQ?PPPPPP??А?ӓ?̜??˛??ʚ???ϟ??ə???UUUUUU?RRRRRR?QQQQQQ???ӓ?QQQQQQ?VVVVVV????ё???UUUUUU???XXXXXX??TTTTTT?QQQQQQ?Ғ?ח??????ё??̜?˛?ё?Ғ??Ғ?QQQQQQ????Օ??????WWWWWW??ٙ???ښ??[[[[[[?]]]]]]??ᱱ???WWWWWW??͝??Օ??YYYYYY??\\\\\\??RRRRRR??XXXXXX????ٙ???ర???YYYYYY?ښ?[[[[[[?\\\\\\?PPPPPP?ۛ?ܜ?ٙ??ߟ?ߟ????XXXXXX?VVVVVV??ё?????Ԕ??VVVVVV?ח?]]]]]]??ޞ??VVVVVV?WWWWWW????QQQQQQ?QQQQQQ????А?Ғ?RRRRRR?SSSSSS?Ғ?ё?ё??А??˛??А??????˛????ϟ???Ξ?ʚ??ŕ?̜?PPPPPP?̜???ӓ?RRRRRR?ӓ?ӓ?Ξ?͝?RRRRRR????ϟ??А???ə?Ǘ?Ĕ???Ĕ?Ĕ?’?Ó?’??Ó??Ɩ??Ĕ??ŕ?ё?????Ĕ???Ó?’???̜?Ғ??ŕ???Ó??ə?Ș???Ó?Ó?Ó??Ó??ŕ?Ǘ?Ǘ???˛?ϟ?Ξ??RRRRRR?Օ?PPPPPP?XXXXXX????ϟ?А???͝?????ё??̜?˛?????????Ξ?ϟ???PPPPPP?ё?RRRRRR???PPPPPP??ё??VVVVVV???UUUUUU??RRRRRR?ח???????Ξ??ʚ?˛???͝??SSSSSS??А?RRRRRR??Ғ??Օ?Ԕ?ӓ?????????????XXXXXX?ښ?ؘ?ח?֖??ӓ?VVVVVV??YYYYYY?ߟ???ޞ?嵵?⒒?ᱱ???VVVVVV?ח?YYYYYY?ښ?]]]]]]??\\\\\\??]]]]]]?ޞ?^^^^^^???QQQQQQ?000000???ݝ??????UUUUUU???ޞ????TTTTTT?Օ?TTTTTT?XXXXXX?ܜ????ؘ??Օ???PPPPPP?QQQQQQ??̜?PPPPPP?????ё??ё?QQQQQQ?А??ə?˛?Ș?̜?͝??ӓ???ϟ?Ξ?А?Ξ???А?Ɩ???Ɩ???А??Ԕ?SSSSSS?Ғ?PPPPPP?Ξ?ʚ???̜?ϟ?А?Ξ???ё?ϟ??Ǘ???Ĕ?Ó???ŕ?’??Ɩ??Ș?Ǘ??Ǘ??ʚ?Ĕ???ŕ??ŕ???’??Ĕ?????Ó?Ó?ə???????Ó??Ó????Ǘ?Ș?̜?˛???ё??ᱱ?⒒???RRRRRR?ӓ??QQQQQQ?PPPPPP????˛???RRRRRR????PPPPPP?SSSSSS??ё????А????ё??Ғ???SSSSSS??UUUUUU?ϟ??SSSSSS??VVVVVV??PPPPPP?PPPPPP??Ғ???ӓ?ё?????˛?̜????Ξ??А??ӓ?ё???Ԕ?????ח????Օ??ӓ?Օ?XXXXXX???ؘ?WWWWWW??ח?ZZZZZZ???[[[[[[?????SSSSSS??]]]]]]?????ٙ?????______??\\\\\\???ߟ?^^^^^^????rrrrrr?\\\\\\???????֖?YYYYYY???UUUUUU?????ٙ?XXXXXX?ZZZZZZ???????PPPPPP??Ș??XXXXXX?ӓ?????ӓ??ё??Ǘ?PPPPPP???RRRRRR?WWWWWW????͝??А??????Ó???Ԕ?Ԕ?ӓ?˛?Ғ?֖??Ғ?ϟ?̜?ʚ?̜??UUUUUU?ϟ?????̜?ʚ???Ĕ????Ɩ???????Ǘ?Ǘ?ʚ???PPPPPP?Ǘ?ŕ???Ĕ?SSSSSS??Ĕ???’?ʚ?Ĕ?Ĕ??Ó??Ξ?Ԕ??Ĕ?’?’?Ĕ?’?Ó?’?Ó??????ٙ?͝?XXXXXX?ٙ?????UUUUUU????PPPPPP?ϟ????Ș?ʚ??Օ?ё?QQQQQQ?Օ????Ғ??QQQQQQ???Ғ???RRRRRR???SSSSSS?ח????QQQQQQ??QQQQQQ?͝?А?А?PPPPPP??А???А?˛??ŕ?????̜??̜??А??ӓ???ӓ??VVVVVV??RRRRRR????????VVVVVV?Օ?ח?YYYYYY?ؘ???ܜ???]]]]]]?[[[[[[??\\\\\\???000000?111111?______?pppppp??ٙ????ݝ??pppppp?SSSSSS?ᑑ?PPPPPP????]]]]]]???ښ?PPPPPP????ZZZZZZ??ZZZZZZ?ښ????ٙ???Օ??Օ????ۛ???ٙ???UUUUUU?UUUUUU??PPPPPP?̜?Ǘ?ё?SSSSSS?????ӓ?ӓ??Ξ????ݝ?[[[[[[??˛?Ξ??Ғ?Ξ??Ξ?͝?͝???Ǘ?ŕ?Ғ??????TTTTTT??QQQQQQ???ʚ???Ξ?RRRRRR?TTTTTT????Ǘ?Ǘ??Ɩ?ŕ???ŕ??Ɩ???’???Ǘ?Ǘ?Ș??͝?ə??Ĕ?Ó?Ĕ???SSSSSS?????Ĕ???Ó?ŕ??͝?????Ó?????ŕ??ʚ?Ξ??PPPPPP??ח?ٙ??QQQQQQ?tttttt????Օ??ϟ??ϟ??????Ξ??YYYYYY?VVVVVV?ۛ?ݝ???ZZZZZZ?ӓ?Ԕ???ח??UUUUUU?????ח?RRRRRR???֖?VVVVVV?????QQQQQQ??͝?А??˛??Ĕ?Ɩ???Ξ?̜?PPPPPP?А?ё?ё?ё??WWWWWW?Օ?Ԕ??TTTTTT?ӓ??Օ??ח??֖??ח?֖???XXXXXX??VVVVVV?WWWWWW???ܜ?pppppp?\\\\\\??ܜ?]]]]]]??ܜ??????pppppp??ᑑ???111111?ߟ?555555?ర?ᱱ???YYYYYY?ݝ??ݝ???pppppp???ؘ????[[[[[[??ؘ??ؘ???XXXXXX?ٙ???ח?ٙ?ܜ???ۛ?______??XXXXXX??ӓ??Ξ???Ғ???SSSSSS????PPPPPP??Ξ???ښ?Ξ???PPPPPP?ϟ?PPPPPP??ʚ?????ё?А??֖?ӓ??RRRRRR?PPPPPP??TTTTTT??Ξ??Ξ?̜?????ə?ə?ŕ??ʚ?˛?Ǘ??ښ????ŕ?ŕ????Ș???ʚ?Ɩ?Ǘ??ϟ?????ə?Ǘ?Ǘ??????Ó?Ɩ??????Ĕ?????Ó?Ɩ???Ξ?ё??֖???QQQQQQ??\\\\\\???uuuuuu?䔔?YYYYYY???QQQQQQ????͝?Ǘ?ə???RRRRRR??^^^^^^?]]]]]]?PPPPPP?ᑑ?qqqqqq?ۛ?ؘ??WWWWWW?XXXXXX?ٙ???VVVVVV?ޞ?ZZZZZZ?UUUUUU??ӓ???А??QQQQQQ??PPPPPP?А?Ξ?ϟ?̜?ʚ???ə?˛?Ξ?Ξ?Ξ??Ғ?ӓ???UUUUUU??֖?????Ԕ?Օ????????ٙ?XXXXXX?ؘ?ؘ??????ZZZZZZ?^^^^^^??ۛ?ޞ???RRRRRR?Ⲳ??ᑑ??痗?㓓??䴴??SSSSSS?ᱱ????uuuuuu?Ⲳ?QQQQQQ?]]]]]]???QQQQQQ???qqqqqq??XXXXXX?WWWWWW?WWWWWW???]]]]]]?]]]]]]??ښ?ZZZZZZ?ښ?ښ?[[[[[[??֖?XXXXXX???ݝ?ܜ????rrrrrr???VVVVVV?Ԕ?̜??Ǘ???А??????͝?????PPPPPP????????ə??̜??PPPPPP??RRRRRR???Ғ?QQQQQQ?̜?А?ϟ???Ξ?А??ϟ?А?А?ё?Ș??ə?Ș?Ș?????Ɩ?Ĕ??Ɩ??????Ǘ?RRRRRR???Ɩ??ʚ?ə?SSSSSS??ə?̜?А?Ǘ?????ŕ??Ɩ?Ɩ?Ɩ???Ǘ??Ĕ?????????Ғ??ޞ?ݝ??????涶??QQQQQQ???QQQQQQ?????RRRRRR?̜???ϟ?QQQQQQ?ݝ??ᱱ?Ⲳ?䔔???????ܜ??[[[[[[?RRRRRR??ؘ??Ԕ???PPPPPP?SSSSSS?SSSSSS??ё??????Ó?Ĕ???А?????ё?Ғ??Ԕ??ח?֖?Ԕ?VVVVVV?ٙ????______?YYYYYY???ٙ?[[[[[[???\\\\\\??ۛ?YYYYYY??ٙ?ښ??\\\\\\?ZZZZZZ?ٙ?\\\\\\??PPPPPP?^^^^^^??ݝ??______???????㓓??111111?RRRRRR?RRRRRR?⒒?Ⲳ?ᱱ?ᑑ?PPPPPP??ᑑ?PPPPPP?ޞ?ߟ?ᱱ??WWWWWW?ח?WWWWWW??\\\\\\????ݝ???[[[[[[??XXXXXX??YYYYYY?ۛ?[[[[[[???ښ???222222??ؘ???˛????А?????˛?ŕ?Ɩ??QQQQQQ?XXXXXX????˛??ŕ????Ξ????А?SSSSSS?ё??ё??Ș???ʚ??PPPPPP?PPPPPP?RRRRRR???ϟ????PPPPPP??Ɩ??Ǘ??Ǘ?Ɩ?ŕ??????ə??Ș?ŕ???Ǘ?ə???ё?????Ș?Ɩ?ŕ??ŕ???ʚ?QQQQQQ?Ɩ?Ɩ?Ĕ?Ș??ŕ??’?Ɩ?Ǘ??Ǘ?ə?ё????????]]]]]]?000000???rrrrrr??Ԕ?QQQQQQ???Ξ???͝??PPPPPP???\\\\\\??444444???UUUUUU?333333???QQQQQQ?111111???㓓?ర???֖??SSSSSS?TTTTTT?RRRRRR?QQQQQQ?RRRRRR???PPPPPP??͝?RRRRRR?Ș???ϟ???А??ё?????TTTTTT??ח??Օ???ؘ?XXXXXX?ؘ?\\\\\\?ۛ?ݝ????\\\\\\???ܜ?ܜ???ݝ??ޞ?pppppp?ర?222222?uuuuuu?rrrrrr?ᑑ??PPPPPP??pppppp??ᱱ?ర?ח?XXXXXX??⒒????rrrrrr?vvvvvv??Ⲳ?QQQQQQ???111111?ssssss?qqqqqq?????WWWWWW?UUUUUU?ח?????[[[[[[?______??ښ?ۛ?]]]]]]?YYYYYY???\\\\\\??ޞ???ښ????????ё?А?Ԕ?ё???RRRRRR??ϟ????PPPPPP?YYYYYY??ϟ????ə???????ӓ??WWWWWW???ϟ????Ș??PPPPPP?Ғ?SSSSSS?TTTTTT??ϟ?А??̜?̜?PPPPPP?SSSSSS?????Ɩ???ŕ??Ǘ?Ș?Ș?Ǘ???Ǘ?ə?̜??˛?????ŕ?Ĕ?˛??ŕ??Ĕ?Ĕ?Ĕ?Ĕ?Ș?˛???Ĕ?Ɩ??Ĕ?Ó?Ó?Ó??Ĕ?SSSSSS?ӓ???VVVVVV?ؘ??ᑑ?ޞ?ݝ???ؘ?]]]]]]?????VVVVVV??????Ξ????UUUUUU??555555???䔔??䔔?TTTTTT?ssssss?ssssss?㓓??ߟ?ۛ????SSSSSS??RRRRRR??RRRRRR??????XXXXXX?______??????PPPPPP??PPPPPP?ϟ?RRRRRR??SSSSSS?SSSSSS??ח?ؘ??ZZZZZZ??[[[[[[?ٙ???]]]]]]?000000?______??ۛ??鹹?tttttt?rrrrrr??TTTTTT??______??ᱱ?Ⲳ?ᑑ?qqqqqq?444444?SSSSSS???rrrrrr?ᑑ??qqqqqq??????YYYYYY??Ⲳ?ᱱ?PPPPPP??⒒?444444??222222?ᱱ?[[[[[[???000000???pppppp???ؘ?UUUUUU??[[[[[[?ښ?\\\\\\??ߟ?000000?ߟ??ߟ?^^^^^^?ZZZZZZ?ZZZZZZ?ښ??ޞ?ݝ????ܜ??֖?ښ?[[[[[[???Ғ??ё??QQQQQQ?А?ё?ϟ?Ξ??ʚ??ё?]]]]]]?Ξ?˛????Ǘ?ʚ????ё?????ё?TTTTTT???֖?͝?А??TTTTTT?А?͝???˛???ʚ?SSSSSS??ZZZZZZ?ʚ??ŕ?Ɩ?ŕ???Ɩ?Ș?Ɩ?????????ʚ?˛?ŕ??Ó?Ĕ?Ɩ?ʚ??Ĕ?ŕ??Ó???Ǘ?ə?Ș?ŕ?Ș???ŕ??˛??Ș?ə???ӓ???ё?VVVVVV??000000??ӓ??SSSSSS?Օ?WWWWWW??ӓ????PPPPPP?ϟ?̜???ё??Օ?XXXXXX??222222?uuuuuu?666666?666666?777777??xxxxxx??斖?666666??\\\\\\?ٙ???VVVVVV?TTTTTT?RRRRRR????QQQQQQ?PPPPPP???А?ښ??Ɩ???̜?͝?А????Օ?TTTTTT??VVVVVV?Ԕ?WWWWWW????????ssssss?ߟ????YYYYYY?000000?痗?TTTTTT??PPPPPP???ssssss?䔔???SSSSSS??444444???㳳?SSSSSS?111111???111111?000000??QQQQQQ????ߟ??\\\\\\??ᱱ?rrrrrr??Ⲳ?ర?ۛ???______?ߟ??^^^^^^??ݝ?pppppp???ZZZZZZ??]]]]]]?]]]]]]??^^^^^^?QQQQQQ?ݝ?ర?rrrrrr?ܜ???qqqqqq??????YYYYYY?WWWWWW?????RRRRRR?ё?ϟ????Ғ??Ξ??А???ϟ?UUUUUU???ʚ?Ș??Ș??ŕ???????TTTTTT??PPPPPP??ə??UUUUUU?SSSSSS????͝?ё???Ξ?͝??????Ĕ?ŕ?Ĕ?ŕ?ϟ?ʚ??Ĕ?ə????Ɩ???????Ǘ??Ș?Ș?ʚ??˛?ŕ?Ș??ə???Ɩ??˛???Ǘ?Ǘ???ŕ?Ξ?Ɩ?ə?˛??RRRRRR??????֖??Ғ?ё????Ԕ?UUUUUU???Ғ?А?Ξ?Ξ?Ξ?Ξ???֖???PPPPPP?222222??Ꚛ?뛛?윜?\\\\\\?zzzzzz?Ꚛ??222222?000000?ݝ?ښ?UUUUUU?֖??Ғ?QQQQQQ??RRRRRR??͝??RRRRRR??]]]]]]?ӓ?͝??А???QQQQQQ?PPPPPP?SSSSSS?ӓ????ח?VVVVVV??VVVVVV?ؘ??ښ???PPPPPP?ᑑ??ޞ??????RRRRRR?333333?????444444??䔔?䴴?啕???緷???111111??PPPPPP??______??ߟ??ర??ݝ?^^^^^^?]]]]]]?ZZZZZZ???RRRRRR??PPPPPP????ݝ????[[[[[[????ۛ?[[[[[[?^^^^^^????ܜ?000000?ర?PPPPPP?qqqqqq?]]]]]]????ZZZZZZ?]]]]]]???ח??VVVVVV?֖??YYYYYY??Ғ??Ξ?SSSSSS?ё??Ԕ?RRRRRR?Ǘ??ё?ʚ??̜?̜?????Ĕ?Ó?ə?Ɩ????VVVVVV?YYYYYY???Ғ?Ғ?Օ?VVVVVV??SSSSSS?Ξ??ё?PPPPPP??Ξ?˛??ϟ????˛?˛??????ё?̜?????ŕ?ŕ??ʚ???PPPPPP??Ș?????͝????Ɩ???ə??Ș?????Ǘ??Ǘ?Ɩ??Ǘ?Ș?ϟ???Ԕ????QQQQQQ?VVVVVV?TTTTTT???RRRRRR?ё?Օ?????????̜?̜?Ξ???֖?ۛ??000000???}}}}}}?흝?흝?======?>>>>>>?꺺?VVVVVV?㳳?QQQQQQ?ޞ?YYYYYY????????ʚ?̜?͝??RRRRRR?͝?QQQQQQ?ח??RRRRRR?????SSSSSS?TTTTTT??VVVVVV??֖??Օ??ח??YYYYYY??______??]]]]]]???ܜ?\\\\\\?______???ᑑ??222222?[[[[[[??RRRRRR?tttttt?嵵?啕?tttttt??888888??ర?444444?333333??]]]]]]??pppppp?YYYYYY?ܜ????ZZZZZZ?\\\\\\?ޞ??ۛ??ᑑ??ర?ర?pppppp???\\\\\\??ᱱ????^^^^^^?ݝ?ۛ??000000??]]]]]]??ݝ???RRRRRR?ర???^^^^^^????ۛ?XXXXXX?WWWWWW??֖?WWWWWW?Օ??UUUUUU?ё??ё?QQQQQQ?RRRRRR???ё?????Ǘ???̜?????’?ŕ???PPPPPP?Ғ???Ԕ?RRRRRR?RRRRRR?WWWWWW??ؘ?֖?Ξ?QQQQQQ?Ξ?Ξ?QQQQQQ???????̜?˛?ʚ??Ξ?Ɩ??Ǘ??̜?˛?ə?Ș??ŕ??Ɩ?̜?˛?TTTTTT?ӓ?UUUUUU?????Ó????Ș?Ș?Ǘ?Ǘ??̜?ʚ??Ɩ??????Ɩ??Ξ???????RRRRRR??????Ғ?PPPPPP??XXXXXX?WWWWWW?֖?WWWWWW?000000???Ξ???ʚ???ϟ?????RRRRRR?wwwwww????______??}}}}}}?뛛?wwwwww?444444????VVVVVV?Օ?ӓ??QQQQQQ?̜???ʚ?Ξ???Ĕ?PPPPPP???SSSSSS?SSSSSS?TTTTTT???Օ??????ח??ؘ?ח?[[[[[[?ܜ?[[[[[[?ښ??????pppppp??qqqqqq?ర?]]]]]]?ޞ?ᑑ?QQQQQQ???⒒?⒒?RRRRRR?RRRRRR?______?ޞ???111111?]]]]]]??XXXXXX??ܜ?XXXXXX???UUUUUU??VVVVVV???]]]]]]?ܜ???111111??000000??]]]]]]?ޞ??Ⲳ?ర??YYYYYY??pppppp?______?ۛ??000000?PPPPPP?^^^^^^?[[[[[[?ݝ?______??tttttt?______?000000?^^^^^^??^^^^^^??ٙ???֖??ח???ۛ?UUUUUU??QQQQQQ??А??Ғ?ё?PPPPPP?ϟ??ϟ?SSSSSS?ח?????˛??Ɩ?Ɩ??Ɩ???А??SSSSSS???VVVVVV?֖???XXXXXX??͝??ϟ??????RRRRRR??͝?Ș??Ǘ?ʚ???͝?Ɩ?̜???͝?Ș?ʚ?????RRRRRR?]]]]]]???Ș?????Ɩ?????????Ș??Ǘ?Ș????˛?̜?ϟ?????ϟ?PPPPPP?SSSSSS????Ғ?UUUUUU??Ғ?ӓ??????˛?Ș??˛?˛??????Օ???ᑑ??\\\\\\?>>>>>>????}}}}}}?뻻??tttttt?qqqqqq??YYYYYY??Ԕ?Օ???ə???Ș?ŕ???Ξ?Ғ?ӓ??UUUUUU????[[[[[[??ۛ?WWWWWW??XXXXXX????WWWWWW?VVVVVV?ؘ??ٙ??????444444?ర?000000???ߟ???222222?111111?㓓??ᑑ?111111?111111??]]]]]]?ۛ?______?[[[[[[????ٙ??ۛ????SSSSSS??TTTTTT?RRRRRR???ZZZZZZ??111111?ᑑ?PPPPPP??ZZZZZZ????ښ?YYYYYY????????ޞ??ؘ?ۛ?000000?ర?ޞ?ܜ???ݝ?ݝ?^^^^^^???֖????ۛ???Օ???QQQQQQ?RRRRRR???ё????PPPPPP???TTTTTT????ϟ?Ǘ?????͝????UUUUUU?ё????ٙ??WWWWWW?ښ?TTTTTT?͝??˛????PPPPPP?TTTTTT?˛?˛?Ǘ?Ǘ?????Ș??˛??Ɩ?ə?ŕ????PPPPPP?͝?ʚ?ӓ??SSSSSS???ŕ?ŕ?ə?Ǘ?Ș?Ș???’?Ĕ?Ó???ə?Ɩ??Ɩ??ʚ??ə???Ɩ?ʚ??QQQQQQ??????ё?ё?RRRRRR??Օ?UUUUUU??ϟ?PPPPPP?֖?ə?ə?????ϟ???RRRRRR???PPPPPP?Ⲳ?666666??~~~~~~???~~~~~~?켼??斖??qqqqqq?000000?]]]]]]?ח??ӓ?RRRRRR?Ξ?˛?˛?˛?ʚ??Ξ??TTTTTT?Օ?Օ?ٙ?[[[[[[?ݝ??ܜ??ٙ??ښ??????ۛ?ZZZZZZ?ޞ?\\\\\\?\\\\\\??SSSSSS?嵵???TTTTTT?222222?000000???????QQQQQQ??Ⲳ?ᑑ?QQQQQQ?????ݝ???XXXXXX?ܜ??[[[[[[??SSSSSS??Ԕ?VVVVVV?ח???֖???ܜ??______?ޞ?ٙ??ۛ????????ۛ?______?⒒??pppppp?ޞ??ٙ???pppppp????ߟ???111111??UUUUUU???ؘ??ZZZZZZ???Ԕ?ӓ?TTTTTT???Ғ???RRRRRR????ё?ё???PPPPPP?Ξ?Ξ???Ș?ʚ?PPPPPP?ʚ?????Ԕ??XXXXXX?ח?UUUUUU??TTTTTT???Ǘ?ŕ?????ё???PPPPPP????Ș?Ș?PPPPPP?Ĕ???͝?̜??͝?̜??Ǘ??PPPPPP?Ș?QQQQQQ???Ĕ?Ǘ?Ɩ??Ɩ?ϟ?Ș?Ĕ?Ĕ??’??ŕ???Ǘ??Ǘ??ŕ????ə?͝?Ξ???QQQQQQ??QQQQQQ?PPPPPP?ё?????Ξ?̜?ϟ????Ǘ?Ș?Ǘ????͝?А?PPPPPP???WWWWWW?ٙ?\\\\\\??뻻?======?흝?^^^^^^??<<<<<>>777111999777222333>>>111333666;;;444444666333...555000+++...---(((///>>>===,,,:::;;;SSS;;;888OOO666SSSVVVPPP===IIIDDDAAA<<>>222***+++111888'''(((%%%%%%***%%%&&&%%%$$$&&&$$$'''###  +++(((!!!"""!!!!!!!!!###"""$$$ ###'''%%%///###%%%((((((&&&***'''>>>(((---333---111bbb***555666$$$###%%%,,,+++((()))000999KKKBBBDDDNNN<<<<<>>//////666@@@999555---222333333666:::444'''''':::111///333---PPPCCC???KKKLLLFFF===JJJGGGCCCIIIMMM@@@AAAGGG@@@CCC:::888111,,,...---///111)))***///$$$000%%%(((***%%%(((&&&$$$"""!!!!!!''':::((( %%% """!!!&&&$$$!!! 666***'''&&&"""!!! ###"""!!!'''!!!$$$222---(((---,,,&&&///444///333+++222+++,,,%%%>>><<<'''+++333%%%$$$++++++//////666LLLWWW333000999KKKUUU===III444000......///666777(((+++,,,...(((+++(((&&&%%%((('''***+++333111///---++++++555((()))---'''+++,,,000...---/////////>>>999555000555777666777222...000...444444333<<<======:::===GGGAAA???<<>>222+++---:::>>>GGG333666:::>>>777888:::LLLcccVVVKKKRRRPPPTTTCCC===```BBBPPP777===///111,,,///,,,+++KKK%%%%%%''',,,'''111000%%%&&&$$$ ***(((;;;=== """###444$$$"""666$$$###$$$+++###:::"""!!!""" ,,,===(((,,,///%%%+++((((((000+++///AAA111888111<<<,,,***888***555$$$(((%%%)))000***000---333===888444555CCC<<>>333!!!---)))((()))((($$$222444777JJJRRR666222888)))%%% ###...:::---000---222,,,888444---///444777555???DDD333---///111+++((()))***,,,)))---111000333333(((666222(((&&&(((444QQQ---(((***((('''((('''++++++******)))---///555666NNN888::::::666666777???555999222---///111444999<<<777666:::>>>^^^CCCaaaAAA??????DDDOOOHHHAAA888AAAJJJ:::>>>///===[[[BBBUUUDDD:::NNN;;;555555;;;777EEECCCJJJQQQNNNQQQMMMHHHMMM\\\KKKMMM@@@CCCWWW:::KKKRRRbbb444666000***...+++111&&&***""")))***%%%%%%!!! !!! &&&!!!&&&!!!!!!((((((---!!!'''$$$&&&111 $$$ 000%%%&&&)))555111((($$$)))000111******&&&)))FFFDDDmmm{{{VVV555,,,(((%%%&&&!!!'''111LLL***555...000+++444///,,,///222999777222111888333444000000999------+++111111111HHH555555+++''',,,***'''(((+++'''***111((('''***)))***+++...***//////,,,,,,444333---444777333444666555;;;222222888999???555999<<<666555888999VVVNNNJJJTTTMMMGGGMMMBBBAAAAAA@@@GGGHHH333...333HHHFFFHHHCCCQQQ]]]>>>---333@@@:::333:::@@@bbbVVVMMMWWW```SSSPPPHHHQQQOOOCCCDDDBBBEEEMMM[[[RRR:::000111111///333(((000,,,'''***+++$$$'''$$$'''### !!!FFF!!!(((!!! !!!)))"""%%%###%%% ###000$$$888******(((---***@@@kkk;;;555'''///))))))///...---333KKKrrrI%```///***'''%%%"""###'''111222......---...111...)))///)))///222999222888BBBKKK555111+++555//////000))),,,444,,,***+++)))&&&$$$''')))'''%%%%%%---555''''''(((***...+++///---***000111000333000111222000333000000555888444222888777999???999FFF999888555333???MMMEEElllRRRBBBEEECCCAAABBBOOOJJJ999444999999RRR]]]VVVUUU\\\DDD777666MMMAAA555666>>>XXXMMMHHHUUUZZZXXXbbbRRR[[[SSSRRRUUU^^^kkkQQQMMMGGG===222...---444+++***333,,,%%%''')))$$$""""""###''''''###(((///###===!!!222???QQQ"""!!!000###&&& $$$<<< """,,,"""'''CCC///666AAA222---VVV+++***'''//////)))...BBB'''+++,,,111000CCC___mmm===000+++((($$$'''(((+++...666+++//////333:::///+++++++++000777DDDJJJEEEddd888444222---+++(((+++...%%%%%%,,,++++++***$$$---***777111HHH%%%)))***++++++&&&%%%)))---))),,,///000...,,,///111///444222555000222000222222444CCC999;;;:::DDD>>>666888:::777:::444:::;;;MMMCCCXXXLLLAAADDD???BBB===AAAFFFFFFFFF888HHH zzzGGGFFFNNNnnnCCC000111???555???OOODDDIIIKKKSSSWWWiii|||LLLVVVBBBkkkgggGGGHHHCCCLLLRRR333111777000///000222###%%%%%%"""!!!'''000000'''###!!!///"""@@@((( ---(((&&& &&&+++222### )))***&&&CCCGGG%%%,,,000>>>444***(((((('''***111<<<***777III///CCC222***:::ZZZPPPRRR000+++)))111---111,,,***000...333000---???111))),,,111++++++000777VVVSSS >>>222...(((((((((+++;;;+++)))(((+++JJJ///&&&'''&&&+++...///,,,%%%###(((''',,,'''(((***+++------,,,000---000000///***///000333111666333444000KKK333555;;;888;;;555>>>CCCHHH===111555;;;FFFMMMhhhDDDBBBOOODDDCCCAAAEEEUUU;;;AAA<<>>000,,,999ccc\\\RRRRRRPPP YYYhhhXXXPPPCCCWWWjjjEEE>>>AAA<<<777<<<444AAA111333///222&&&))))))((('''%%%### !!! """)))%%%OOO !!!+++WWW111\\\((((((###""" %%%******222==='''222&&&###+++---111555'''///...777,,,---'''+++FFF888000555111KKK???777222@@@---:::AAA777...333&&&(((+++---000EEE(((...888...///---***&&& """&&&%%%///000FFFiiioooCCC...000888---***'''***333***&&&+++000999,,,...///***)))&&&'''$$$%%%&&&+++:::&&&(((,,,,,,+++%%%---------,,,+++...000...///...000888555999555555;;;111777888777888???@@@???;;;:::444999XXX```DDDVVVGGGDDDUUUKKKAAAQQQFFFDDD:::===999>>>EEEqqqMMMIII???@@@===FFF;;;:::LLLJJJDDDMMMPPPSSSbbbUUUJJJKKKnnnPPPYYYYYYXXXWWWCCCGGGDDDAAA000///888EEE888333***)))(((,,,***(((>>> ###"""$$$$$$###!!!*** '''"""!!!...222'''RRR222222$$$"""--- """!!!!!!---***###&&&$$$...777MMM$$$%%%&&&===///555...111(((,,,...---...BBB---222333666++++++JJJ999999(((+++222111333...+++(((&&&---///222(((///000//////,,,+++)))$$$  !!!111===000888ppp@@@***222---(((111111###;;;DDD,,,---111;;;000444---))))))555///(((''''''+++,,,***,,,)))'''+++000///***)))++++++000***,,,...///000222777___iii777XXXDDD777333777=========;;;:::444>>>CCC???CCC<<>>DDD222"""###"""###%%%"""!!!!!!...%%%,,,,,,###:::  %%%!!! !!!&&&!!!"""&&&))))))CCCQQQ555DDDTTT777...888QQQ@@@==='''222333+++...:::ddd222((((((***(((000)))***(((...AAA444000///'''$$$'''$$$***,,,:::,,,***,,,,,,---+++,,,---%%%&&& !!!$$$***---+++&&&FFF[[[***$$$$$$%%%))))))---111000,,,111,,,111777***+++&&&---))),,,+++)))&&&&&&(((&&&'''+++***+++((()))++++++,,,***000...+++000222777555888<<<;;;>>>LLL===999333>>>:::;;;888<<<999999???<<<@@@>>>DDDAAADDDFFFPPPDDDFFF???GGGHHHDDD777888IIInnn===BBBQQQ]]]<<<222333JJJDDDCCCiiisssHHHHHHBBBFFFGGGPPPbbbXXXuuukkkAAA;;;FFF>>>@@@:::222:::???888///111111333222222'''&&&%%%###&&&"""$$$!!!!!!&&&### !!!  &&& 111---$$$%%%000 %%%### $$$&&&***###+++222!!!'''###"""555***555+++888CCC+++LLL>>>AAABBBNNN???...)))%%%###(((888JJJ"""!!!(((%%%...&&&### +++((((((;;;QQQ)))$$$''''''***(((222***,,,///'''***)))"""###%%%$$$###&&&***%%%&&&%%%%%%&&&888((()))***(((%%%000777666000222(((222111<<<+++)))((('''777,,,***---***)))''''''(((************///---,,,---...///...///......000333333888999>>>999:::>>>===AAA;;;555:::;;;:::;;;444===:::PPPBBBAAAAAA???III???EEEHHHGGGDDDDDD???<<>>===BBBDDDIII___PPP___JJJHHHIIIUUUSSS]]]ooonnnKKKBBB999:::AAABBBIII===<<<:::...222666222666666000,,,%%%%%%(((***(((===!!!  &&&...'''!!!))) !!!%%%,,,%%%(((%%%$$$###$$$999"""%%%999&&&"""---000222666+++---666222;;;ZZZcccfff...???***%%%###""")))&&& !!! &&&---$$$&&&'''###,,,!!!$$$)))&&&%%%AAA&&&***111@@@)))///)))999000******)))$$$&&&333,,,%%%'''***+++***((('''<<<$$$%%%---(((///,,,111555333---...+++999+++999+++---+++%%%)))333///***+++&&&---444222)))(((,,,...///***......111...222///000...---000///222RRR666QQQJJJLLL;;;:::<<<:::888999888;;;555888888777???@@@:::AAAHHHEEEGGGTTTPPPMMM@@@EEE<<<777;;;BBBGGGHHHIIIIII>>>>>>;;;??????<<<;;;SSSLLLTTTlllRRR[[[WWWdddQQQTTTLLLIIIGGG:::666>>>===>>>:::444555444...---000333<<<111%%%'''''')))+++&&&,,,---$$$###&&&!!!###$$$"""$$$    (((555'''""">>>///))) ###!!! ,,,+++###000...###...000(((---///111444///...555CCCXXX___777999888000------+++%%%""""""!!!%%%+++###$$$&&&###$$$%%%'''(((***,,,&&&&&&&&&...FFFZZZ)))+++)))???&&&$$$&&&000***"""(((///&&&'''***---'''&&&'''(((&&&'''&&&)))+++444,,,///000;;;...)))...:::------'''(((+++000+++...444,,,222***......++++++***+++000777///666555444666111111,,,,,,...222777333111::::::===LLL<<<<<<;;;:::;;;<<<333555777666444CCCEEECCCAAACCC???AAAKKKJJJLLLsss;;;888777HHHJJJMMM<<>>===666999VVVcccYYY[[[ppp]]]XXXNNNKKKFFF===555<<<===666222666///777777555---...333222***%%%)))%%%'''###!!!$$$!!!!!!###!!!""" ###$$$ '''DDD!!!$$$### ///!!!$$$000 !!!!!!###### ######===(((777,,,444222111///000666888777888111777RRR:::777111:::///***(((%%%&&&""" ###(((###!!!"""!!!//////,,,******///***&&&------111***,,,(((<<<''''''&&&III'''%%%&&&'''BBB((())))))'''&&&(((((((((%%%,,,&&&&&&)))......///,,,---+++555666;;;***999000)))---+++---111000000///000000...222///000111;;;111:::111555444666///,,,,,,,,,---444777444...333UUUxxx>>>======>>>>>>888:::<<<333555999@@@FFFGGG>>>EEEQQQFFFAAALLLIIIDDDAAA<<<>>>===dddPPPWWWJJJ===???777<<>><<<111000///555AAA222...,,,///---======999)))%%%'''$$$$$$%%%!!!(((""""""######!!!$$$''' ...%%%&&&!!!###))) 000 ///&&&)))III;;;&&&""")))+++'''888$$$&&&---***///777111BBB===;;;FFF888LLL444;;;???@@@888666///+++111+++222&&&###(((///000###$$$ &&&(((''')))"""%%%***)))%%%###'''***%%%'''((()))((())),,,&&&&&&''''''222$$$&&&***(((***+++---,,,)))---XXX)))333,,,)))AAA111---'''''')))'''111rrr666---...000,,,111---222GGG///000999000......333444999555666777111222333@@@111555555111333999999444333333===GGG888555777===;;;666======666444:::999;;;AAA???PPP???GGGLLLDDDEEEMMMCCC@@@???===@@@@@@EEEAAADDD???::::::;;;======888111'''###LLLQQQPPPhhhOOORRROOOYYY@@@BBBEEE===DDD999///000===555......;;;444+++,,,***;;;111+++***$$$''')))''')))>>>&&&+++$$$"""&&&######***555:::"""(((  >>>:::  %%%###%%%$$$OOO$$$%%%!!!!!!)))$$$$$$&&&%%%+++((('''...???333555@@@888+++---555YYYgggLLLGGG@@@888000,,,---///((("""+++***---000'''%%%)))---+++&&&!!!"""***(((&&&))))))+++(((---***$$$%%%)))((("""''',,,000******111'''&&&(((''''''***)))///333)))&&&...***,,,&&&&&&+++***000---111222///+++...222///...///999888222///***222555333111777;;;777555999:::333111333111444777555333000777222111BBB:::777888777::::::@@@999999555555<<<:::666DDDLLLSSSGGGFFF@@@BBB@@@MMMEEEEEE???BBB;;;<<>>...,,,(((&&&'''%%%)))'''""",,,%%%(((///"""###!!!!!!!!! %%%%%%<<<'''%%%&&&%%%)))***111)))___'''&&&%%%$$$%%%   ***$$$###%%%******222(((......;;;DDDAAA333222444111]]]cccLLL:::JJJ///+++---!!!,,,%%%(((222))))))'''))),,,,,,888((($$$ &&&***)))***'''aaa)))((($$$''')))&&&(((&&&%%%&&&)))...222111222+++((($$$***((()))(((***'''*********)))''''''(((...///555666///333111,,,......000555...---///777...333555///000555111///888...666999999::::::222555<<>>FFFEEEBBBAAA>>>???RRR>>>FFFCCC;;;:::>>>===<<<<<<===777777444GGGhhhpppzzz___YYYWWWSSSMMMHHHGGG???888555999999666777666999111111@@@,,,+++)))###((('''''''''(((%%%%%%$$$%%% $$$%%%)))***  ,,,,,,!!!!!!!!!$$$ &&& """###((($$$(((///'''### %%%!!!$$$&&&)))###"""!!!'''000...)))&&&111444111777444TTTWWWIIIoooU&ccc???---111222&&&''',,,444)))+++((())),,,(((***,,,***)))...%%%'''$$$)))(((''''''((((((&&&###$$$'''***%%%'''(((''''''"""&&&+++((((((%%%)))((()))+++'''***+++,,,,,,+++(((***+++))))));;;000,,,---//////...,,,---///999888444...111555222555AAA:::444222///555444666666AAAOOO555999;;;:::999777999666===>>><<<;;;888:::777777@@@<<<;;;EEE===<<<@@@III;;;>>>>>>:::???AAADDDGGGAAA:::EEEIII@@@===BBBBBB===>>>???BBBLLLJJJCCCAAA>>><<<===666333888@@@^^^xxx[[[PPPPPP___[[[RRRVVVNNNFFF>>>VVV;;;666@@@===FFFkkkEEE444;;;UUU///000+++000...)))"""%%%$$$666WWW...%%%!!!)))"""###""" ,,,$$$!!!  '''### """%%%XXX///+++'''&&&YYY+++)))!!!'''""""""777,,,!!!OOO!!!$$$"""$$$!!!)))000'''111333)))&&&)))###666EEEJJJnnn& XXX999222888...)))%%%***222*********888222---***)))((((((&&&555)))"""%%%222)))'''%%%'''((('''''''''$$$(((&&&'''***+++***,,,+++...---%%%(((---***///,,,&&&%%%&&&------)))---777...000>>>000111111---222333222///333;;;<<<>>>888222999444000???888333444333555888555111777<<<:::@@@;;;888>>>777???===:::<<<<<<666<<<===:::555:::===888;;;HHH===DDDEEE@@@<<<>>>GGG<<>>@@@NNNCCCZZZLLLXXXOOO???AAADDDDDDAAAEEE===;;;;;;999222333000555CCCDDDRRRUUUTTTZZZRRRoooQQQGGGXXX>>><<<===:::===555333666111666FFF...)))---(((111000''''''&&&444JJJ---&&&)))### """'''$$$((((((%%%###999 444!!!sss !!!&&&999111$$$""" !!!'''+++"""&&&<<<%%%'''###"""((('''hhh555$$$&&&"""%%%(((JJJMMM}}}yyy___333888222000>>>555(((---******)))---***...,,,,,,'''(((&&&)))'''!!!&&&((($$$(((---666)))***+++(((+++...'''000+++---...---,,,...+++(((,,,,,,,,,---...'''+++))))))***,,,,,,,,,000CCC777222...999888???999555444999444??????===<<<===555888KKK222888999:::444:::666///555555===>>><<>>BBB???LLL<<<>>>CCCAAA===BBBPPPDDDSSS???CCC@@@>>>EEE@@@===???::::::>>>>>>===;;;999...///666DDDRRRVVVjjjZZZNNNRRRPPPLLLLLLZZZ999@@@DDD:::999<<<555444000000)))///333---,,,333777+++***)))000%%%...'''...%%%!!!$$$###  %%%))),,,******%%%$$$!!!"""000***,,,###(((***333###%%% $$$ +++######!!!$$$%%%!!!###"""222""""""###%%%%%%&&&%%%$$$&&&+++""",,,;;;MMMdddKKK222===FFF444333333,,,(((222)))111///444...111000...)))$$$&&&((((((******)))---+++(((+++...///***%%%***//////(((,,,///...---,,,,,,111000...111---...++++++///+++---***------///555444000111...444...000333222444555888@@@555666333999;;;???777444===AAA666333666000222999;;;RRR<<<===AAATTTCCC777555===>>>>>>888999888888999:::999888999OOO>>>>>>HHHEEE===>>>@@@DDD@@@;;;===BBBDDD===GGGIIILLLCCCBBBFFFDDDAAAEEE???;;;===???BBBFFFAAA999999;;;333888???QQQHHHCCCNNNgggPPP^^^GGG@@@999AAA>>>???:::888444...///,,,***///,,,......111@@@999666,,,222++++++'''%%%111(((***...>>>!!!$$$DDD)))$$$%%%'''***???WWW '''!!!)))%%%"""000"""###!!!,,,%%%'''!!!######"""###!!!((('''+++$$$ """!!!######%%%,,,000///555000@@@TTTNNN<<>>666555999888444======;;;888BBB:::888===<<<:::;;;666666;;;BBBAAAAAA@@@AAA:::DDD888@@@>>>@@@???BBBEEEIIIEEEDDD@@@@@@@@@AAA@@@DDD@@@???HHHHHH???;;;888:::===AAA:::JJJAAAKKK[[[bbbSSSFFF===LLL===JJJIIIGGG@@@:::888BBB333//////555///''',,,GGG666+++@@@@@@000(((((((((///---$$$%%%$$$###%%%!!!000777 """"""!!! //////111)))%%%"""###"""444&&&%%% """###///"""###  '''""""""555###%%%"""'''$$$ &&&)))$$$$$$###'''+++***&&&999AAANNNVVVJJJIIIFFF;;;...999666222333///***000///777...)))---+++###)))'''---(((***------***---222---555999...***000///333---///.........+++---***;;;///111...+++---......111---000///---...000222222///333,,,///...777111222333888999jjj@@@<<<999BBB===888444444---999444111111FFF:::666666@@@===CCC888555333666333888@@@AAA:::BBB:::999888777:::888666777DDDDDDCCCAAAEEE:::666888555???AAA???CCCPPPPPPCCCBBBAAAAAAAAACCCDDDEEEFFFKKKAAA@@@CCCAAA@@@BBB@@@@@@:::GGG^^^___QQQiiiPPPAAAFFF<<>>>>>888BBBDDD999777:::777:::KKKZZZ@@@>>>:::777444444<<>>DDDCCCLLLJJJEEELLLLLLHHHTTTHHHBBBMMMJJJ[[[BBBNNN777555888444111555111222------>>>333555HHH;;;999333)))"""######$$$###$$$$$$NNNIII,,,GGG222---$$$%%%/// ***$$$IIIFFF888!!!"""GGG(((&&&FFF$$$!!!###'''######'''###,,,'''%%%###%%%&&&)))(((+++)))&&&444???HHHjjj4aaaMMM666;;;666PPP???+++(((///000---:::///555,,,...'''***&&&///===888---,,,,,,111777DDD777333000444888222---111555333555666444444BBB777999777HHH>>>888DDD>>>888BBB???888333555888777444444111222///999666999EEE???999>>>888555DDDUUUQQQ:::666444000<<<444444111333666999666>>>;;;===555666BBB>>>>>>222666DDD:::FFF@@@FFF:::777<<<;;;>>>999999777777>>>>>>===<<<@@@777::::::::::::@@@???HHHLLLHHHMMM>>>???<<>>@@@999CCC444111333444111111444444777:::;;;<<>>GGG666555666<<<...000///666111111666666???555888666BBBGGG:::>>>:::DDD999\\\???CCCNNN;;;======AAA;;;<<<<<<999888BBB@@@>>><<<;;;;;;@@@???@@@===IIIEEEDDDGGGHHHNNNBBB???FFFAAAEEEFFF???DDDBBBQQQGGG???@@@>>>DDDZZZJJJJJJMMMEEEHHHGGGMMM^^^iiiaaaQQQOOOGGG:::666555888555444000...+++000---///TTT \\\333,,,$$$+++&&&,,,%%%%%%""" !!!///'''$$$111$$$###((("""###!!!666%%% $$$&&&!!!"""###$$$!!!!!!777!!!222111+++!!! $$$$$$!!!%%% +++"""""")))######&&&)))222%%%&&&$$$%%%)))&&&"""###444444???VVVsss7)aaaXXXCCC555;;;666<<<777444888111222---+++---444BBB000///444...333000555555444111---...---333333333BBBAAA>>>888999888777666999444<<<999>>>===:::ZZZ===888<<<888555999===;;;666555444<<<555555444333666888333222333333666999444555222???BBB;;;444]]]JJJAAA777555000444333666///555444777:::BBB<<<;;;:::FFFBBB<<>>;;;555666888777888222888555iii===888:::;;;:::666333444HHH222444111222<<>>AAAEEE666222;;;999<<<>>><<>>HHH:::777999===<<<555===<<<@@@BBBJJJEEEEEEJJJHHHDDDBBBAAAGGGEEEEEEBBB;;;AAAGGGGGGGGGDDD@@@???@@@:::999<<>><<<;;;999:::999???777;;;@@@777555888:::999555WWW888777555666888===666===@@@>>>@@@555999777666444666555111222000...444888RRRPPP===???333222333333---555000111555777<<>>IIIFFFAAADDDBBB999444<<<999:::888===@@@555444777SSS:::444555===JJJFFFTTTJJJ]]]bbbNNN@@@GGG@@@===BBBEEECCC@@@CCC??????IIIEEESSS999>>>;;;777,,,000FFFCCCQQQZZZ[[[ xxxQQQQQQQQQBBB>>>HHH888555222///......,,,---''',,,...&&&***333***((( &&&$$$%%%!!!"""(((%%%!!!'''!!!!!!"""++++++---$$$***'''222777666!!!!!!!!!'''$$$ +++""""""######$$$!!!%%% """$$$$$$"""###"""...'''444---:::@@@PPPLLL;;;@@@VVVQQQAAA333444333999FFF777555333444777333222222;;;)))---///111000,,,***999;;;777222333555555AAA<<<@@@AAADDD777???BBB;;;:::@@@:::@@@@@@555555777;;;;;;;;;777777888999>>>BBBCCC>>><<<888999666:::999BBB===;;;===888888888555888666222444111111999888GGG;;;CCCooo===000222CCC...111222111777;;;999888AAARRR111000444999:::OOO<<>>CCCHHH666===<<>>???:::>>>DDDCCCCCCBBB===DDDLLLGGGHHHCCCBBB666222///333333???eeerrr^^^VVVEEEHHHHHH;;;777999333@@@222---***)))'''%%%))))))(((---+++'''(((***### %%%'''&&&)))$$$ !!!""""""%%%(((***$$$000FFF******$$$ $$$((($$$ )))***!!! """444///!!!)))***444'''(((&&&###!!! !!!$$$###'''+++,,,((((((000===,,,:::444KKKXXXCCCQQQ:::HHH??????EEE<<<999333000555555000222...111+++000...333222///333333555555;;;>>>YYYDDD<<>>>>>===???BBB@@@;;;666;;;===???;;;===BBB@@@:::>>>;;;888444888???<<<888666999999777555444777999444888<<<:::>>>@@@:::888999999:::222444555@@@LLL666<<<<<>>>>>555:::AAA;;;444::::::===EEE```999999333LLLDDDYYY???000111888;;;666888TTT777:::cccFFFDDDCCCDDDEEEBBBCCCAAACCC===???@@@@@@FFFCCCCCCEEELLLeeeMMM[[[;;;///+++000///000bbbeeeyyyhhhSSSFFF;;;HHH999333444333333)))666+++)))(((000$$$&&&---+++---###,,,''')))''''''%%%$$$&&&######%%%'''//////***RRR666)))$$$$$$&&& ---))) (((%%%$$$444...<<<$$$"""&&&$$$))) :::%%%!!!$$$)))---### ...'''&&&333***$$$'''(((%%%***///'''...999GGG -]]]AAA999888666[[[@@@???UUU666777999555444888777777444555333888888<<<666;;;<<>>DDDAAA<<<:::===BBB===>>><<<>>>CCC>>>:::EEEDDD>>>FFFAAA@@@@@@AAA@@@>>>>>>BBBAAABBBBBB<<<:::<<<;;;<<<777444QQQ666<<<555888888777===777888<<<777AAAHHH@@@UUUDDD999;;;666777;;;666222444444555;;;@@@;;;AAA555;;;===CCC999<<<;;;;;;777<<>>444111555:::666...---'''***$$$+++444###""")))(((333((((((,,,)))&&&%%%%%%"""$$$$$$***### ###%%%&&&555;;;KKK333222)))$$$+++ !!! '''((( (((III:::"""!!!$$$%%%###,,,$$$"""!!!...---)))######  ###&&&000((("""%%%+++)))$$$)))(((,,,777??????GGG___:::777777888BBB999KKK888444>>>DDD222111555444333@@@666555999===AAACCC@@@BBBDDD>>>CCCDDDAAAGGGDDDFFF===>>><<<======>>>BBBBBBHHHDDDNNNKKKBBBHHHBBBHHHLLLBBB===@@@EEEMMMCCC>>>BBB@@@;;;>>>;;;:::;;;444333777777555555777<<<:::<<<:::>>>999FFFEEEOOO888EEE888999;;;:::FFF333777666999555666999>>>888<<>>>>><<<777===<<>>HHH===///111777;;;666@@@<<<666<<>>NNNDDD:::777:::666;;;<<<444999???BBBDDDAAA???DDD@@@FFFLLLCCCEEEDDDIIIAAAGGGAAAGGGMMM@@@444999@@@111??????EEEaaaHHHFFFPPPgggOOOPPPFFFAAA:::>>>;;;333444111+++PPP111***222******''')))((()))---***(((%%%111%%%'''(((333888000%%%$$$%%%&&&''''''OOO~~~777&&&+++###%%% *** ---'''999$$$999###*** ######""""""'''777>>>444222111***"""""" ''')))&&&///%%%***'''***(((%%%((((((++++++)))///...//////333333GGG```[[[888EEE;;;999<<<666666111:::777===999@@@KKK:::<<>>>>>======;;;===:::>>>888777777888:::777<<<666777555999===HHH===:::;;;???IIIEEEDDDEEE999:::333:::;;;[[[QQQBBB777===;;;666???JJJ999999222@@@333666:::;;;999;;;999999???DDD>>>>>>===>>>>>>@@@III999777III???BBBAAA===BBBGGG@@@EEE<<>>AAAIII;;;777666888???333888555;;;GGG>>>===<<<;;;EEEAAACCCDDDDDDGGGDDDAAAGGGDDDMMMLLLSSSJJJRRRJJJIII[[[HHHiiiOOOGGGKKKGGGQQQNNNLLLNNNJJJSSSOOOQQQIIIUUUOOOUUUWWWIIIAAABBBDDDFFFEEE>>>GGGAAADDD>>>BBBCCC==================>>>@@@777999555777===FFFAAAAAA<<<:::;;;CCCAAACCC777<<<:::===>>>MMMUUU======;;;;;;===AAA===;;;666666???:::???666999<<<666;;;???>>><<<888<<>>@@@BBBCCCBBB@@@===<<>>;;;666:::999:::;;;>>>FFFFFF@@@===>>>DDD???===CCC>>>@@@EEEDDDJJJHHHDDDIIIXXXNNNGGG[[[UUUrrr```NNNLLLTTTGGGNNNGGGNNNSSSPPPOOORRRQQQDDDGGGHHHFFFHHHPPPNNNJJJDDDHHHLLLKKKGGGFFFAAABBBAAAAAA???BBB>>>???===???EEEAAADDDCCC<<<===:::999CCCHHH\\\NNNDDDCCCCCC>>>AAA???===;;;:::EEEFFFDDDGGG>>>>>>@@@888:::999QQQ;;;@@@888>>><<<;;;FFF===LLLKKKDDDZZZlllBBBAAAFFF@@@DDDLLLRRR===888???BBB999BBBFFF===BBBCCC<<>>===555999000888---...999---******+++///+++((((((###%%%%%%%%%!!!''''''(((???,,,{{{BBB""" """000555%%%%%%###111"""###!!!(((...)))$$$ !!!!!!!!!!!!###!!!111333)))333$$$,,,)))000%%%###...'''&&&###"""$$$ (((%%%///---555777222<<<<<<@@@MMMHHHFFF<<<:::AAACCC;;;@@@KKKHHH???<<<:::??????]]]DDD???NNN777===999DDDCCCDDDFFFKKKEEEKKKKKKLLLSSSLLLgggWWWCCCAAABBBQQQLLLNNNMMMVVVQQQKKKNNNcccHHHLLLKKKGGGCCCEEEQQQBBBAAA???HHHPPPTTTLLLJJJFFFGGGGGGDDD???BBBBBBLLLEEEAAACCCJJJHHHGGGAAABBB<<<<<>>>>>???III@@@<<<===JJJIIIBBBDDD@@@>>>FFFEEEPPPOOOWWWGGGLLLHHHIIIKKKFFFFFF@@@???===<<<(((000888888555999EEEGGGKKKFFFAAA:::<<<999:::222///111>>>111444///...))))))((('''...&&&!!! !!!$$$%%%000333111<<<(((###!!!!!!%%%...---$$$ GGG######)))999 !!!"""%%%###$$$OOO///444&&&)))((($$$$$$&&&===@@@((())),,,&&&###&&&)))***%%%***,,,...@@@;;;333666===CCCJJJJJJ>>>___[[[OOOEEE<<>>AAA===999999AAA@@@DDDAAAGGGOOO???CCCEEECCCAAACCCAAAXXXPPPjjjNNN]]]NNNWWWPPPJJJMMMKKKLLLMMMOOOYYYXXXOOOPPPTTTNNNPPPKKKRRRJJJBBB???CCCLLLLLLOOOCCCJJJQQQVVVQQQWWWJJJdddTTTJJJPPPEEEGGGFFFDDDGGGIIIGGGKKKRRRIIIHHHEEEHHHBBBGGGFFFGGGGGGIIIGGGJJJFFFEEEHHHIIIKKKIIIMMMEEEDDDAAAFFFHHHJJJ===>>>;;;@@@<<<<<<999CCCBBB;;;@@@AAA??????DDDRRROOODDDCCCGGGSSS>>>;;;888666EEEKKKFFFCCCAAAAAA>>>BBBKKKMMMKKKGGGTTTGGGHHHJJJCCCIIIBBB@@@AAAGGG((("""888CCC???999===HHHDDD@@@DDD>>>>>>;;;???444///666666444222???))))))+++777'''((('''$$$&&&###%%%$$$ '''%%%%%%+++:::UUU)))&&&+++"""%%%###!!!((("""%%%)))))) @@@''''''(((666###'''  $$$555###!!!+++)))(((...RRR(((''''''...%%%"""$$$((()))((($$$222;;;===YYY555555777@@@<<>>CCC>>>HHHIII:::======???DDDBBBDDDRRRRRRPPPDDD@@@BBBDDDUUULLLEEELLL\\\LLLRRRGGGMMMMMMNNNIIIOOOTTTUUUQQQRRR^^^TTTQQQKKKNNNMMMQQQNNN===:::JJJ]]]fffFFFFFFPPPUUU\\\YYYSSSOOOPPPIIISSSQQQSSSLLLHHHIIIEEENNNLLLOOOEEEJJJFFFFFFJJJKKKGGGIIIHHHMMMOOOTTTMMMQQQIIIMMMGGGPPPFFFHHHSSSCCC???TTTHHHDDDJJJ;;;999<<<:::???AAA;;;KKKEEE===AAA===CCC>>>CCCBBBAAA@@@>>>@@@??????===???<<>>>>>YYYMMMEEECCCKKKMMMgggkkkHHHDDDAAAGGGEEELLLLLLTTT\\\hhh]]]MMMNNNdddSSSJJJfffZZZZZZ[[[UUUPPPOOOPPPNNNVVVWWWQQQMMMUUU[[[WWWeeeaaa___\\\\\\hhhlllZZZ```\\\UUU\\\ZZZTTTPPPJJJKKKFFFLLLOOOLLLTTTKKKGGGLLLDDDJJJRRRKKKLLLKKKTTTNNNRRRSSSOOONNNOOOGGGMMMEEEHHHVVVRRR@@@EEEKKKRRRIIICCC@@@CCCBBBDDDBBBCCCHHH>>><<>>===AAA>>>CCCCCC===HHHCCCAAA@@@\\\EEEBBBCCCKKKHHHHHHLLLIII\\\TTTJJJBBB<<>><<<;;;:::GGG???===@@@WWWBBB777======<<>>GGGEEEDDDAAABBB???BBBAAA???FFFJJJ===999:::<<>>FFFEEEIIIHHHHHHKKKDDDEEEJJJFFFEEEEEELLLFFFGGGIIIEEEEEECCCLLL<<<555///;;;;;;FFFRRRIIIGGGTTTBBBDDDBBB<<<333333666222444---000111---&&&///$$$((((((((('''###$$$###$$$%%%###)))*********&&&&&&###""" """  ''''''!!!555$$$!!!&&&$$$%%%###$$$%%%***)))"""!!!!!!'''###!!!&&& %%%///'''BBB@@@---***777666999@@@AAA>>>EEEAAA@@@EEEFFFTTT___>>>888;;;===AAA???FFF@@@BBBCCCFFF===FFFAAAKKKCCCKKKEEEHHHFFF>>>RRRZZZ~~~\\\TTTXXXjjjYYY\\\[[[eee___ZZZ[[[dddYYYaaaWWW[[[RRROOOWWWMMMMMMOOONNNVVVWWW[[[bbb```ZZZ]]][[[[[[iiiiiinnn%0mmm```TTT\\\\\\XXX^^^VVVPPPJJJOOONNNPPPUUUSSS[[[SSSMMMGGGHHHKKKPPPJJJ^^^QQQKKKKKKPPPRRRJJJHHHKKKIIILLLJJJNNNEEE@@@888999???NNNJJJBBBBBBJJJCCCGGGKKKIII@@@@@@???CCC>>>@@@BBB<<<@@@BBB@@@>>>>>>@@@;;;AAADDDUUUHHHDDDOOOLLLIII>>>AAA@@@FFFFFFFFFEEESSSJJJJJJQQQxxxEEECCCNNNDDD999------:::???AAAQQQKKKIIIFFFGGG@@@999111000111888111333OOO000000(((,,,%%%***%%%(((%%%---&&&((($$$&&&FFF&&&((()))+++---###((((((######!!!,,,"""&&&!!! $$$AAA!!!'''###!!!"""!!!''' ))) """,,,###"""""" !!!###!!!###$$$&&&$$$"""$$$(((...111555+++111333444...555555OOOGGG;;;666999<<<===GGGbbbVVVBBB===AAAHHHFFF<<>>CCCDDDNNNLLLJJJGGGFFFNNNLLLMMMBBBAAABBBEEEBBB@@@HHHBBBBBBDDDLLLDDD>>>BBB999LLL>>>IIIKKKBBB???;;;AAA<<>>333+++222111///000,,,555???DDD:::;;;111666555999AAADDDQQQPPP@@@999>>>QQQCCCEEEPPPeeeKKKFFFUUUDDDRRREEEIIIRRRGGGJJJMMMXXXUUUpppC6uuuppp zzzmmm zzzxxx___VVV]]]eeeiiieee___QQQ___iiiiii&sss```^^^^^^VVVRRRoooooottteee]]]~~~ooofff______fffhhhccc___YYYUUUVVVUUUaaaXXXUUUWWWdddYYYSSSRRRRRRSSSPPPSSSLLLOOOWWWKKKJJJ;;;:::FFFLLLIIINNNJJJJJJIIIEEEMMMTTTNNNIIIFFFGGGFFFOOOLLLJJJDDDFFFGGGIIIHHH@@@BBBGGGBBBAAAFFFDDDBBBEEEVVVJJJ@@@BBBFFFEEEBBB===CCCKKK===???@@@CCCEEECCCIIIJJJIIIIIIEEEFFFGGGFFF<<<000@@@NNNEEEGGGIIIEEENNNIIIRRROOOAAA222666BBB===888222333777...---%%%***---&&&)))(((%%%---$$$!!!%%%###!!!!!!%%%(((((((((###***&&&"""###%%%'''%%% """"""%%% (((+++!!!###%%%///AAA)))'''"""---&&&&&&'''""",,,***...555111&&&(((000666,,,...,,,---333<<<,,,111:::ZZZ888777333555888333000111333555333777777999BBBBBB[[[xxxLLLIIITTTFFFFFFIIIFFFIIIGGGIIIKKKNNN```iii mmmoooccchhhHaaalllhhhhhhhhhUUUTTT___TTTUUUWWWfffVVVjjjqqqjjjeee\\\LLLPPPcccfffjjj___cccbbb{{{yyytttzzznnnrrrjjjeeeaaaaaa^^^eee[[[ZZZXXXZZZ\\\]]]\\\```^^^ZZZSSSRRRTTTRRROOOTTTOOO???:::777FFFNNNRRRYYYVVVPPPQQQLLLuuuiiiPPPEEEGGGHHH\\\LLLLLLLLLaaaNNNJJJHHHHHHCCCCCC===GGGDDDEEEFFFFFF888444777>>>KKKOOOJJJDDDFFF???DDDCCC===<<>>===333///,,,000---///'''(((+++'''&&&+++&&&&&&&&&((("""(((######(((+++---'''@@@"""!!!#########*** AAA%%%###$$$((($$$###333$$$((($$$###$$$###555+++###$$$---!!!'''+++%%%...***999...///...<<<)))///444444000000000---222444---222444======@@@???;;;:::222:::777888@@@BBB???DDDDDDBBB>>>CCCGGGDDDCCCGGGBBBFFFKKKKKKHHHPPPfffddd~~~pppqqqoooeee```pppzzzbbbhhh}}}lll]]]bbb]]]YYYTTTaaa___YYYWWWPPPZZZ]]]\\\bbb___WWWXXX]]]kkkccciii}}}xxxrrrccc```mmmfffpppnnnnnnvvvlllnnnnnn|||ppp[[[aaaiiikkkiiioooaaa\\\]]]\\\YYYVVVSSSTTTSSSYYYVVVTTTEEEFFFIIIMMMNNNTTTTTTUUUNNNUUUVVVYYYMMMIIIOOOPPPjjjUUURRR[[[ VVVMMMIIINNNLLLFFFCCCQQQIIIGGGIIIBBB<<<===111AAAZZZFFFGGGEEEKKK???<<>><<>>PPPQQQWWWVVViiiSSSXXX\\\iiigggzzzssssssbbbeeefffhhh[[[___[[[UUUOOO]]]KKKOOOQQQWWWPPPRRR[[[WWW[[[nnngggkkkiiieeeyyyxxxzzzhhhcccZZZmmmdddcccgggiiiiiinnn nnnsssdddUUUUUU^^^fffaaaaaa\\\``````VVVUUUTTTXXX^^^]]]YYYWWWRRRJJJQQQOOORRRQQQRRRQQQWWWiii```XXX]]]GGGKKKOOOiii(^^^RRRRRRTTTXXXQQQKKKLLLJJJ@@@AAAGGGJJJHHHQQQEEE===<<<>>><<>>EEEFFFLLLIIIGGGEEE???>>>???>>>CCCBBB:::444333111///,,,000000(((###(((((('''&&&))),,,((($$$'''$$$///%%%"""%%%$$$"""$$$### ###"""'''%%%!!!###---""""""'''CCCccc%%%!!!''',,,555;;;@@@:::>>>'''%%%---&&&"""!!!######'''(((444...---+++...,,,***)))+++111---***,,,777///444111888888@@@:::555EEE===888999===@@@EEEQQQDDDDDDBBBAAAFFF<<<999;;;BBB<<>>QQQWWW<<>>FFFIIINNNLLLMMMKKKMMMRRRMMMLLLNNNppp---000:::AAA>>>@@@BBBQQQIIICCC@@@??????FFF===???:::EEE777444555000444(((%%%///+++%%%&&&&&&'''&&&+++)))((()))+++(((###"""666"""###%%%(((&&&###&&&*** $$$###'''$$$###***777666888:::sssuuuRRR,,,)))***&&&###888AAAkkk"""%%%,,,CCC---,,,111(((...888%%%222666333777666555??????OOO@@@666777>>>:::===GGG???III===888:::AAADDD999???>>>999888:::???SSShhhQQQLLLQQQMMMKKKKKKKKKRRRSSSYYYMMMKKKUUUYYY```\\\YYY___XXXaaa___\\\]]]TTTVVVcccXXXVVVVVVUUUTTTUUU[[[PPP```eeeaaa]]]aaagggvvvgggUUUccceeeooouuueeefffjjjhhhfff^^^iiigggcccbbb\\\jjjiiidddeee]]]ZZZ[[[ZZZ```___\\\ccc\\\]]]```dddbbbcccddd[[[[[[[[[WWWSSSVVVXXXZZZ[[[hhh[[[WWW]]]lllWWWVVVXXXVVVLLLQQQQQQRRRMMMKKKGGG>>>EEEIIIFFFNNNPPPMMM999@@@QQQ>>>777CCCOOO^^^rrrTTTTTTUUU===<<>>DDDIIILLLEEEBBB???DDD:::AAA===AAA;;;KKK>>>111888***+++---"""(((!!!###%%%&&&,,,...333***))),,,)))$$$""""""$$$"""###!!!###'''888((($$$555(((###!!!%%%---"""!!!///HHH222+++777cccJJJ(((&&&))) %%%---===sss'''+++222555,,,666222===(((333000444FFF111555555EEE<<>>===???BBBKKKXbbbUUUuuuEEE???AAA:::BBBGGGDDDNNNLLLKKKMMMNNNPPPGGGEEE999666666444,,,888@@@BBBGGGEEE>>>@@@AAA===EEE???>>>;;;;;;eee@@@888---'''(((%%%''''''''''''%%%***&&&+++===---,,,''')))$$$###$$$&&&"""$$$&&&$$$'''777 ###$$$###---&&&***)))$$$QQQ:::333???999)))%%%---+++'''###***######@@@+++000+++///888111666000777333///555777DDD555PPP;;;666999;;;NNNPPP<<<>>>???@@@OOONNNNNNFFF@@@<<<@@@===;;;888:::999888AAA===111<<<<<>>===AAAMMMggg -XXXIIIKKKJJJLLLCCCBBB???GGGHHHIIIIIIMMMRRRLLLSSSNNNJJJOOO<<<***000,,,555CCCHHHGGG???EEELLLBBBDDDFFFRRR>>>;;;<<<===777222,,,+++***%%%$$$'''999$$$&&&###+++'''///'''&&&$$$######,,,$$$%%%###%%%&&&*** """ &&&$$$'''GGG---'''!!!(((FFF:::,,,%%%222+++%%%$$$$$$$$$(((111AAA,,,---'''(((///,,,///000+++...555333222777666===IIICCC666:::JJJIIIKKKBBB<<<888999QQQ^^^UUUAAA@@@CCC<<<;;;999555999HHHXXX>>>EEE;;;666======CCCIIIIIIFFFPPPNNNccc -qqqXXXSSSHHHPPPWWW^^^SSSQQQeeeQQQVVVZZZ[[[WWW___VVVRRRPPPSSSUUUWWWXXXYYYIIILLLXXX\\\RRR\\\bbbqqqeeeggg\\\bbb``````cccjjjeeelllsssgggeeehhhnnndddhhhjjjqqqnnnjjjlllmmmiii```___ccckkkggg\\\XXX\\\ccc[[[\\\]]]bbbbbbaaa```___]]]bbb]]]]]]aaabbb^^^]]]\\\UUUYYYYYY]]]ZZZSSSUUUPPPOOOPPPTTTQQQVVVRRRJJJNNNKKKKKKKKKJJJDDDDDDBBBBBBBBBCCCNNNJJJWWWKKKLLLGGGKKKGGGAAA>>>GGGHHHHHHKKKLLLMMMQQQJJJMMMJJJ^^^WWWIII888CCC222DDDGGGIIIKKKEEEBBBCCCEEEKKKBBB>>>======999777===444000******'''&&&%%%---+++---(((>>>&&&$$$%%%"""$$$###$$$%%%&&&$$$ %%%(((###%%%%%% """""" ###'''%%%!!!'''+++!!!***'''///000,,,''')))***'''&&&+++...000+++111222,,,222---,,,---***'''...000???HHHMMM@@@===EEEDDD???===@@@999;;;:::<<<888777::::::DDDEEE<<<<<<000333888HHHQQQ;;;HHHIIINNNNNNEEEHHHLLLLLLFFFKKKYYY[[[QQQ^^^YYYYYYVVVJJJTTTUUULLL```ZZZ\\\\\\YYY[[[VVVWWWRRRNNNQQQSSSUUUSSSZZZ___FFFTTTXXXSSSQQQdddccc___bbbccc```]]]______uuueeeggguuutttlllgggddddddeeerrrfffiiihhhhhhttttttiiieeecccbbbeeeaaa```___ZZZYYYZZZWWWZZZZZZ^^^[[[YYYZZZ[[[YYYaaa\\\^^^bbb___^^^^^^^^^WWWXXXZZZWWWWWWTTTYYYPPPMMMTTTVVVRRRNNNLLLMMMMMMKKKKKKOOONNNMMMHHHCCCCCCAAA>>>>>>BBBJJJMMMDDDDDDBBB???@@@DDDDDDDDDIIIMMMNNNJJJLLLLLLHHHOOOOOO???666@@@555444EEEOOOPPP@@@EEEDDDCCCBBB;;;===;;;;;;;;;AAA@@@ZZZ222---333///&&&&&&***''')))+++)))***,,,+++777"""+++$$$$$$%%%111666???111 ######+++###!!!&&&((("""''''''"""&&&++++++,,,---"""+++999***''',,,333,,,***111777***+++******)))---555777<<>>???DDDMMMIIIHHH===<<<:::AAAKKKUUUMMMQQQJJJPPPLLLEEEWWWPPPDDD@@@HHHBBB///PPPZZZ\\\JJJCCCPPPGGGCCCBBB===@@@===AAA======666+++)))...))),,,555///(((***(((***'''+++***&&&'''$$$... """%%%$$$JJJ'''!!!###((($$$###''')))((( !!!)))!!! (((%%%666...---***)))))))))***(((+++&&&LLL+++111+++111---///666999===555666999:::III777999EEE???:::888>>>LLL:::BBB;;;555>>>BBB;;;:::777:::>>>333999GGGRRR@@@AAAPPPTTTXXXLLLPPPHHHFFFDDDIIIMMMWWW{{{ddd\\\ZZZ]]]IIISSSQQQRRRUUUQQQYYYRRRGGG]]]MMMMMMDDDTTTKKKLLLQQQQQQIIICCCJJJGGGOOO[[[```ddddddccccccbbb\\\XXXbbbjjjdddtttccceeejjjhhhjjjnnnhhhbbbffflllgggjjjqqqqqqrrrlllxxxssssssuuummmnnneeeaaabbbdddhhh\\\^^^\\\aaa______eee```^^^XXX[[[YYY]]]jjjccc``````cccccc]]]]]][[[YYYVVVWWWWWWSSSPPPNNNRRROOOIIIHHHJJJIIIHHHQQQ___PPPMMMKKKKKKIIIBBB999<<>>GGGNNNPPPIIIMMMJJJLLLLLLYYYSSSMMMCCC>>>KKK000???CCCIIIJJJ\\\DDDFFFBBBCCCCCC======888:::333333,,,***...***(((***......"""&&&###&&&&&&'''000,,,###### '''222$$$ $$$###(((''')))&&&&&&'''$$$"""+++111***BBB$$$"""&&&###FFF)))***++++++'''---'''+++AAA))))))......111444999:::666CCC888???<<>>HHHHHH[[[SSSJJJNNNOOO[[[NNNDDDGGGFFFKKKZZZppp\\\YYYWWWaaa\\\ZZZRRRYYYSSSVVV___WWWLLLUUUMMMBBBAAADDDIIIFFFJJJXXXMMMHHHFFFLLLSSS]]]fffbbb^^^___ccceeeddd___eeeeee___bbb```eeeppptttnnnjjjtttcccdddfffjjjkkkmmmkkkssstttvvv{{{tttqqqppphhhjjjllljjjiiibbbbbbZZZ\\\^^^^^^___bbb``````ZZZ[[[^^^___eeeddd```^^^ggg]]]^^^[[[\\\UUU\\\VVVTTTUUUZZZSSSQQQKKKMMMKKKHHHJJJIIIKKKIIILLLMMMLLLRRR]]]>>><<<===NNNCCCBBB@@@>>><<<;;;???CCCTTTJJJMMMNNNNNNQQQXXXWWWKKKFFFBBB@@@<<<555BBBEEEAAAEEEAAAEEEBBBBBBAAACCC888444999999///---,,,000(((,,,)))+++((((((%%%)))&&&+++---+++%%%555///'''"""''''''((('''%%%'''###,,,,,,%%%"""###'''&&&)))&&&&&&&&&$$$%%%'''%%%<<<+++(((***===+++///%%%&&&,,,)))''',,,555333333<<<888666CCCMMMSSSaaavvvUUUGGG999>>>@@@CCCMMMAAAEEEBBB<<<>>>888;;;@@@<<<444777666===CCCGGG@@@XXXNNNQQQSSSJJJVVV^^^OOOQQQIIIMMMMMMNNNUUUVVVTTTJJJQQQZZZjjj\\\]]]fffaaaRRROOOOOOPPPIIIBBB<<>>CCCEEEAAA???:::888111???DDDLLLOOOPPPOOOTTTRRROOONNNIIIAAA777777<<>>888666???------***>>>///...(((%%%%%%***%%%"""&&&&&&%%%$$$"""&&&(((%%%!!!###%%%)))***---,,,000AAA"""%%%%%%###111&&&<<<555###$$$((((((***&&&***,,,222+++444***'''###''')))(((......000666FFF;;;999555:::>>>```aaaEEEZZZFFF@@@;;;IIIOOO___HHHFFF;;;;;;<<<^^^VVV999;;;555666444888;;;AAAJJJQQQLLLRRRIIIIIIGGGHHHUUUQQQCCCJJJLLLPPPPPPNNNGGGSSSTTTXXXfffeeeiiiwwwRRRLLLOOO^^^PPPFFFCCC???GGGGGGEEELLLMMMRRR]]]WWWYYYVVVccc\\\\\\___oookkkfffssseeebbbjjjnnnffffffvvvttttttmmmpppmmmooommmgggiiiiiixxx}}}vvv}}}wwwooopppwwwwwwwww|||wwwooolllqqqkkkhhhdddfffcccfffddd______aaaaaaeeehhhdddcccaaaaaa]]]]]]\\\\\\[[[ZZZWWW^^^]]]VVVNNNEEEQQQ\\\ZZZVVVVVVQQQTTTNNNQQQQQQLLLJJJGGG===???BBBEEE;;;888333999777CCCJJJJJJJJJKKKPPPQQQUUUHHHEEEBBBGGGFFFGGGWWWNNNDDDEEECCCCCC???MMMGGGFFF>>>888333000//////111+++---222+++111%%%!!! &&&$$$"""######$$$((($$$&&&######"""'''''')))***---)))***&&&!!!&&&$$$(((...""" $$$&&&((()))"""(((---GGG)))%%%((($$$%%%((("""///444000>>>OOOFFF999<<>>;;;999222555222888:::MMMIIIFFFCCCEEEBBBGGGJJJHHHNNNNNNGGGJJJFFFVVVUUUOOOLLLHHHHHH:::BBBBBBeeegggYYYRRRVVV[[[QQQMMMQQQRRROOOIIIQQQRRRSSSZZZ]]]aaaZZZ___[[[]]]```aaa]]][[[ccc```}}}nnngggfffdddgggjjjqqqoookkkeeecccgggiiilllzzz.@xxxwwwjjjmmmqqqrrruuu}}}www{{{xxxvvvzzz}}}oookkkggghhhjjjkkkccccccllljjjgggfffkkknnneeennn^^^```[[[bbbfffbbb]]]YYYZZZLLLEEEOOOVVVUUUTTTQQQPPPPPPUUUQQQOOOMMMFFFEEEGGGHHHIIIGGG===555...;;;@@@IIINNNKKKLLLLLLOOONNNEEEGGGHHHLLLOOOMMMAAA===KKKGGGAAA???AAAFFFAAAKKKBBBAAAHHH444444;;;333,,,...)))555------,,,111***111...(((&&&)))AAA===///+++&&&'''(((&&&%%%'''&&&(((111777///,,,///+++###%%%$$$$$$%%%%%%)))---&&&***///)))'''''''''222+++...444...666333777555333999:::888CCCDDDJJJUUULLLBBB<<>>GGG???GGGFFFqqq]]]FFFFFFIII<<>>BBBMMM===HHHDDD@@@FFFEEEGGGSSSOOOHHHDDDFFFIII^^^dddIIINNNOOOSSSLLLRRRQQQMMMMMMQQQSSSQQQPPP]]]SSSWWWSSSMMMHHHOOOOOO^^^WWWRRRXXXXXXggg```YYY]]]gggjjjpppuuubbbhhhllljjjzzzwwwooohhh{{{wwwmmm[[[SSS\\\ZZZ[[[eeekkkxxxvvvxxxmmmllljjjnnn}}}www -zzzkkkuuurrr{{{wwwrrrpppttthhhbbbfffuuuaaaiiibbbgggiiinnnmmm|||yyyuuuhhhkkkiii]]]VVVSSS```TTTOOOVVVQQQ[[[XXXSSSZZZWWWXXX]]]SSSQQQEEEHHHNNNMMMKKKHHH@@@444<<>>IIIMMMKKKMMMOOOWWWQQQSSSLLLIIIDDDNNNLLLGGGGGGBBB:::>>>666???<<<---((()))---000,,,+++,,,'''///000---...******,,,&&&%%%***((()))&&&***((()))'''---)))###000333***)))***)))%%%---###+++)))...+++((('''''',,,***,,,444+++555;;;777999333HHHFFFKKKgggQQQBBBYYYDDDGGGNNNBBBDDDLLLDDDEEEMMMHHHXXXCCC999<<<<<<999:::EEEEEEBBB:::999JJJSSSGGGIIIKKKGGGUUUJJJbbb???EEEHHHRRRlll\\\UUUNNN```bbbWWWTTTNNNOOO___ZZZNNNNNNPPPOOOOOOHHHGGGEEEQQQUUU^^^VVVVVVSSSZZZ[[[___aaa]]]bbbiiifffhhhgggqqqiiikkkppprrrrrr{{{ -gggTTTQQQWWWhhhqqqrrrsss}}}vvvoooyyyvvvvvvzzz||| }}}{{{xxx{{{ yyyuuupppqqqjjjgggiii|||}}}llldddbbbgggkkk|||yyygggjjjeee]]]YYY[[[ZZZOOOSSS^^^ZZZWWWYYY]]]YYYUUUSSSTTTQQQPPPHHHJJJSSSFFFDDD888PPPOOOGGGDDDJJJIIILLLKKKLLLLLLGGGAAA>>>NNNQQQKKKXXXaaahhhXXXYYYYYYJJJGGGOOOUUUDDDKKKOOONNNCCC???<<<555///...///000...(((+++***''',,,111,,,***)))+++000QQQ???AAA)))(((&&&%%%...((('''))))))>>>RRR&&&'''"""&&&(((+++...---$$$)))'''###'''###((((((+++///---555LLL666???>>>WWWJJJQQQ}}}]]]HHHLLLCCC<<<>>>III@@@;;;:::???AAAPPPRRRUUU???;;;IIIEEE777BBBAAA@@@>>>@@@DDDEEEHHHGGGHHHPPPPPPOOOXXXIIIMMMRRReeeXXXhhhTTTVVVTTTRRRYYYVVVHHHOOOOOOSSS```IIIEEECCCBBBIIITTTIIIUUUVVVSSSOOOSSSVVVXXXfff```\\\XXXUUUrrr}}}kkkaaawww]]]\\\```\\\___cccnnnnnnlllmmmjjj^^^```gggpppttt2xxxnnnqqquuu -  -  {{{ssspppnnnnnnoookkkbbbeeegggdddnnnzzz lllllljjjeee\\\\\\VVVXXXQQQPPPXXXcccXXXUUUUUUWWWVVVTTTOOOSSSIIIHHHJJJIIIMMMKKK\\\KKKGGGLLLIIIPPPLLLJJJNNNUUUDDD<<>>333111:::===<<>><<<555TTT___```]]]SSSZZZggg\\\XXXMMMEEECCCDDDEEEZZZGGGMMM@@@???DDD999555===111///---)))111111444---***...'''***---000///<<>>DDD888777EEEBBBoooaaayyyvvvXXXVVVUUU]]]eeeZZZ___]]]\\\WWWqqqpppQQQOOOVVVaaaaaaRRRUUUKKKHHHMMMOOOHHHKKKOOOBBB<<<<<>>888CCCOOO~~~ yyyfffbbbdddgggkkklllaaaaaapppWWW[[[TTTVVVRRRJJJOOONNNOOOLLLLLLJJJOOOGGGCCC;;;BBBEEEGGGIIIJJJHHHSSSUUU[[[YYY]]]aaaeeefff___^^^ggg```aaabbbhhhuuufffiiiwwwooopppvvvrrrpppoooeeemmmtttsssvvvsssppp~~~ "="''#$-!vvvooopppssszzzxxxxxxwwwzzzssslllnnnqqqsss|||qqq{{{|||wwwmmmhhhcccLLL@@@CCCIIIQQQTTT]]]\\\XXXTTTOOOPPPKKKVVVbbb [[[OOONNNOOOQQQMMM>>>;;;GGGGGGKKKEEELLLQQQQQQ\\\aaaXXXRRREEEOOOJJJOOOLLLHHHMMMJJJIIIJJJHHHOOO>>>;;;<<<888999AAA@@@666555000,,,,,,+++---666)))***///---HHH888<<<...---444222FFF444...333@@@000''')))***'''(((---***,,,,,,222///333222000'''))):::'''///000555NNNJJJLLLpppgggsssiiibbbYYYjjj%xxxaaaHHHHHHEEEBBBBBBCCCMMM999999>>>BBBQQQzzz$22 vvv|||zzznnnwwwnnnrrr~~~bbbYYYZZZdddOOOHHHTTTOOOOOOPPPNNNJJJHHHCCCNNN;;;===FFFJJJPPPGGGMMMSSSSSSSSSUUU^^^\\\iiieeeccc^^^```jjj]]]```gggmmmuuurrrsssuuu{{{zzz~~~xxxyyyqqqrrrrrrsssyyyzzzuuu~~~ ~~~ 57/ # )pppqqqssszzz}}}{{{~~~tttyyy{{{sssooorrrzzzyyyzzzrrrwwwrrrlllnnn[[[KKKHHHRRRUUUTTT[[[bbbgggUUUKKK@@@EEESSSZZZpppUUUHHHHHHJJJ@@@???FFFGGGIIILLLIIIIIIKKKMMM[[[TTT]]]TTTMMM@@@...999EEEKKKJJJNNNQQQGGGMMMHHHAAA<<<777IIIPPP999:::999777444111...------------...222///...'''---:::111444888---HHHGGG...***bbb444)))+++(((111%%%***999DDD//////(((444)))+++''''''///111+++444666HHHAAA@@@cccnnn\\\kkkhhhiiimmm|||GGGQQQCCCCCC>>>???VVV@@@@@@@@@@@@???NNNwww4'&9(bbb[[[^^^^^^TTTWWWPPPKKKMMMOOOPPPMMMMMMLLLPPPKKKZZZIIIMMMJJJOOONNNNNNRRRRRRVVVWWWaaa\\\[[[eeeeeeaaabbbgggjjjjjjiiixxxtttxxxxxx~~~{{{{{{sssyyy}}} - -yyyxxxjjj,(3"! sssnnntttuuuzzzssszzzzzzxxxxxxnnnzzzuuurrrzzzyyywwwuuuoootttcccRRRXXXVVVcccXXXZZZ]]]]]]SSSRRRRRREEESSSYYYyyy___UUUMMM@@@FFFCCCMMMKKKIIIKKKIII]]]VVVUUUiiiUUUUUULLLHHH444---???HHHQQQUUUUUU\\\TTTJJJOOO<<>>555444///+++,,,+++///...333000...000///222AAA111666KKK,,,,,,---)))---333...(((''',,,...---+++///000555'''******---)))+++***(((000)))KKKOOOCCCPPPNNNXXXeee{{{mmmfff```___cccfffNNNJJJeeeMMMQQQAAA===AAAIIICCCBBBIIINNNLLL[[[>=.95+-'#'6lll]]]___^^^RRRMMMOOOOOOQQQPPPNNNMMMRRR___eeeuuuGGGVVVHHHMMMJJJNNNMMMNNNMMMTTTXXXXXXWWWdddhhhhhhiiinnnvvvxxxmmmmmmvvvxxx~~~zzzE', & www|||{{{%$~~~   uuujjjvvv~~~  yyyxxx{{{{{{|||rrr|||zzztttnnnsss|||eee\\\^^^^^^ZZZTTTZZZUUUUUUQQQNNNCCCKKKHHHWWWwwwQQQMMMIIIMMMFFFCCCFFFIIIPPPPPPRRR___VVVXXXSSS___\\\NNNYYYiiiGGGNNNTTTZZZNNNIIIFFFIIIFFFDDDQQQAAAXXX~~~lll:::333222444///,,,+++///444222222+++...,,,222222iii:::333999,,,)))((()))---222333+++...333+++---,,,+++......***000+++---,,,///222---111333666RRRHHH@@@YYYDDDLLLuuujjjaaaEEETTTFFFTTTTTTXXXGGGHHHFFFFFFBBBBBB===???CCCJJJKKKTTT\\\}}}IKFCEH?@Lzzzkkkjjjhhh]]]VVVPPPKKKMMMMMMMMMIIIRRRPPPPPPhhh\\\AAA@@@BBBFFFIIIOOOLLLCCCRRRaaa___```ddd]]]gggeeekkk___sssyyy~~~zzzqqq1# # &8!   - # ~~~uuu~~~yyy - yyytttuuuppplllssszzzkkk^^^[[[UUUSSSRRRUUU\\\XXXMMMPPP\\\WWWGGGNNNYYYNNNKKKEEEBBB===DDDAAABBBOOOPPP\\\[[[___^^^]]]ZZZPPPGGGKKKnnnaaaRRRRRRQQQTTTIIIRRRCCCFFFHHHDDDAAA;;;@@@FFF333...111000222AAA999111)))444000))),,,///***444EEE???AAA888...(((555222333888;;;333555LLL555555333000111444000333------///,,,...BBB000444888FFFGGG<<<>>>EEEjjjlllJJJEEEFFFCCCJJJBBBFFFOOONNNJJJBBBHHHBBB===???DDDDDDEEENNN[[[fffyyy-ZYZ]ZZ`9 -{{{nnn[[[]]]TTTPPPNNNLLLQQQIIIEEENNNXXXWWWvvvWWWIIILLLMMMOOOKKKQQQPPPTTTZZZ\\\___ggggggbbbeee```iiilllqqq }}}vvvwwwvvv|||$' %,CW@    - }}} {{{yyy~~~   - ~~~~~~yyyyyylllnnnnnnmmmhhhhhhuuusssqqq\\\___RRRddd]]]]]]ddd[[[CCCVVV___LLLHHHNNNOOOOOOKKK<<<;;;===;;;HHHBBBFFFMMMPPP\\\eee]]]ZZZWWWUUU]]]eeeTTTUUUMMMNNNTTTNNNIIIFFFCCCBBBJJJ???<<<<<<:::===>>>444111111222EEE:::222:::++++++---///222:::EEEFFFAAADDD---(((%%%111FFF999444...111000222666444000,,,---222222222...//////......222888BBB@@@FFFNNNOOOJJJSSSxxxJJJHHHAAAIIIHHHCCCPPPLLLUUUMMMKKK>>>===PPPGGG???AAACCCKKKPPP]]]iiixxxAQkmkgmYA)hhh\\\TTTRRRRRRNNNMMMIIICCCFFFJJJ]]]^^^FFFOOOaaaRRRTTTQQQWWWUUU\\\XXX\\\ddd``````eee[[[___fffhhhoooppp~~~wwwrrr{{{wwwyyy~~~ )%#&GA |||}}}}}}  qqq - }}} |||  -xxxvvvuuuwwwuuuooouuupppvvvlllnnniii[[[[[[^^^]]]``````\\\ZZZQQQUUUGGG===KKKYYYTTTKKKKKKDDD???===888???DDDGGGJJJSSSSSS]]]ZZZWWWVVVcccfffllldddIIIWWWOOOKKKRRRGGGAAA@@@EEEFFFBBBBBB@@@999999===666666222888<<<666888333)))***///---555;;;PPPEEETTTjjj666,,,))),,,]]]555///222111111///111888333***+++000111333+++++++++...???444000666777EEEDDDFFFEEEAAAFFFCCCLLLDDDAAANNNTTTWWWRRRUUUqqq@@@<<<>>>ZZZ>>>===@@@CCCDDDOOOZZZbbbzzzDan{{tj_I8~~~iii```\\\XXXRRRKKKCCCBBBCCCBBBFFF===555<<>>>>>??????KKKLLLMMMSSSXXXTTTWWW[[[```rrruuuooo[[[OOOzzzLLLKKKBBB@@@BBBIIIPPPEEEBBB999888888???RRR333<<<111:::999>>>CCC222555***,,,666:::IIIcccyyyPPP222(((***///111000444,,,222)))+++111111...,,,555---...,,,...+++222666@@@///<<<000111AAA@@@LLL[[[DDD===EEEOOOJJJJJJIIIIII]]]HHHFFFIII999666<<<@@@>>>999>>>CCCEEENNNZZZaaawwwEaq~tj_P6nnn___ZZZ\\\RRRJJJAAADDDBBB???:::444YYYHHHSSSVVVbbbZZZ]]]kkklllllliiioooccckkkffffffllljjjdddcccmmm|||rrrxxx  - - -  -~~~}}}yyymmmkkkoooppp}}}rrr zzz  ttt  -xxxzzzpppllljjjrrr~~~|||ooohhheee]]]\\\___^^^\\\ZZZ\\\VVV^^^RRR\\\^^^YYYXXXWWWOOOPPPDDDHHHDDDCCCFFFIIIJJJMMMTTTYYYWWW[[[fffggghhhaaagggmmmfffMMMIIIDDD@@@AAA___LLLVVVDDD???<<<:::888KKK444555222777???888000777,,,111CCC555===666999IIIaaaTTT111%%%---+++444222000222)))111%%%)))(((***111000+++***+++///444---000555666---999GGGIIIFFFHHHHHH===<<>>QQQ\\\]]]\\\iiijjjnnniiipppooogggmmmrrrnnnhhhppptttpppsssppp~~~tttwwwzzz% zzzppptttyyykkkooosssyyy~~~{{{|||yyy |||  uuuppp -|||www  lllvvvrrrqqqtttllllllhhhccchhhdddZZZaaaaaaaaaZZZ]]]WWWUUUXXXWWWXXXTTTRRRPPPIIIHHHIIIFFFHHHLLLHHHMMMyyyWWWaaaYYY[[[bbb^^^^^^SSS[[[|||PPPBBB???EEECCChhhUUUGGGAAAEEEHHHGGG;;;555777777===444,,,777===>>>NNN777:::222777777FFF666TTT555DDD///------444222AAA222***000$$$'''&&&***&&&(((+++(((+++///+++333000...777===FFFccc:::HHH???EEEAAABBBMMM@@@CCC<<<::::::@@@999999555777777666999999@@@>>>EEEEEEQQQYYYdddrrr -:dlovreT< pppmmmiii```XXXJJJDDDJJJKKKKKKEEE@@@LLLPPPSSS[[[]]]___fffvvvvvv}}}mmmooo}}}oooeeeooopppkkk|||}}}wwwyyy 2(, -  -}}}rrrmmmjjjlllxxx}}}{{{tttsss{{{}}}}}}   |||ttt ddd tttvvv|||vvvnnnfffdddkkkiii\\\]]]```eee\\\fffYYYUUUVVVTTT]]]YYYXXXYYYIIIEEEJJJGGGIIIFFFKKKRRRYYYSSSWWWZZZ```fffmmmaaaWWW\\\QQQQQQDDD@@@???>>>OOOFFFIIIBBBAAALLLAAA???DDDsss;;;:::111777;;;:::888<<<111EEE:::999999QQQ???555222...111@@@<<>>???:::===EEE666222666JJJ===999:::??????HHHPPPWWWVVVfffKRYcyyiO:!dddaaa]]]TTTLLLGGGKKKSSS[[[MMMLLLQQQRRRSSSRRRYYYbbbbbbgggsss|||xxxppphhheeewwwzzzrrr{{{yyy )2/!yyy -  }}}uuummmjjjvvv}}}}}}|||wwwzzz - -}}}~~~  sss  {{{xxx)+|||vvveeegggxxxeeeVVVaaaaaaYYY[[[]]]\\\YYYXXXWWW]]]tttUUUTTTQQQ???KKKLLLLLLLLLKKKTTTTTTRRRYYYaaaeeettthhhddd[[[ZZZ???333<<>>555---888???:::AAA>>>333:::;;;555'''(((%%%%%%(((&&&&&&(((333,,,---...111...::::::===BBB666888777EEEEEEBBB===???MMMCCC:::===:::KKK222000,,,555>>>777888444:::<<>>:::DDDMMMLLLOOODDDFFFBBBBBB???333333///555:::555111333999:::===666444<<<444///---:::BBBIIIIII:::777AAAAAACCC%%%***!!!$$$(((%%%''''''$$$+++...---444+++444:::===>>>@@@:::BBBIIIRRR:::888444000111555222111AAA111+++---///;;;666777444<<<@@@LLLHHHKKKTTTvvv|||9PQXM8/yyymmmggg]]]___SSSQQQKKKPPPUUUSSSSSSQQQRRRYYYVVV^^^vvvzzzrrrvvvuuu~~~zzz uuuuuuppp~~~  zzzyyywwwqqqyyyxxxzzz}}}~~~  -  -   - % xxx  uuuiiixxxooo 1Luuuxxx }}}yyy}}}vvvqqqfffaaaggg~~~ iii^^^hhhhhhddd[[[[[[]]]^^^\\\YYYcccTTToooGGGCCCCCCHHHIIINNNPPPOOO```XXXlllqqqiiimmmsssppp```[[[GGG>>>:::EEEGGGCCC:::<<>>>>>;;;<<<555333,,,333,,,,,,000000000000000///>>>>>>999DDD>>>WWWDDDDDD888<<<444111222HHH&&&***((( !!!###&&&'''(((,,,///111000111333999<<<:::777333>>>===;;;888777333555...,,,+++000333333333666///666???888999:::>>>KKKGGGVVVXXXSSS```4.49-0uuudddOOOQQQKKKPPPMMMVVVTTTSSSRRR___ZZZeeegggjjjrrr-||||||sss|||||| www    }}}}}} -   -  rrrhhhjjj .6uuu~~~sss wwwvvvzzzyyyoootttwwwddd___YYYeeecccfff```[[[[[[[[[WWWVVVVVVSSSUUUVVVIII<<<@@@YYYXXXNNNNNNUUUXXXVVVlll|||llleee```~~~yyyKKKAAAAAACCC>>>???DDDFFFCCCBBBCCCEEE999666999999222---000---...222111***///;;;<<>>QQQBBBMMMCCCTTT888???000...DDD^^^&&&!!!'''"""""")))%%%'''))),,,111///...222666AAA888;;;888666777EEEEEE888333333444000---444444444444444666777777222888444777CCCBBB]]]SSSPPPEEElll}}}  qqq^^^XXXQQQGGGOOOWWWTTT[[[jjjjjjkkkoooqqqeeeqqq}}}~~~vvvvvv|||yyy~~~qqqkkkooonnnrrr  -yyyttt      ~~~ #kkk``` }}}xxxzzzxxxqqqlllnnnpppttttttjjjgggbbbQQQVVV```gggmmmVVVQQQ[[[ZZZ\\\___]]]XXXWWWIIIDDDDDD@@@KKKXXXRRROOOJJJTTT___gggnnnhhhdddddd```mmmdddWWW@@@AAACCC777:::DDD@@@<<>>555555%%%,,,<<<999555111...444;;;KKKvvvwwwHHHIIIlllQQQ???333111---111<<<######((($$$,,,&&&'''***,,,.........++++++...333555;;;888===999===555555777555<<<111555???UUU777111000444666ddd;;;555666777<<>>777AAA===222:::EEEBBBjjjFFFGGGAAACCCIII<<<:::>>>,,,111333000<<<000333444>>>XXX___lllIIIvvv8PPP888777444555@@@CCC%%%&&&'''555///***,,,***+++---,,,///222000---000777777<<<999;;;;;;FFF999333111000///888111555111000,,,000666000;;;555555888PPPfffDDDBBB???PPPPPPMMMOOOPPPZZZZZZVVVYYYYYYTTTkkkZZZwwwaaaIIIGGGFFF^^^VVVWWW[[[mmmsssfffddd^^^iiihhhuuutttwwwxxxwwwxxxnnntttwwwppppppsssoooyyy - -vvv vvv}}} - -    -  -  -~~~uuuyyy {{{kkk$ -{{{iiiooo{{{tttmmmsssqqqtttvvvccceeeSSSPPPiiiooonnnrrrlll]]]dddbbbqqqsssaaa```SSSMMMQQQCCCOOOPPPRRRUUUUUUHHHXXX___ZZZ\\\nnnfffddd___fffeeeGGGKKKLLL???===HHH<<<:::666999FFFKKK@@@DDD;;;>>>;;;333555555222///...333:::777CCCVVV___VVVwwwKKKLLLyyyUUU===///333333666222###"""!!!'''///'''+++***,,,---222---222===555000444555888;;;666:::333;;;222444333000333---,,,...000666333999666222777000HHHYYY<<<===???JJJHHHEEEJJJLLLJJJTTTWWWSSS^^^eeeeeelllddd\\\{{{VVVSSSYYYcccYYYeeeiiirrrpppeeepppbbbmmmpppuuu{{{zzzvvvwwwvvvrrrqqqrrrtttjjjrrrwwwzzzyyy -www|||~~~zzz     -   |||   -{{{aaaxxx$ sss```nnntttvvvtttpppttthhhgggfff[[[[[[dddlllooossspppccc\\\aaaZZZaaa[[[]]]UUUMMMPPPPPPTTTmmmIIIPPP|||IIIOOOTTTbbbgggsssjjjllllll___QQQeeeJJJ===<<<>>>EEE===???===999???>>>@@@AAA>>>;;;777555000111333888<<<;;;555999@@@EEECCC EEE222SSS[[[VVVBBBOOO??????@@@:::%%%###'''((('''((()))+++%%%'''@@@TTTPPP>>>777===555333@@@444???AAA666777888999///000++++++///,,,------111111///333888OOOQQQ<<<===@@@HHHEEE@@@IIIJJJJJJLLLXXXTTTXXX\\\fffkkkpppmmmhhhbbbwwwrrriii```^^^gggjjjxxx~~~{{{vvvmmmrrr|||zzz~~~|||wwwrrrzzznnnhhh]]][[[]]]jjjmmmnnn||| ~~~}}} ~~~sss - {{{ -   !  {{{www{{{7 -xxxwwwrrrsssvvvtttqqqsssnnndddhhhaaa___kkkooolllkkkdddfff___dddccc\\\ZZZVVVKKKQQQWWW^^^{{{uuuIIIPPPPPPSSSSSShhhpppdddkkk{{{{{{jjjMMMJJJIIIBBBAAAIIICCCAAA@@@888===JJJ???===??????:::111555,,,777+++333RRR777222888BBB\\\ooo SSSWWWMMMOOOQQQEEEooorrrBBB<<<666"""!!!"""$$$'''(((---***...,,,HHHYYYEEE@@@>>>666777444333222888888444111444222///+++222,,,,,,,,,...---444666...333OOOJJJ999888999FFFBBB<<<@@@;;;BBBUUU]]]YYYVVV^^^ooovvvzzzllleeeggg}}}hhhpppmmmwwwrrrwww xxxsssssswww}}}xxxrrrfff```ZZZ______qqqnnnxxx -{{{{{{rrrwww{{{lll |||~~~!$##!# ~~~    }}}vvv{{{uuupppqqq~~~kkkeeennnfffaaaiiilllqqqeeejjjiiinnneeeeeeXXX]]]ZZZWWW\\\ZZZnnn~~~___bbbMMMRRRYYYbbboooiiiggg______XXXSSS:::MMMQQQKKKAAA@@@===DDDGGG777888:::===<<>>555<<>>444;;;CCC888===666555333222777222;;;555///...>>>GGGNNNaaa@@@222///888:::===GGGFFF===BBBEEE555...+++$$$&&&$$$&&&(((,,,***,,,222///666GGGQQQ>>>>>>666777;;;777777===XXX===...---+++,,,,,,***''',,,444000333333FFFAAA333222777AAA666333444:::===CCCRRR[[[^^^```hhhtttdddssseeellleee~~~zzzppp{{{sss?)-4kkk{{{tttzzzuuuoooqqqwwwssswww ~~~zzzsssuuuyyy  }}}nnnsss~~~ -    #$&*+*)'&"$##)! -vvv}}}  - {{{ooodddoootttpppgggaaadddbbbhhhrrrwwwnnnfffkkklllppptttrrr___]]]LLLUUUZZZYYY[[[dddyyyuuu___\\\FFFGGGHHHNNNKKKGGG[[[iiipppZZZ333IIIiiibbbPPPLLLEEEEEE>>><<<555999;;;888DDDAAA444888333666222444444777:::///999>>>DDD[[[HHH999+++///...555666999???444===]]]BBB(((!!! !!!(((%%%&&&'''JJJIII555IIIQQQttt???888222BBBAAA333000333333444,,,,,,,,,---***+++(((,,,,,,//////>>>444555555333<<<555333555999<<>>OOO]]]AAA999:::AAA???;;;888888111111555444///222+++111***)))&&&))),,,000555///,,,+++555666333:::<<<;;;AAA888>>>EEEPPPPPP\\\cccaaagggB;mmmbbbllljjj```kkksssttt{{{ppphhhmmmkkkmmmqqqpppuuuzzzuuuuuu*Bwwwzzz}}}ggghhhiii ~~~|||~~~}}}  ~~~yyy }}} -!$'*+*,-..,**''%!!    }}}zzz   ooopppooowwwnnniiinnnnnnooorrrwww~~~oooooofff~~~wwwxxxzzz^^^mmm^^^aaaSSSYYYVVVPPPRRRZZZddd\\\TTTLLL444;;;CCCIIIKKKQQQ]]]VVVIIINNNNNNFFFFFFLLLJJJBBBBBB<<<;;;======;;;999777:::777777777555;;;999666???LLLCCCMMMAAAHHHSSSDDD999LLL222444111222,,,.........(((+++222###***)))%%%111...444999444EEELLL<<<@@@[[[@@@BBB\\\BBBCCC...222333888+++333,,,...)))---///++++++000999...------222???666333444777===<<<999MMMCCCPPPQQQ___aaappp~~~ ^^^YYYfff\\\aaaaaalllrrr}}}jjjooo{{{}}}zzzxxxqqqiiilll -8}}}uuuyyy~~~lllfff {{{kkkwwwyyy~~~ ~~~~~~  -!$%)+,0//011//.+(# "  vvv - ssspppiiiiiiwwwqqqwwwwwwppprrrqqquuugggwww{{{zzzqqqooo[[[```UUURRRPPP___\\\^^^VVVLLLBBB333444;;;DDDBBBCCCPPP[[[UUUUUUbbbOOOCCCEEEGGGIII<<<444999888666:::777;;;;;;;;;999888AAA777;;;JJJHHHBBB>>>EEEBBBFFFKKKUUU^^^000---///***---222000,,,...+++///+++==="""...333***+++(((333;;;888444000;;;:::BBBGGGQQQ;;;;;;;;;BBB222111111+++000+++,,,***,,,&&&)))111999......,,,***000222444///...000444222>>>??????EEETTT\\\WWWgggmmmrrrZZZOOOWWWLLLaaaeeelllnnnoooqqqlllppppppkkkmmmrrrwww```IIIaaa|||vvvvvvvvv}}} zzznnnggg}}} mmmnnn|||{{{fffsss|||~~~   $'(+--0122344221.,($! xxxxxx||| }}}vvvlllfffwwwwwwpppuuuyyyxxxwwwooo {{{tttlllsssfff^^^bbbZZZjjjtttnnnTTTNNN111555666000444333:::???cccOOOYYYOOOQQQ___III999;;;888///;;;@@@===???;;;666<<<999BBB???<<>>>>>???GGGQQQIIISSS```^^^ZZZGGGQQQllldddlllooo|||wwwzzzllliiidddeeekkk~~~ppptttsss___SSSNNNccceeesssttt |||wwwvvv}}} wwwsssjjjxxxuuuwwwwwwxxxmmmwwwlllnnn{{{}}}www}}}~~~ - $%').,-13576765541.)&"zzztttgggxxxzzzuuutttrrrlllpppyyyzzztttmmmnnnooojjjtttvvvoookkkssspppjjjccc]]]ZZZ]]]fffUUUIIIOOOFFF===:::999333888AAAIIIOOOUUUVVVRRRSSSZZZSSS;;;444444<<<>>>@@@@@@BBBFFF@@@===>>>GGGAAA???888===???>>>---111888DDDbbb<<<;;;???666777...111333444444---///'''%%%###+++)))''';;;%%%777666333000***...---***...111999CCC999444DDD@@@888SSS;;;333[[[...@@@111111222,,,+++555+++---,,,---000///(((...444000111111>>>QQQCCCEEESSSKKKFFFPPP___\\\^^^aaa}}}ZZZrrr mmmrrr{{{zzzsssllleeeaaadddooooooppphhh]]]rrrtttnnn___eee|||yyy|||rrryyyzzz~~~zzzvvvqqqnnn~~~oooppp||||||vvvppphhhnnn|||yyyuuu}}}  "#&)*-//257899887654/,)'"zzz~~~rrr}}}{{{yyytttkkk```rrrxxx}}}{{{uuuuuupppqqqhhhiiihhhkkkrrrsssjjjiiisssiii```XXX]]]\\\___XXXJJJGGGEEEJJJAAAAAAEEEGGGTTTIIILLLUUUWWWWWWUUURRRIII666777IIICCCAAA@@@CCC888999DDD===;;;888???@@@>>>@@@999222000666>>>EEEJJJEEE777<<>>---444333***((()))---$$$BBB)))***(((!!!&&&NNN444***''',,,444555777///222000===FFF666777CCCZZZ===999???===JJJ:::GGG444///555&&&&&&***))),,,===...+++,,,000+++///===888<<>=;89750-*($ -  vvv|||vvveeevvviiihhhsssjjjvvvfffgggkkklllnnnmmmzzzsssccceee[[[UUUTTTWWWZZZUUUHHHEEEBBBFFFGGGNNNOOOLLLRRRZZZddd\\\YYYEEE...:::IIIJJJHHHHHHLLLIIIMMMCCC???DDDKKK???@@@JJJKKKNNN???ZZZ===LLLDDDMMM@@@iii[[[666===555999---000888---...+++'''***)))///%%%%%%>>>"""///MMM,,,&&&(((111555222444222>>>666HHHJJJ>>>GGG^^^DDD===HHH???UUUAAA---***444666''''''---+++)))+++***'''...+++222222AAABBBDDD===NNNJJJJJJKKKMMMXXX``````aaabbb^^^LLL```XXX\\\wwwrrrnnnjjjiiigggfff^^^\\\ddd```]]]mmmqqqkkkqqq%!~~~nnnrrrmmmqqqtttrrrtttpppwwwqqqiiiiiiccc```kkkpppvvvxxx|||}}}tttiiikkkdddyyyzzz -!$%&,/016:==@?@?AA@=;9453.,&% - uuu}}}{{{vvv{{{zzziiiwwweeeaaallllllzzzwwwvvvvvvjjjiiipppfffiiiyyywwwzzztttaaaaaa^^^VVVSSSVVVRRRKKKEEEAAACCCJJJOOOSSS```LLLKKKPPPWWWffflllOOO>>>???RRRFFFFFFLLLGGGHHHGGG<<<:::???FFFCCCjjjKKKGGGSSSCCCGGGJJJ???@@@GGGCCC\\\GGG888444:::777666666>>>???444---''''''***%%%***,,,)))###+++333III,,,...444000///333222>>>888DDDHHHSSS===:::???999AAA???>>>555888111111+++'''+++***)))++++++)))---...///222;;;999DDDEEEHHHFFFNNNJJJJJJQQQUUUXXXddd```XXXOOOTTTVVVooogggiiiuuujjjccc___XXX]]]SSSVVVbbbZZZ___bbbkkklllfff ~~~vvvlllkkkoooqqqssssssqqqqqqqqqooojjj[[[ggghhhqqqxxxvvv}}}zzztttsssuuuvvvxxxzzz ""$)//33:>@BDEDDDDCCB?<9741-(&   -}}}xxx -iii{{{{{{vvv}}}yyyyyy{{{zzzvvv|||vvvkkkdddiiiiiippp|||vvvkkkcccVVVSSSTTTRRRRRRCCCOOOAAAHHHBBBQQQHHHMMMWWWVVVUUUNNNZZZyyyYYYNNNFFFAAAKKKFFFCCCJJJHHHLLL:::999;;;BBB>>>QQQnnnOOOpppMMMJJJHHHAAABBB>>>UUUAAA\\\@@@<<<555///444222000555...(((''')))---...111%%%+++ '''---$$$???BBB777+++---<<<666333///777BBBAAAIIIKKK???CCCVVVSSS:::777444111//////111......((()))...---@@@666333444666FFFCCCEEEHHHKKKNNNOOOQQQQQQPPPQQQPPPUUUPPPMMMPPPCCCHHHffftttmmmkkknnndddoooZZZSSS\\\kkk]]]^^^dddjjj[[[ccc```ffflllmmmmmmyyyvvvnnn~~~pppooommm___\\\hhhjjjwww{{{rrr|||xxxuuu|||~~~~~~yyyooovvv -""'(,237>>BBBDDDAAA999777222---EEE///,,,)))((('''&&&%%%&&&***(((###&&&%%%&&&$$$&&&999555...///...///777444111:::@@@@@@???FFFDDD```EEE999333EEE000222---)))+++...333222000222:::;;;888===AAARRRJJJLLLHHHMMMNNNRRRQQQUUU```WWWRRRJJJYYYXXXJJJUUUOOOttttttwww|||aaaccc^^^VVV]]]hhhbbb^^^```______^^^kkkjjjlllwwwmmmiiinnnkkkvvvtttmmm]]]ZZZ]]]dddeeemmmqqq xxx~~~~~~{{{|||}}}|||tttxxx !%(-/27=BDGHJLMMMMLIHGDB@=851-& |||}}}xxxvvv~~~}}}yyy{{{zzz  {{{xxxsssyyy~~~tttsssqqqqqqyyyxxxqqqnnnddd\\\lllCCC888999999AAADDDBBBEEEWWWIIIGGGIIIKKKIIIJJJJJJNNNQQQFFF000:::HHHWWWWWWOOOIIICCC;;;IIIDDDYYYSSSHHHSSSXXXMMMDDDDDD@@@???CCCDDDGGGFFF555JJJBBB777333666******%%%''''''%%%(((***)))&&&&&&'''(((((("""))),,,DDD>>>***---555888NNN555:::;;;:::<<<@@@IIIqqqbbb===CCC888111...+++---+++111111333555555???>>>EEEQQQDDDGGGFFFKKKOOOOOOSSSQQQTTTcccXXX\\\WWWUUU]]] ___nnnwwwoookkkkkkeeeiii|||ddddddfffpppjjjiiieeefffiiillliiihhhgggccciiiiiirrrqqqllliiidddeee```oooqqqpppuuu~~~vvvyyyyyyrrrzzzuuuwwwyyy|||{{{tttqqqyyy"',015>BFHKMNQQQOPOLJIFDA?953+'#%  ~~~|||zzz}}}~~~|||xxxwww# zzzwwwsss~~~zzzqqqrrruuuqqqkkkbbbXXXLLLCCCKKK@@@888999>>>AAAMMMOOOPPPHHHBBBHHHKKKMMMJJJGGGFFF@@@''';;;LLLYYYPPPLLLNNNFFFKKKIIITTTeeeMMMFFFPPPBBBEEEFFFBBB>>>LLLEEEHHHUUU777444:::777;;;BBB000...---+++***)))%%%&&&&&&%%%$$$###***(((###&&&)))000555FFF222000AAAHHHUUU;;;FFFGGG???@@@AAA]]]999;;;:::EEE222222...***+++***111444<<<888@@@FFFNNNNNNHHHAAANNNDDDHHHHHHJJJNNNSSSTTTYYYWWWYYYZZZUUUXXXuuuvvv{{{llluuugggaaa```cccdddjjjdddmmm```mmmsssmmmoooeeebbbhhhhhhrrrnnnnnnmmmdddeeeeeesssppppppmmmtttooorrr}}}vvvuuummmtttzzz{{{{{{{{{~~~yyynnnuuuxxx #&+1215CFILMQRTTTUTSPMJGFC?;63.'%! yyy xxx~~~xxxtttyyy -zzzzzz{{{oooxxxxxxppppppwwwtttvvvuuu]]]RRRMMMNNNQQQLLLAAABBBFFFDDDOOOGGGIIIAAAFFFKKKQQQJJJIIILLL???222999DDDGGGKKKKKKSSSJJJDDDIIIEEEPPPtttHHHBBBMMMSSSIII;;;>>>:::EEEFFFQQQLLL666:::JJJ444000...,,,///...555,,,%%%###+++'''""""""***+++%%%###"""&&&666---666NNN999<<>>OOOAAADDD;;;EEE777<<<888---++++++,,,444555:::YYYWWWGGG???FFFAAADDDGGGNNNpppRRRHHHMMMOOOOOOYYY[[[TTT]]]```kkkmmmrrr|||yyyeeehhhwwwbbb^^^lllmmmoooiiipppiii|||gggiiinnnlllssshhhrrr}}}oooqqqnnnpppddd___qqqqqqpppnnngggvvv}}}|||}}}{{{qqqxxx{{{xxxvvv "*,/46:?GIMPQUVXYYXVUSRNKID@<74--+  xxx -yyyzzzrrruuuzzz , uuulllmmmppprrrzzz{{{llldddYYYVVVMMMQQQKKKLLLCCC???BBBEEEFFFAAAAAAHHHLLLLLLMMMKKKSSSPPPHHH:::NNNHHHVVVQQQUUUKKKDDDCCCFFFCCCMMMKKKGGG???HHHQQQBBB???AAA@@@<<>>AAABBBBBBHHHMMMNNNTTTNNNIIIHHHPPP[[[dddeeeaaa\\\```ooolllsssppppppggghhhrrrttt[[[[[[hhh```fffeeejjj|||xxxuuujjjlllhhhkkkooonnnkkkoooxxxuuuooossstttgggtttiiimmmjjjxxx zzzvvvuuuuuuyyy $*.269>DHMPSUWY[\\\ZYWTRNJFC?950.-! www -xxxsss{{{vvvuuunnnpppnnnoooqqqsss|||xxxqqqkkkdddZZZSSSNNNOOOLLLJJJJJJ===AAAGGGCCCHHHSSSKKKOOOPPPNNNQQQRRR[[[MMMHHHQQQUUUXXXhhhTTTKKK???CCC@@@>>>777666999<<>>DDDIIIEEEfffNNNEEE===666333000KKK,,,+++444,,,,,,***)))000lll===;;;;;;BBBEEE???DDDQQQ\\\RRRUUUZZZWWWgggmmmuuunnn^^^qqqkkkyyy{{{uuuccc___^^^\\\[[[\\\``````]]]^^^```]]]^^^ppp{{{eeegggeeekkkiiippprrrqqqkkkqqqppprrriiifffiiirrrnnnpppssswww|||{{{pppxxx !%.036=CJNRVY\_abddc`][YUQOKFA;63.(# zzz{{{ ~~~wwwrrrpppsssxxx -yyytttssspppppp pppxxxlllhhh___YYYRRRQQQQQQJJJEEE???HHHAAAAAA@@@BBBFFFLLLHHHLLLSSSRRRNNNEEECCCRRRUUU[[[cccUUUMMMCCCHHHIIIAAAAAACCC666222???@@@LLLCCCQQQ]]]eeeNNN>>>EEE<<<999:::666222---333...,,,***'''"""$$$&&&$$$!!!!!!(((***+++444...333???BBB>>>===MMMaaaiiiFFFCCCJJJbbb===444///999000---+++''',,,(((+++...///------???PPP:::DDDBBBPPPOOONNNQQQNNN______hhhvvv{{{ vvvxxxlllkkk\\\]]]UUUTTTRRRXXXZZZZZZ^^^ZZZ\\\]]]```qqqjjjfffcccmmmiiidddcccllluuu}}}uuubbbgggpppjjjpppppp{{{xxxxxxdddjjjYYYeeexxx|||   -!'-028AFLOTY]`cefggfcb`[XSQLGB<83.*$  xxxzzzvvvvvvssstttuuu }}}yyyzzzoooqqqnnnuuu!rrroooeeeccc\\\XXXSSSPPPMMMLLLOOOUUUJJJ>>>AAAFFFBBBFFFGGGIIIUUUQQQYYYOOOCCC777LLLTTTbbbZZZSSSEEEFFFIIIJJJ===???666999999999===<<>>999===@@@???AAADDDAAAEEEMMMDDDWWWOOOXXXpppNNN;;;333@@@222'''%%%///222111///)))444((('''######(((%%%###------,,,...:::999JJJNNNlllZZZUUUIIIOOOBBBEEEFFF???111444------,,,(((%%%$$$+++***111111000777666777UUUGGGFFFFFFRRRMMMNNNZZZiii\\\dddaaa}}}yyyxxxnnnvvv|||xxxnnnggg______\\\TTTNNN[[[[[[aaa```uuu cccgggbbbbbbfffeeedddggg^^^hhhsss||| rrrsssvvvsssrrriiiooovvvzzzzzzxxx}}}{{{ }}}nnntttttt}}} ',/39>CHOTY]aeilnnnkjfa_ZVQLHC=82.*# rrrzzzsss|||zzzjjjqqqqqqsssvvv~~~{{{iiijjjnnnqqq}}}nnnmmmhhhddd```___aaacccSSSTTTQQQIIIHHHDDDIIIPPPDDDDDDEEE===DDDHHHKKKMMMPPP???;;;TTTSSSZZZTTTSSSMMMIIIDDDCCC>>>@@@??????AAADDDBBBAAADDDUUU888KKKHHHUUUAzzzCCC444888000,,,,,,,,,000AAA888+++'''$$$&&&!!!777$$$(((,,,***222666EEEYYYgggvvvDDDHHHNNN???AAA???LLLGGG555---...111***%%%###+++,,,///000------...>>>???{{{GGGBBBJJJKKKNNNOOOVVV___WWWggg^^^ppp~~~ssshhhVVVbbbtttyyyvvvhhhaaa\\\\\\\\\TTTYYY\\\eeeiiihhhiiihhhwww[[[ooogggxxxgggeeefffkkkyyyppppppssscccmmmuuusssttt{{{tttrrrrrryyy~~~qqq - $),-5:AFJPTX]cglqusrnkfc_ZVRLHD>84.)"  rrrtttrrruuusssyyyzzz"|||vvvgggiiippp~~~mmmllldddfff___hhhlll[[[^^^UUUMMMMMMMMMPPPPPPKKK@@@999666000@@@KKKLLLKKKGGGGGGCCCLLLNNNSSSPPPMMMUUUSSSEEEBBB??????AAAMMMLLLTTTPPPKKKNNNGGGGGG888NNNGGGhhhttt??????+++444///555(((***444,,,&&&"""%%%&&&###!!!$$$888EEE---???000333888???cccxxxhhhgggPPP:::;;;LLLEEE===777333...+++)))'''%%%'''(((<<<+++***555333666555>>>DDDIIICCCGGGWWWMMMYYYPPPUUUXXXxxxJJJ]]]|||YYYNNNXXXWWWhhhwwwfffbbb```___]]]yyycccddd]]]fffeeewwwjjjmmmkkkeeeeeecccfffoookkkdddfff{{{ \\\fffvvvsssuuupppooosss|||qqqrrrzzzrrrvvv|||sssnnn||| -%*.18=BHKQUY]cglsz{vqlhc_[WRLHB?83-)# |||ssstttxxx{{{ssstttzzz~~~ -zzznnnjjjllloookkkiiiaaakkkuuu^^^]]]\\\MMMCCCFFF[[[EEEBBB@@@888000999AAAHHHMMMNNNEEERRR>>>GGGKKKRRRTTTPPP[[[MMM[[[EEE:::;;;;;;HHHeeeWWWMMMaaaaaaGGG???>>>CCCJJJLLLCCC999333......777...KKK444,,,((("""###+++666"""&&&###***444///???888222EEEDDDaaaWWWJJJHHHGGG444:::JJJDDDBBB999:::///)))@@@...,,,&&&++++++,,,)))666555FFF444;;;:::CCC>>>LLLMMMMMMIIIMMMhhh|||NNNbbbuuu}}}QQQDDDlllbbbbbbfffddddddaaa]]]fffwwwbbb```ddd```oooaaabbbqqqlll```mmmllljjjhhhiiihhheeeFFFdddeeeqqqsssnnnkkkttttttsssuuuwww~~~mmmqqq}}} '+-29>CHMRVZ^chkqx{wqlhc_[WQLGB=82,*$ ~~~vvvrrrrrrxxxyyyuuu~~~zzzwwwrrruuupppuuu -vvvmmmooopppfff```gggdddVVVSSSUUUFFFCCCAAAIII======>>>===:::>>>FFFJJJLLLLLLIII<<>>333......***'''%%%&&&(((&&&!!!!!! '''!!!***999<<>DIMRW[^bgkouwuojfa^YUPKG@;70+($ - ~~~~~~{{{zzzssssss~~~{{{uuutttwwwvvv/vvvyyylll|||kkkkkk^^^^^^\\\]]]]]]LLLRRRMMMGGGEEEAAA???;;;LLLGGGEEE@@@CCCEEEEEEFFF777:::PPPYYY___UUUHHHLLLMMMJJJGGGDDDAAALLLZZZOOOIIILLLMMMsssKKKAAATTTGGG888gggFFF>>>///222<<<+++,,,FFF,,,)))******!!!###!!!%%% """%%%&&&222gggXXXJJJPPPPPPPPPWWW;;;888999888999<<<777BBB555555mmmKKK)))&&&)))(((>>>222;;;>>>===:::BBB>>>TTTXXXSSSOOOEEERRRKKKXXXaaadddiii{{{]]]OOOIIIPPP]]]hhhgggfffwwwcccjjjffflllttthhhVVV^^^ccc\\\[[[gggccc```eeeiiikkkqqqpppvvvwwwooo|||zzztttlllhhhZZZbbbmmmnnnlllqqqtttyyyxxxsss___hhhqqqzzzxxxzzz ~~~ zzz "$*/3:?EHMRWZ^adhjoqojgd`\WTNJD?:6/)&"zzzwwwvvvsssvvv}}}}}}uuu{{{ -uuuuuuqqqyyy|||sssdddaaaYYYXXXUUUSSSGGGEEEEEEFFFOOO@@@<<<999@@@EEETTTPPPBBB@@@FFFGGG777LLLIIIVVVkkkuuuNNNJJJJJJNNNJJJMMMDDD>>>HHHRRRLLLPPPPPPPPPOOOOOO[[[GGGHHHHHHNNN555222+++,,,---&&&)))"""###&&&)))%%% !!!""" !!!!!!888///nnnSSStttDDD^^^III<<<;;;888222444444,,,777???555999EEE***---(((+++///;;;TTTKKKBBB===MMMHHH;;;IIIjjjUUUEEEOOOYYY]]]nnndddjjjwwwzzz___XXXYYYVVVhhhgggnnniiiuuuiiiZZZ___jjj\\\ZZZNNNGGGTTTaaapppggg___iiinnnsssnnnvvvyyyvvvnnnppphhhUUUhhhqqqqqqnnnnnnuuuyyy|||~~~fff```mmmnnn}}}zzz $+.38@DGNRUY]`cehkljfdc^[VQMHC>94/+% ~~~uuunnnuuu}}}{{{uuuqqqzzz |||@{{{qqqssskkknnnooohhh^^^XXX^^^YYYUUUVVVKKKFFFFFFIIIHHHAAA???;;;@@@???HHHAAABBBKKKPPPeeeGGGNNNUUUSSS___[[[QQQKKKVVVOOOCCCUUUFFFHHHEEEGGGHHHMMMNNNTTT[[[kkkYYYVVVSSSFFFJJJ...000(((+++///&&&"""!!!###$$$$$$(((###"""!!!###!!!---222666TTT~~~OOOAAA???888>>>>>>666111000888999---000;;;---555---)))+++///000:::MMM===EEEwww|||[[[RRRRRRDDDMMMMMM```___dddbbb___nnn,DaaabbbiiidddrrrhhhRRRTTT___rrrzzzqqqzzz]]]RRRYYYUUUWWWjjjiiiWWWeeellltttoooooo xxx{{{qqqzzzccc^^^mmmrrrttttttvvvtttuuuzzzqqqbbblllzzzzzz -"(-48>AGMRUX[^acdggfca_[XSOKGA;72/)#{{{wwwlllrrrsssuuuqqqwww -~~~yyy{{{ooonnnnnneee___\\\___RRRVVVRRRSSSGGGSSSCCCHHH:::<<<@@@@@@:::@@@EEESSSUUUPPPHHHTTTQQQVVV[[[___^^^]]]KKKIIIEEEBBBIIIFFFLLL???CCCLLLWWWVVVpppyyyZZZ]]]GGGFFF\\\TTT+++)))'''+++&&&%%%&&&$$$ ######,,,((( """''''''<<<>>>000:::aaa===333:::CCC<<<:::777:::000333333FFF111555444///000111)))===]]]CCC===HHHZZZ!JJJ???AAANNNFFFFFFWWW```^^^dddeee{{{,"~~~iiiiiidddjjjiiimmm}}}tttyyyiiijjjfffYYYkkkccc[[[YYYVVVYYYffffffZZZbbb]]]eee|||mmmttt0yyyssspppsssnnnlllzzzyyyzzz|||~~~uuukkkwwwtttmmmzzz%,38>>444<<<222333111:::444333444DDD333:::777222777333555AAA222111444)))999===111999aaaHHHFFFDDDIIITTTOOOKKKRRRPPP```bbbkkkiiiwwwzzzyyyhhhjjj```___[[[aaaqqquuunnnmmmmmmrrrTTTSSSSSSWWWUUUUUUXXXUUU\\\^^^dddoooYYY```[[[jjjtttsssuuuoooyyyxxxrrrnnnlllrrruuuxxx|||wwwzzznnnpppvvvnnnZZZyyy   "#+26>>---,,,333666777AAAEEE???888@@@BBBOOOPPPMMMTTTPPPWWWSSSaaavvvfff^^^ooo~~~ooonnnaaaUUU^^^]]]```fffeee{{{oooiiizzzUUU^^^UUUIIIFFFPPPRRRZZZaaa[[[YYYZZZVVVccckkkjjj}}}{{{qqqsssUUUbbbqqqooobbbrrr}}}|||qqqgggvvvfffzzz~~~|||ttt  - !#(24:?DGKOQTWXY[[\YVVUROKGC?:5/-&#  |||!uuurrr" -~~~sssjjjdddeeennn~~~{{{ mmmccceeeggg[[[SSSXXX[[[SSSGGGNNNCCC999>>>555===@@@???666DDDMMMPPPNNNPPPKKKddd\\\VVVZZZYYYZZZ___NNNLLLMMMCCC;;;BBBJJJ???EEEGGGJJJXXX]]]]]]MMMXXX;;;;;;444KKK,,,))))))$$$%%%((($$$&&&((($$$""")))$$$%%%222$$$!!!"""@@@222444888CCC333000888111---000...'''///888BBB:::222888888:::333---...***,,,///777333555:::KKKGGGJJJZZZEEEEEE^^^kkkWWWTTT^^^eeeaaajjjlllbbb___]]][[[aaa___www\\\dddrrrrrryyyvvvbbbgggsssNNNQQQRRR]]]VVVYYYggg^^^iiijjjgggiiilll2qqqlllYYY^^^pppwwwiiisssqqqoooxxx~~~aaa~~~uuu - ""%/17>BGIMORTVVVWWVRTROMHDB=92,($" - sssyyysssvvv,~~~vvvjjjssskkkzzz)pppmmmooocccUUUPPP```cccPPPIIIBBBWWW@@@===???AAA555333999DDDOOOPPPSSSYYYYYYNNN\\\QQQTTTYYYYYYQQQMMMIIIDDDBBBDDDBBB===CCCMMMLLLAAAOOO]]]lllQQQCCC===:::666999,,,)))111''''''+++111)))))),,,(((&&&!!!(((""""""$$$"""III___999AAA999333......111///......+++111555...222222000///111***000///...888666:::...555<<97/)%#  qqqpppuuuxxxzzzyyy -~~~zzzqqqnnnnnnmmmuuuooolllzzz}}}tttvvvnnndddaaa[[[TTTVVVPPPJJJBBB@@@@@@GGG@@@???777===UUUHHH@@@PPPYYY[[[ZZZXXXeee\\\VVVPPP\\\]]]WWWYYYDDD>>>@@@@@@???@@@???NNNFFFAAABBBOOOTTTWWWEEEOOO===777(((///444333///,,,)))&&&&&&&&&)))&&&%%%777!!!!!! ;;;FFFEEEBBB000111...---111///;;;555111000333...000666111''''''333...:::111666999___AAAAAA>>>DDDUUUDDDCCCMMMWWWOOOJJJUUUXXXeeerrrjjj^^^hhhfffggg___[[[llleeebbboooeeeiiirrrJJJXXX]]]NNNVVVeeecccYYYVVVXXXYYY\\\___eeeaaaaaasssxxxggg]]]WWW___kkk```fff}}}jjjiiirrrkkkqqqiiijjjoooxxxqqqrrr~~~  !(-14;?CEIJLNPQPNOPMIIGDA>;62-'$! -  vvvpppppppppqqquuu ~~~xxx|||lllyyyrrroooyyyyyy{{{tttooogggzzz]]]bbbqqqmmmRRRNNNCCCNNNVVVGGG@@@>>><<>>:::???GGGCCCEEEGGG@@@CCCLLLSSShhhMMMEEE555PPP<<<'''...111***...,,,%%%%%%(((###$$$%%%%%% ###111;;;FFFGGG888666555555@@@444666999---+++///...000---'''$$$&&&///333666>>>000999IIIAAA999===???AAAEEEIIIHHHQQQQQQLLLMMMZZZ[[[bbb\\\WWW^^^___eeeggg^^^gggiiikkk|||iiinnnccc888999HHHHHHVVVXXX\\\\\\[[[gggVVVYYYhhhdddeeeiiifffqqqbbb```SSS^^^aaahhhdddyyyeeeoooyyyxxxrrrjjjlllwwwooo___yyy~~~  !&,118=ACEGIKLMMLKKIEECA>:72,+(#!  sssiiikkkeeeuuu}}} ~~~xxx - lllrrruuuqqqsss{{{uuummmhhh^^^\\\XXXXXX\\\LLL@@@>>>FFFDDDDDDGGG>>>HHHEEEPPP[[[VVV\\\[[[\\\^^^ccciii}}}eeebbb]]]WWWJJJWWWaaaEEE<<<>>>???BBBAAADDDRRR===888...000NNN@@@@@@000///---)))'''***(((&&&''')))%%%$$$%%%%%%### !!!***$$$ :::@@@LLL777111555111222555555111333666000333BBB;;;%%%(((&&&)))...000666888WWW999888888555;;;:::CCCIIISSSQQQVVVOOOXXXVVV```^^^```qqqpppiii]]]eeehhhlllwwwwwwppp```QQQVVVIIIRRRWWWcccZZZXXXYYYbbb^^^]]]ZZZNNNNNNTTTccckkkhhhUUU[[[[[[```aaajjjtttuuu~~~xxxnnnhhh}}}uuuhhh~~~  - -  &,2358>@DEFHIJJHHGFCB?>;61-.*& -~~~nnngggbbbiiiuuu|||  uuuuuuzzztttssszzzooorrr}}}vvvoookkkaaaWWWVVV___QQQLLLZZZFFF>>>>>>;;;>>>AAAGGGMMMOOOPPPQQQXXXZZZXXX^^^```ZZZiiiccc]]]QQQ===;;;AAAMMMQQQNNNDDDGGGCCC<<<@@@@@@:::@@@RRR111---666444333111,,,---000+++...))))))+++'''''' $$$'''..."""!!!###"""rrrLLLOOO666888PPP000...111444FFF666555222***///+++,,,///(((222111444111777 BBB666666888:::BBBDDDMMMIIITTTUUUWWW\\\ccc^^^eeebbb___dddkkkXXX___``````nnngggnnn[[[^^^GGGGGGXXXyyymmmXXX```iii```[[[___```aaabbbXXX```hhheeecccmmm___cccaaalllwwwzzz}}} ~~~~~~xxxjjjuuu     %*/147:>ACDFFGFEDDB@>;:83.+(%" -~~~sssmmmrrrrrrjjjttt|||{{{}}}|||uuu}}}}}}xxxxxxpppxxxmmmfffggg___ZZZ___]]]TTTZZZJJJAAA???<<>>@@@@@@CCC>>>>>>777888333,,,,,,...+++,,,)))&&&---,,,((("""$$$""""""$$$&&&%%%%%%###!!! tttWWW@@@666FFF>>>///***)))JJJ888000...???)))''''''///222(((---111333...<<>>;;;444888888;;;AAACCCCCCEEE]]]ZZZ[[[VVVXXXXXXdddeee^^^```[[[```gggZZZhhhgggpppwwwsss]]]jjjQQQHHHSSS[[[XXXQQQWWWccc]]]ZZZ\\\ggg___ddd```sssaaaccc\\\]]]bbb^^^[[[___tttvvvpppttt}}}{{{tttbbbzzzvvv  -  #)+/368=:851/+*'%  ~~~xxxxxxqqqnnnjjjvvvyyyyyyqqqlllrrr -uuu{{{zzzuuuyyyxxxxxxqqqjjjfffccccccaaasss\\\QQQPPPIIIGGGCCCBBBGGGKKKQQQLLLYYYWWW\\\bbbaaafffhhhTTTSSSPPPTTTRRRPPPOOOKKKOOOMMMRRRGGGLLLAAA;;;===JJJPPPDDD888888:::...---,,,...++++++)))$$$%%%%%%%%%)))&&&!!!""" """!!!(((---!!!###""" ???BBB666555///---++++++---BBB333222---333...(((444---(((---,,,///999///...;;;AAAAAA:::333666;;;===>>>AAADDDJJJWWWRRRYYYYYY[[[ccckkklllXXXXXXTTTRRRZZZ___ccckkkgggkkkeeeZZZRRRHHHFFFRRR[[[LLLTTTbbbZZZaaalll\\\WWWXXXXXX[[[ZZZYYY[[[\\\NNNWWWbbb\\\___llltttqqqttt lllccc|||rrr - -    !!'+-0458=>??????>=:7610-,*$"! - |||yyyjjjiiipppvvvuuuyyyrrrxxx   xxxzzz}}}}}}}}}{{{qqqnnnnnncccsss|||lll___VVVTTTHHHIII???AAA<<>>999,,,(((&&&$$$>>>---111...999333>>>:::999444<<<;;;AAAEEEYYYMMMSSSddd[[[SSSaaaZZZ___[[[RRRRRRNNNQQQ\\\]]]bbbeee___[[[^^^[[[```\\\qqqbbbOOOWWWXXXYYY^^^[[[ZZZ]]]ggg```XXXRRRTTTYYY~~~[[[ZZZ\\\\\\cccllltttzzz - uuu  -}}} - |||""'+-257::<=<=<;98632/-+'&!! www|||{{{pppkkkuuuxxxwwwuuu~~~ ! ~~~wwwwwwsss|||uuurrrmmmlllooopppcccPPPNNNPPPRRRFFFCCCCCCJJJFFFOOOLLL[[[OOOrrr\\\[[[XXXUUUWWW\\\VVVSSSTTTPPPRRRPPPPPPOOOZZZPPPHHHHHHHHHHHHVVVBBB:::666555222000222KKK+++...///***&&&///777((((((%%%###$$$&&&"""""" !!! ### '''"""### +++@@@FFF555......---///((((((###///...444000>>>999888((((((...+++%%%$$$)))777222333000888CCC999EEECCC???EEEEEE\\\RRRnnnooocccVVVBBBGGGSSSNNNPPPccc]]]WWWYYYccchhhlllcccfff```YYYaaa\\\WWW```]]]YYYVVV```bbb]]]fffVVVZZZRRRkkkbbbaaa]]]]]]```XXXVVViiipppvvv~~~||||||{{{zzz |||{{{ !"%*+155889;;;965531.-,)$#  yyyyyyyyy}}}vvvuuuxxxwwwzzz}}}xxxyyyyyyvvvyyy~~~nnnmmmvvvllldddYYY]]]jjjSSSZZZNNNGGGJJJKKKOOORRRTTT[[[XXX[[[ZZZ[[[YYYYYYYYYYYYMMMFFFQQQRRRiiiSSSRRRRRRUUUQQQMMMVVVSSSOOONNNDDD;;;<<<999555...---,,,---'''(((+++)))---...%%%!!!$$$%%%###'''!!!+++"""$$$"""///&&&&&&###&&&...222444...333,,,///222***)))%%%***///000000///000000///---<<<***&&&&&&&&&'''111444111333???999VVV<<<<<({{{qqq}}}uuuwww{{{|||  - -xxx #$(-,/143454421-+''$"" }}}qqq|||}}}xxx -www}}}}}}xxxzzz{{{yyyuuuwwwxxx}}}}}}sssnnnttttttyyyxxx```SSSPPPXXXYYYVVVJJJGGG[[[TTTUUU[[[{{{[[[YYY___ZZZZZZXXXRRROOOWWWQQQXXXVVV]]]ZZZVVVVVVTTTNNNPPPHHHHHHMMMOOOKKK???===FFF222///@@@444@@@***&&&)))***%%%###(((###"""$$$"""%%%%%%!!!$$$$$$###"""$$$$$$&&&FFF999...###,,,111000111,,,999---444111///---000111:::BBB===******===NNN)))&&&'''+++,,,111444;;;666444888???HHHKKKVVV^^^]]]cccxxxXXX```rrriiigggeee^^^[[[gggjjj___XXXlllOOOZZZNNNaaa@@@PPPDDDJJJJJJPPPQQQRRR\\\aaa______gggaaaSSS```cccSSS[[[\\\YYYiiilllvvvvvv~~~.GUTLC' {{{tttrrr~~~ uuu{{{ ##$'*,////0/../,+-)# vvv}}}zzzzzz {{{wwwvvvuuuooowwwvvv}}}wwwtttvvv xxxsssjjjlllSSSWWWTTT@@@LLLDDDKKKHHHQQQvvvXXXXXXaaa```]]]YYYccc```TTTSSS[[[VVVXXXSSSJJJKKK^^^XXXRRRYYYkkkIIILLLFFFFFFEEEDDD???[[[<<<<<<;;;888---***(((+++%%%&&&&&&000&&&$$$((( !!!"""&&&$$$'''%%% """""""""$$$'''222$$$""" 999000111000333...===777///===|||:::,,,888===...)))***333&&&...!!!,,,///...555555999222===KKK@@@dddPPPUUU]]] vvvgggsssuuuggggggooouuuqqq}}}rrr\\\[[[XXXTTTsssddd```VVVKKKNNNUUULLL???>>>BBBHHHSSSUUUaaakkk]]]^^^gggiii___XXXgggeee^^^[[[```iiiggguuuqqquuu}}}1Ksz]G3 xxxzzzvvvvvv|||  wwwxxx "$$%(*+--,,+'&%%#$!! zzzxxxzzz }}}~~~zzzzzztttrrrsssyyy{{{~~~uuudddhhhbbbNNNKKKJJJ@@@AAA>>>KKKQQQVVViiiXXXXXXjjjdddccc\\\}}}]]]QQQZZZ___YYYTTTZZZOOO^^^lllbbb```[[[SSSGGGYYYGGGHHHDDDQQQKKKTTTHHHDDD444666+++%%%$$$''''''(((///&&&%%%$$$"""000&&&999444%%%!!!&&&''''''000)))+++%%%&&&%%%,,,???111//////222,,,---+++***...---///,,,000555///+++%%%'''%%%------,,,+++555666666AAA///...444DDDBBBLLLLLLZZZbbbaaaVVV[[[pppaaa___YYYoooiiiaaaaaaWWWYYY```SSSwww^^^QQQOOOUUUNNN===>>>???HHHGGGLLLjjjbbbbbbXXX```WWWXXXXXXYYY___sss___aaadddmmmtttuuuyyy5Kpx[:*zzz{{{tttrrr - !$%&(++*.**)'&#! !~~~{{{yyy}}}}}}~~~  - |||yyywwwxxx}}}ssskkkvvv|||!zzz(yyy```cccdddVVVJJJLLLAAACCCIIINNNRRR___WWWWWWXXX\\\WWW```dddWWWVVVXXXZZZ]]][[[YYYUUURRRSSSbbbhhh^^^```aaaooocccKKKVVVUUUZZZGGGAAA;;;555III,,,666(((&&&))))))&&&%%%!!!###'''###---555(((666&&&)))(((444NNNYYYEEE222+++444'''+++888...---)))+++---+++JJJ+++///...'''(((&&&"""******###111'''+++555777+++...000333888000,,,222===NNNLLLLLL^^^xxxiiiZZZjjjpppiii^^^VVVccclllmmmdddnnnlllVVVYYYWWWgggaaaOOOQQQQQQLLLCCCBBB;;;???KKKOOOHHHTTT^^^ZZZ___XXXYYYQQQSSSVVVTTTTTTaaaiiiiiigggooojjjsssyyy~~~0RU^S4 vvvtttiii~~~~~~ -  $%&)((*'((()'% ~~~~~~yyy  -! yyy~~~lllwwwnnnwww uuu||||||qqqmmmTTTNNNKKKIIIIIILLLMMMPPPQQQLLLNNN]]][[[WWWYYYXXX]]]___[[[YYY[[[bbbaaaaaaVVV___bbbhhhbbbwwwjjj[[[JJJJJJGGG@@@===444<<<444000(((''')))'''"""%%%'''***+++'''---)))###)))((((((,,,---555ccc444333777222000,,,444999>>>222(((%%%777000***)))***------)))777$$$&&&%%%&&&***...---*********...555111111555CCC777555444GGG???EEE]]]eeeYYY .yyyrrrSSSXXXllljjjfffXXXRRRTTTZZZ]]]SSSRRRMMMMMMLLLOOOCCC>>>;;;@@@CCCGGGKKKVVVPPPUUUZZZ```VVVVVVIIIGGGSSSQQQSSSgggmmmaaa[[[iiiqqq {{{ -6/6?9>{{{rrrzzzxxx{{{}}}{{{iiirrr -   "#%('()'('''$!    - xxx|||vvvooolllppptttwwwxxxxxx|||ooozzz ccc[[[UUUDDDEEEIIIRRRKKKOOOVVVNNNSSSQQQPPPYYYVVVUUUeee]]]nnnmmm___\\\vvvsss^^^]]]___^^^YYYooo___JJJGGGAAAEEE@@@===444444333---///---"""&&&'''++++++)))$$$$$$(((((((((((()))&&&bbb---///888+++<<<===MMM999999JJJJJJ===444***'''***''')))%%%"""***(((;;;%%%((('''***'''&&&***))),,,111222666...111000111///<<<===;;;HHHCCC???EEE\\\bbb[[[EOOOLLL___hhhgggYYYQQQXXXUUUMMMUUUQQQPPPIIIIIIFFFJJJ>>>@@@===AAACCCFFFFFFLLLTTTVVVjjj[[[SSSOOOLLLNNNRRRRRRWWWccciii```\\\nnnrrrqqq  mmmuuuyyy|||uuuxxxttt{{{ - - - $%%''$#$##"!   {{{mmmoooooovvvnnnwwwxxxyyy~~~ *kkkeee___dddXXXSSSJJJDDDGGGOOO[[[JJJUUUNNNXXXUUUNNNVVVWWWWWWRRR]]]bbbeeeggg^^^ccc]]]```gggfffpppjjjOOOFFF\\\HHHEEECCCAAA@@@???MMM333///000555111***)))((()))...FFFLLL)))+++(((&&&(((***///&&&***&&&,,,...++++++---RRR222QQQPPP000444///...+++*********,,,...==='''""""""'''(((---///&&&&&&000###444777111333...333...333GGG555666XXXDDDBBBIIIRRRVVVeeecccjjjPPPTTT[[[ddddddnnnOOOKKKSSSLLLLLLOOOOOOCCCJJJGGGIIIFFFHHHCCCFFFFFFVVVHHHHHHKKKMMMOOOUUUXXXTTTGGGMMMYYYRRRMMMUUUZZZ^^^___XXXlllhhh{{{ppp}}}zzz zzzlllpppmmmeee~~~tttvvvzzz   "! "! sss}}} -   vvvsss|||pppkkkpppssswwwrrr}}}wwwnnn}}}qqqYYYZZZTTTUUUJJJQQQLLLEEEGGGRRRXXXOOOKKKQQQLLLRRRXXXTTTTTTOOO]]]fffjjjuuu```[[[fffeee______jjj]]]TTTOOOEEEBBBDDDCCCAAA===:::999:::555444000---+++((()))---(((%%%^^^777///***---333((('''%%%"""---&&&%%%&&&$$$$$$&&&???111555000---444,,,((((((&&&...+++&&&((("""$$$+++999&&&)))---+++%%%(((%%%%%%444///333,,,//////888666@@@<<>>GGGFFFJJJLLLeeePPPYYYRRRZZZTTTWWWQQQWWWSSSYYY___ccc```ccc^^^aaaaaabbb^^^gggkkkXXXIIINNN```III<<<;;;::::::777;;;999333222---)))%%%&&&))))))***+++XXX666)))(((---((((((+++$$$'''+++***'''+++...***333VVVFFF+++***%%%222)))'''))),,,'''***&&&(((###%%%'''000&&&###!!!EEE%%%///666,,,'''+++555---333///FFF???DDDMMMOOOHHH{{{[[[HHH[[[HHHNNNUUU]]]rrruuujjj```VVVSSSkkkPPPPPPYYYTTT]]]GGGIIIXXXmmmJJJ<<>>333888]]]WWWEEEMMMBBBKKKFFF===HHH```aaahhhaaacccYYYQQQTTTOOOMMMQQQYYYOOOHHHNNNJJJ@@@@@@>>>???GGGHHHIIICCCJJJKKKNNNOOOSSSSSSRRROOODDD555...FFFLLLdddTTT______SSSSSSnnn  -uuujjj[[[cccjjjxxxcccqqqgggZZZfffwww|||ooo -  - (  - - -~~~ ~~~!uuuvvvpppooorrrqqqvvv~~~tttxxxfffjjj```XXXOOOQQQKKKFFFDDDaaaWWWNNNNNNSSSUUU^^^^^^ZZZVVVWWWOOOLLLPPPYYYYYYYYYZZZ___qqq```^^^ddd______aaakkkUUU```CCCFFF===999???777666777222888;;;000000+++---&&&$$$&&&&&&'''$$$!!!$$$&&&......(((111)))---...&&&888$$$&&&'''000((('''###)))&&&,,,333...%%%$$$&&&$$$&&&###''''''(((---%%%(((### ###!!!'''***+++GGG000+++000666666999444IIIBBBKKKBBB;;;<<>>>>>;;;;;;EEEMMMrrraaaiii___]]]QQQNNNQQQPPPMMMKKKHHHMMMEEEGGG@@@<<>>777DDDGGGFFF@@@EEEqqqBBBPPPJJJTTTSSSZZZLLLHHHHHHVVVAAADDDPPP^^^rrrwwwaaa```dddmmmyyyrrrbbbiii|||wwwvvvuuupppwwwvvv___mmm```dddfff{{{nnnjjj}}} ~~~ - -     ||||||vvvsssyyy}}}vvv~~~||||||www{{{|||yyyvvviiihhh___UUUYYYRRRTTTQQQSSSNNNMMMZZZSSSSSSUUUUUUPPPOOORRRRRRUUU[[[WWW[[[YYYWWWZZZ]]]___aaaaaacccddd]]]aaaZZZPPPJJJCCC>>>FFFAAA===999===NNN111777222999GGG///...(((---$$$)))&&&######'''000+++---...---***''')))222GGG333***)))***%%%))))))%%%***$$$$$$***333...+++555,,,***...******+++### $$$!!!""" 000 '''%%%......222***(((---000222333888888;;;BBBCCCUUUQQQMMMdddggg[[[kkkmmmnnnkkkgggVVVTTTLLLMMMKKKMMMIIIIIITTT>>>999AAA@@@EEEGGGDDDQQQGGGFFFDDDDDDLLLFFFJJJHHHGGGJJJFFFBBB:::LLLGGGRRR___```aaajjj{{{mmm\\\^^^cccjjjvvvrrryyy{{{www}}}hhhssszzztttpppwwwvvvnnnuuu    -  -  - yyy  - yyyxxx{{{uuuvvvuuu{{{xxx|||{{{xxxvvvuuuwww}}}xxxqqqcccSSSUUU\\\^^^TTTRRRQQQUUUQQQPPPRRR[[[VVVWWWPPPWWWUUUYYYbbbRRRJJJVVVZZZ\\\```]]]______cccaaa___^^^hhh{{{MMMBBBAAACCCFFFAAA888:::999???KKK222///666...000,,,)))(((%%%)))((("""######$$$%%%###&&&,,,===+++777999--->>>&&&++++++)))+++&&&%%%222+++&&&'''(((333+++111---)))%%%%%%)))333'''(((###$$$"""!!!"""---(((""",,,---444///---444666...333333444444EEE<<>>;;;:::FFF777MMM]]]bbbeeegggwwwiiibbbeeemmmvvvwwwvvvqqqzzzsssuuu -wwwyyyuuuvvvooonnnyyy -     - - {{{zzz -, -~~~~~~{{{ooossssssuuuppp zzzyyysssvvvsssuuuxxxoooaaaaaaZZZWWWlll\\\NNNOOO^^^RRROOOMMM\\\VVVWWWRRRSSSXXXZZZ\\\VVVUUUSSSXXX[[[___^^^fff^^^cccaaa^^^YYYVVVgggdddIII<<<===<<<:::999999888888666CCC@@@CCC000,,,---))))))&&&$$$&&&%%%&&&###$$$'''(((+++,,,)))&&&***------777---222TTT***,,,,,,###!!!222444(((000)))''''''NNN---***&&&%%%>>>qqq...rrr'''###$$$###"""###$$$333///333,,,,,,222@@@000333333555:::???;;;CCCQQQTTTNNNSSS[[[ZZZkkkqqqkkkfff\\\[[[OOOFFFJJJCCCDDDFFFKKKHHH@@@>>>>>>FFFAAA???AAADDDMMMEEECCCEEECCCJJJTTTLLLFFFEEEAAACCCAAABBBRRR```[[[\\\eeedddllleeeqqq{{{yyyxxx}}}rrrtttuuuxxx}}}1/qqqwwwwwwrrrtttvvv    -  -    yyy~~~~~~~~~{{{xxxrrrnnnsssrrrvvvwwwzzzooommmqqqyyysssnnnaaa```[[[[[[\\\[[[^^^RRRNNNRRRTTTZZZUUUYYYXXXYYYYYYTTTXXXzzzcccbbb\\\^^^YYY\\\mmmfffmmm\\\]]]cccUUUSSSJJJFFFGGGFFFDDDTTT666999777444999777OOO{{{LLL...333++++++)))+++$$$&&&(((((())),,,---000:::(((888***000111UUUCCC222+++555:::222+++$$$ DDD"""'''%%%"""333$$$''''''(((===FFF>>>)))$$$### %%%***<<<***'''...(((777)))///333000333999;;;===KKK;;;BBBIIIUUUSSSTTTZZZwwwiiiaaaXXX\\\\\\SSSSSSHHHUUUWWWOOOAAAGGG@@@;;;AAABBBBBB??????FFFIIIAAAEEECCCBBBBBBHHHEEEBBBDDD===>>>BBBQQQuuuWWWZZZ``````nnnaaarrrsssuuuxxxrrrrrrjjjrrr)lllxxxrrrttt -xxxzzz - {{{|||||| }}}  -   -~~~}}} vvvssssssrrroooxxxwww|||zzzrrriiiiiiooolll ddddddXXXddd\\\YYYRRR^^^QQQSSSUUUUUUWWWTTTZZZUUU[[[TTTUUUUUUbbb\\\UUURRRTTTYYYUUUZZZ___^^^[[[YYYZZZUUUMMMJJJFFFAAA???CCCAAAMMM>>><<<;;;777777AAAaaatttwww555000+++***'''((((((+++000$$$$$$,,,,,,((((((,,,999111///222:::FFF(((+++'''888GGG%%%$$$!!!%%%"""%%%%%%$$$!!!'''111999''''''$$$(((### ###)))(((+++%%%!!!)))###,,,999555999<<<444666777@@@NNNJJJZZZMMMSSSjjjtttqqqbbb```aaaXXXdddZZZBBBGGGNNNDDDPPPJJJCCCEEE???@@@FFFEEECCCCCCGGGQQQBBBFFFHHHHHHCCCHHH???BBB???AAACCCEEEDDDHHHFFFOOOaaabbbhhhqqq{{{~~~wwwssssss tttqqqnnnwwwwww -~~~pppuuusss|||~~~ ( {{{ ~~~ # ~~~}}}xxxxxxzzz{{{ !}}}zzzyyyrrrwww{{{uuu{{{tttsssvvvnnnkkkeeekkkddd\\\___```YYY___}}}UUUOOOSSSYYYaaa^^^]]]]]]XXXTTTQQQOOOLLLTTTUUUOOOGGGPPP\\\```aaa___aaabbb]]]ZZZTTTNNNHHHCCC@@@CCC;;;999???BBB@@@@@@>>>@@@???MMMUUUFFFBBB888111---111***...&&&"""&&&)))$$$###&&&)))///<<<000555+++111777888%%%+++,,,%%% '''""" +++******!!!###!!!$$$&&&!!!$$$!!!""" )))$$$---(((+++000NNN***'''%%%"""'''777777---111YYY555999EEEVVVJJJTTTVVVbbbbbbvvv"tttwwwuuuddd]]]LLLNNN>>>NNNRRROOOCCCIIIVVVDDD@@@@@@DDDBBB@@@HHHNNNDDDAAAEEEAAAKKKCCCHHHHHHEEEEEE???AAAAAABBB===>>>PPPfff\\\gggvvv~~~sssxxxwwwsssuuuxxxzzzyyyjjjqqq&qqqjjjrrrrrrqqqsss   - - -$}}}~~~yyy  - -}}}{{{|||zzz}}}sssuuuwwwsssxxxttt{{{vvvnnnjjjkkkdddeeelllfffaaaaaa\\\TTTTTTVVVOOONNNXXX\\\WWWbbbtttZZZPPPOOOMMMNNNJJJOOOZZZTTT\\\eeehhhgggcccbbb```YYY[[[RRRNNNKKKAAA@@@???;;;AAAGGGAAAAAA>>>BBB>>>KKK<<>>@@@DDDDDDOOOQQQNNNDDD???LLLIIIaaaUUURRR888///111???+++'''(((222'''%%%$$$'''''''''***+++333000888;;;000444(((///$$$$$$"""!!!$$$...(((&&&!!!***(((555$$$###$$$%%%!!!"""))) ###+++111444sssnnn+++,,,:::---+++///&&&,,,DDD///;;;EEECCC===BBB;;;===HHHHHHLLL===mmm!'"WWWNNNFFF<<>>AAA;;;<<>>444111,,,******&&&***+++&&&$$$%%%444ddd555)))(((,,,,,,+++***555333### ///???)))------%%%$$$)))444!!!"""%%%&&&$$$:::OOO((($$$$$$''';;;000..."""...'''""" '''"""222@@@555;;;555777???999HHHGGGIIIMMM@@@IIIQQQWWWfffXXXLLLOOOLLLEEELLLEEEDDD???LLLGGGDDDBBB===BBBBBBEEE___RRRPPP@@@IIIZZZ:::???BBBBBBBBBEEECCC>>>AAA===;;;CCCCCCSSSUUUccc```iiiwww|||ppplll||| www```xxx}}}wwwzzz|||sssrrrzzz}}} yyy|||}}}zzzyyywwwzzz  - -     -}}}vvv|||xxx{{{+ yyykkkgggfffeeevvv^^^aaaaaa[[[]]]YYYXXXSSSOOOPPPOOOMMM\\\WWWRRRWWW\\\eee]]]dddaaaaaaaaa___bbblllggggggkkk___ZZZ[[[ |||SSSHHHEEELLLCCCSSSBBBOOOZZZBBBBBB@@@JJJmmm]]]TTTHHH888///333+++,,,111---'''+++***222&&&***+++,,,111///,,,+++))),,,,,,,,,,,,:::///%%%---...&&&888$$$'''...000...(((666"""###$$$111'''111+++&&&$$$(((---)))***000(((---###***:::!!!!!! """+++333//////555;;;999BBB999JJJOOOQQQmmmAAADDDYYYZZZlllHHHFFFFFFOOOKKKJJJNNNKKKFFF:::DDD???DDD???@@@>>>UUUYYYBBBUUUAAACCCJJJ???CCC@@@SSSKKKIIIBBB>>>GGGBBBEEECCCAAAXXXMMMVVV```xxxmmmrrrvvvttt}}}tttmmmiiiWWWooowww}}}xxx |||zzzoooiii~~~vvvxxx    $ #yyyssswwwtttuuuuuu{{{{{{pppsssnnnhhhfffeee\\\XXX\\\XXXVVVUUURRRPPPMMMSSSQQQRRRVVVOOOUUU]]]ZZZuuuwwwfffbbbgggccc___^^^___jjjYYYVVVUUUTTTrrryyyLLLEEEHHHUUUBBBEEEDDDLLL^^^HHHVVVDDDVVVbbbAAA===AAA???222555111,,,222+++''')))******///(((((()))---888)))'''(((---&&&)))''',,,&&&((((((333111%%%%%%'''%%%000777$$$'''000"""%%%"""))):::???666"""333&&&777666ZZZJJJ222###'''!!!$$$"""###%%%,,,111333111777666999===GGGOOOdddWWW___\\\VVV[[[GGGMMMRRRQQQKKKJJJNNNTTTKKKHHH999555999CCCHHHBBBBBBBBBAAABBBCCCPPPBBB???EEEDDDNNNGGGIIIBBB@@@FFF>>>HHHAAA>>>OOOOOOeee]]]}}}yyylllrrrooo___VVV___yyyWWW^^^mmmvvv{{{xxxxxxvvv|||zzzqqqwww  - -  ||| zzz{{{yyyvvvsssyyy }}}{{{pppssspppnnnnnnnnneeebbb[[[```RRRYYYWWWUUUTTTWWW[[[SSSZZZXXXRRRSSSVVVQQQXXXaaaeeefffeeehhh```dddwww``````aaa[[[TTTUUUOOOYYYNNNIIIDDDFFFDDDGGGXXXKKKQQQRRRPPPQQQMMMEEEBBB555;;;]]]CCC,,,+++333***&&&%%%***)))222(((+++)))&&&...))))))''')))(((***,,,%%%999'''III---'''&&&,,,VVV<<<)))---JJJ111%%%$$$222$$$!!!&&&'''???'''### 999'''AAA.[[[+++!!!!!!###!!!444###:::FFF555:::555666BBB===BBB]]]YYYNNN```aaa```___RRRYYYTTTTTTKKKYYYcccNNNLLLTTT\\\DDDCCCDDD<<>>>>>@@@LLLEEECCC???IIIaaaKKKNNNDDD???III??????===???DDDMMMPPPccc|||tttooovvvyyyoooPPPXXX]]]bbb[[[OOOTTTgggiiilllmmmuuuuuu||||||xxx   -}}}~~~vvvxxxyyy{{{yyyyyyuuu sssoooxxxqqqwwwpppxxx{{{wwwoooffftttaaaaaaVVVVVVaaaWWWSSSOOONNNTTT^^^UUUuuu^^^\\\YYYSSSQQQTTT]]][[[eeefffiiieeebbbbbbddddddjjjeee[[[fff]]]QQQRRRFFFKKKFFFAAA===AAACCC???CCCFFF@@@[[[JJJIIILLLAAA888555,,,333000---+++((('''(((000---((('''++++++''',,,)))(((###$$$&&&&&&+++&&&***...---(((+++$$$%%%...111222%%%---;;;--- !!!!!!$$$+++(((###%%%))) !!!'''CCC^^^***"""===???000222111999EEE???SSSJJJNNNQQQRRRbbb[[[PPPPPPVVVYYYddd```LLLYYYMMMTTTJJJJJJFFFBBB;;;>>>CCCDDDFFFXXXDDD>>>???>>>???EEE>>>@@@EEEIIIWWWKKKCCCFFFEEEDDDCCC???BBBHHHYYYrrr(}}}{{{mmmbbbyyyttt\\\___eeeeeeUUUIIIRRRbbboooqqqiiiqqqsssqqqlllrrr}}}zzzxxx  ~~~}}}{{{yyyuuuqqqssswwwxxx ~~~ uuuvvvuuukkknnngggkkkeee___dddfffcccffffffaaaaaaSSSMMMKKKYYYYYYVVVNNNSSSUUUUUUUUU^^^]]]WWWUUUTTTQQQWWWYYY```hhhbbbaaa___ccc^^^^^^[[[]]]aaa\\\[[[QQQMMMMMMFFF>>>HHH???@@@CCCFFFHHHEEE@@@999DDDMMMWWWDDD333...///555---///+++&&&***(((...///,,,***111******+++888&&&&&&''''''''''''$$$&&&BBBJJJ***###&&&>>>111+++///(((###777+++ %%%444)))(((""" ######"""%%%222%%%$$$***999///000XXX>>>BBB>>>FFFJJJOOOOOOTTTJJJPPPNNN]]]ZZZ]]]gggLLLHHHCCCBBBGGGJJJ===222888???IIIDDDJJJ\\\GGG<<<<<>>ZZZNNNDDDCCC;;;DDDoooFFFwww111111111555:::666...,,,++++++***///111---&&&---...,,,###%%%***&&&((('''...%%%###+++JJJDDD)))(((+++(((:::666777###(((555XXX))) """$$$ """ """&&&&&&$$$>>>,,,//////<<<@@@NNNAAAHHHNNNHHHRRRPPPNNNPPPPPP\\\TTT]]]___QQQEEEPPPSSSLLLEEE777333;;;===HHHEEE@@@@@@AAA===@@@CCCBBBDDDCCCDDDBBB<<<;;;;;;???===???@@@BBBKKKOOOSSSGGGJJJWWWqqqiii]]]ddduuurrrwww```JJJYYYZZZbbbcccddd```rrrvvvmmmxxxmmm^^^RRR___gggzzzzzzyyy||| -~~~  yyy}}}{{{oooqqqrrrmmmtttvvvsss|||tttmmmsssjjjiiiuuuwwwnnneeemmm[[[ccc\\\ddd```eeeaaaiii[[[VVVVVVWWW\\\UUUUUUXXXRRROOOMMMOOOXXXbbb ^^^fffWWWiiigggaaa```dddiiibbbkkkiiifffhhhppp^^^XXXVVVUUUQQQOOONNNEEEBBB===EEEAAA???DDD@@@nnnIIIHHHLLL777888===555222888333---BBB222BBB///222999+++...,,,(((+++***+++###)))((('''((()))&&&%%%;;;''',,,&&&######&&&$$$***333&&&'''+++444222222''')))111###$$$""" """>>>######&&&(((+++---+++///777555FFFIII^^^GGGQQQIIIMMMVVVOOOPPPWWWZZZ^^^\\\]]]aaaTTTWWW@@@111111777AAA:::>>>???III<<<======???AAAFFFJJJ>>>???;;;AAA???@@@???GGGEEEDDDCCC@@@BBBEEELLLWWWbbbxxxgggppptttsssyyysssQQQJJJlllrrrgggaaannn|||ppplllZZZKKK]]]```zzzsssuuu~~~|||yyyvvvxxxttttttyyyppprrrmmmuuuqqqtttqqqyyy}}}|||vvvxxxvvveeecccmmmzzzggg\\\ZZZ```___```bbb]]]TTTVVVYYYVVVYYYZZZVVVZZZ```___eeeWWWRRRUUU\\\ZZZUUUYYY]]]bbbkkkiiiaaaeeegggccchhhddd``````]]]kkkUUUTTTHHHIIIDDDAAAGGGDDDBBB>>>EEEKKKJJJOOO<<<:::@@@777666333333...111111111---+++...++++++000***666666---+++''';;;))),,,)))(((&&&((( $$$111&&&444$$$"""%%%$$$###***)))%%%***+++111>>>'''444 !!!!!!***666!!!666!!!'''""" &&& ###***+++CCC,,,;;;;;;;;;888777888<<>>???======>>>AAAJJJLLLAAA>>>>>>BBB===AAAAAABBBBBB???;;;FFFHHHSSSuuuWWWccczzzccchhhtttuuuzzzrrrrrr___ZZZiii sssoooooojjjwwwvvv eeeSSSRRRTTT\\\eeessspppoootttvvv}}}|||}}} mmmrrrqqqvvvtttnnniiipppiiinnnfffiiilllsssiiiwwwwww kkkiiitttbbbwwwccc```^^^]]]]]]zzzcccZZZ```WWWTTT\\\]]]ggg^^^\\\]]]XXX[[[VVVYYYVVViii\\\XXXcccbbbeeegggfffgggddddddhhhccceee]]]\\\ZZZ[[[WWWGGGEEENNN<<<999DDDEEE@@@DDDDDDAAA333444222222555444------(((---...000///+++///+++,,,111***---<<<...+++'''$$$((()))000%%%$$$333%%% ###)))!!!!!!###&&&"""$$$,,,(((,,,(((&&&"""555$$$&&& :::ccc!!!###'''+++111555LLLIII888111555<<>>>>>CCCDDD===777555===<<<:::GGGNNN@@@III<<>>EEE888======AAAFFFwwwNNNNNNRRRUUUpppllljjjgggjjjlllDDD999222444***222@@@:::>>>>>>;;;777<<<;;;>>>AAAAAA@@@===777666<<<>>>AAASSS::::::???;;;CCCQQQSSS^^^UUUTTTYYYgggfffvvvxxxuuuqqqcccZZZPPP]]]vvvuuuggglll___nnnpppjjj^^^ccccccnnncccfffjjjccc``````ssspppxxxqqq|||vvvxxxsssmmmrrrvvvqqqxxx zzzgggiii___qqqeeebbbTTT```\\\VVV```cccnnn```___bbbUUUXXXYYY[[[ZZZaaa\\\TTTYYY^^^kkkiiibbb```aaabbb]]]]]]]]]\\\YYYfff[[[UUUTTTXXX\\\[[[aaaddddddlllrrreeeccckkkjjjdddVVVPPPNNNKKKKKKOOO:::999;;;:::777;;;;;;AAArrrrrrDDD111777888444777999777111///...///---333,,,))),,,...$$$+++---111000)))===,,,$$$(((---,,,'''%%%"""!!!!!!"""!!!$$$***&&&+++DDDPPP---+++(((+++666+++'''000!!! $$$...$$$$$$...666555666999???AAA>>>BBBJJJMMMVVVRRRYYYdddkkk^^^^^^kkk___TTT^^^ZZZ:::<<<555222222222333:::;;;666======AAA@@@BBBHHH@@@===DDD555@@@FFFLLLAAA<<<<<<<<<@@@DDDHHHVVVYYYYYY\\\pppgggwwwxxxqqqpppsss}}}aaa]]]hhheeexxxnnnhhhhhhhhhsssXXXssstttpppssshhhggg^^^___YYY^^^}}}ppptttvvvpppdddiiisssvvvvvvooorrrsssrrr 5qqqlllssskkkbbb___ZZZTTTWWWZZZoooooo~~~aaaXXXWWWUUUUUURRRccc\\\aaa^^^WWW\\\^^^\\\]]][[[___hhh___hhhcccZZZZZZSSSWWWQQQRRRMMMXXXYYY\\\ZZZ```gggcccdddrrriiieeeaaa^^^\\\TTTMMMGGGHHHHHHddd===@@@;;;???888:::EEEBBBHHHHHHLLL<<<;;;999666333...111888555777000((()))++++++,,,,,,,,,'''%%%(((%%%'''LLL'''$$$$$$***)))(((&&&%%%$$$$$$######222)))+++RRRUUU)))***'''???222:::))),,, """$$$  $$$ ///333...555AAA@@@DDDPPPBBBEEEMMM___UUUPPPOOOZZZ```mmmaaa^^^PPP___XXX@@@222......333111999aaa===AAA...///666<<<>>>777@@@<<>>888555999999CCC@@@<<<999::::::;;;@@@HHHDDD>>>999@@@DDDEEEIIIOOORRRVVVMMMTTTOOOUUUggghhhlllkkkrrrooo]]]eeehhhjjjfffmmmllljjjqqqllljjjkkkvvvyyyrrrbbbeeebbbWWWQQQaaa]]]UUU___^^^eeekkkbbbjjjbbbmmmhhhfffhhhwwwxxxlllxxxdddddddddaaa^^^UUU\\\bbb\\\ZZZYYYXXXVVVWWWfff]]]``````ZZZ\\\bbbbbb___ffffffjjjhhhrrrdddddddddgggooo]]]]]]fffooohhhcccZZZ```ooobbbbbbaaaqqqfffhhhWWWVVVPPPQQQFFFHHHCCCAAA???TTTDDD;;;>>>777666:::aaaGGG:::KKKJJJIII@@@888666:::///***(((---******000***(((,,,+++******%%%"""$$$%%%&&&(((%%%---%%%)))&&&%%%%%%""" $$$''''''111111///,,,***&&&(((333---,,,---+++LLL***"""!!!!!!###///$$$!!!)))$$$///,,,+++...111<<>>FFFccc666777111222000,,,***...(((&&&'''+++******)))'''***%%%&&&"""%%%((('''((('''(((***///,,,"""%%%***&&&...>>>555CCC)))+++...333444999888)))### $$$+++!!!((( 222+++  """***,,,$$$******111GGG444SSS>>>IIIMMMOOOTTT\\\IIIOOOeeeuuubbb[[[TTTPPPNNNOOOGGGMMMAAAFFFUUUSSS+++///777777999666;;;444<<<444999777<<<999;;;;;;@@@<<>>===<<<555888CCC@@@:::999>>>BBB>>>@@@888CCC<<<;;;333888222222,,,)))+++,,,))),,,444,,,,,,+++((('''%%%###%%%'''######***,,,%%%%%%***&&&,,,%%%!!! $$$)))FFF???:::,,,:::'''@@@777(((''' !!!'''$$$$$$!!!666999777%%%!!!"""...///(((***111666FFFggg888CCCNNNNNNMMMDDD\\\JJJGGGKKKWWWggg```SSSMMM[[[TTTMMMPPPUUUIIIHHHBBBHHHHHH000)))---666:::222777222333222333;;;666777888666>>>AAA888:::GGGUUUGGGNNNMMM]]]TTTXXXEEEMMMYYYgggiii```pppjjjqqqzzziiicccWWWfffXXXuuuqqqttttttzzzpppqqq^^^[[[ZZZbbbeeegggkkkoooQQQOOO```jjj\\\ZZZ[[[[[[ZZZUUUfffgggjjjuuujjjaaa]]]ccc]]]aaa___\\\ZZZVVV```gggggghhhbbbdddooo~~~lllpppjjjkkkiiinnnnnnooooooiiijjj rrrlllzzzmmmuuulllllloootttnnnqqqkkkooo[[[LLLNNNNNNOOOQQQ^^^[[[UUUKKKIII;;;;;;777:::KKKNNNGGG:::555888;;;>>>BBB===666555777666777111///...+++,,,)))''')))((((((((())),,,+++(((222)))(((%%%222###'''&&&###$$$'''###$$$'''%%%%%%111%%%'''((((((###///###ggg,,,%%% &&&((( )))RRR ...'''***...222333DDDGGGBBBEEEJJJCCCLLLMMMHHHLLLSSSLLLJJJPPPXXXYYYMMM```WWWFFFFFFDDDJJJ<<<:::,,,***...---111222555<<<666666<<<555<<>>:::@@@777<<<@@@JJJNNNRRRTTTPPPDDDOOOJJJXXXVVVZZZccclllooooooeee]]]]]]MMMEEE___mmmkkkmmm3 ggghhh^^^ccchhhlll```TTTTTTTTTOOOZZZaaabbb```^^^aaaYYYUUUWWW\\\ccc]]]iiinnnnnnjjj^^^[[[aaa```ddd\\\ggg___]]]```dddaaacccbbbeeedddmmmkkklllfffdddeeeooojjjhhhmmmmmmfffpppuuuyyyyyyqqqqqqooouuurrrttt{{{qqqoooiii^^^```TTTSSSZZZUUUNNNOOO\\\bbbQQQJJJ<<<<<<999@@@???888@@@AAA;;;:::111???@@@===<<<777555;;;000---...000---:::,,,///&&&%%%&&&''')))%%%%%%)))+++***&&&******((((((""""""###!!!%%%###$$$$$$CCC+++(((***(((+++///"""+++)))444)))???FFF!!!$$$ $$$)))***'''(((%%%(((000333:::===@@@???JJJJJJJJJKKKUUUTTTQQQ]]]ZZZFFFNNNXXXSSSPPPLLLRRRHHHFFF@@@AAA@@@UUU666444///***///888555222444999777===999:::;;;<<<888<<<;;;777<<<;;;@@@IIIGGGRRRRRReeeFFFFFFEEEVVVWWWdddkkkaaa^^^aaa[[[UUU\\\ZZZSSS@@@\\\hhhoooyyy|||ccciiilllnnneee\\\XXXZZZPPPUUU```fff___```ZZZOOOXXXXXXZZZ\\\^^^ddd\\\mmmmmm``````aaa```^^^[[[bbb___hhhkkkiiieeehhhmmmeeedddcccgggfff```bbbeeeiiijjjgggjjjrrrllloooooossspppzzzuuuwwwuuuooonnnpppxxxjjjeeeggg```VVVRRRRRRRRRSSSMMMVVVOOOOOOCCC:::<<>>!!!'''&&&)))///<<<<<>>@@@@@@GGG===???KKK000***,,,///---444777;;;:::===:::<<<<<<999999:::::::::777HHHHHHDDDEEELLL???QQQAAA@@@IIIJJJ]]]___ZZZWWWRRR^^^eee^^^```[[[PPPaaauuummmjjjkkkyyynnnjjjbbbxxx|||pppddd```___^^^[[[SSSPPPGGG\\\WWW^^^nnnhhhooonnngggYYYXXXkkkdddZZZgggddddddgggdddeee```eeeccckkkmmmkkkccc```bbbbbbcccaaafffllldddccciiinnnmmmbbbggglllnnniiijjjxxxlllpppvvvrrrqqqgggaaakkkwwwsss]]][[[WWWZZZ[[[WWWSSSOOOWWW___HHHBBB<<>>IIIFFFSSSTTTVVVKKKMMMPPPOOOOOOOOOIIIUUUKKKNNNKKKHHHEEEEEEFFF???<<>>===AAAEEEHHHWWWKKK???BBB777CCC??????JJJFFFOOOQQQTTT___tttaaa```vvvUUUeeeZZZeeebbbfffbbb^^^RRRVVVVVVccceeedddddd______aaa___hhhNNNIIIQQQ[[[ooowww~~~iii[[[llldddcccbbb\\\]]]kkksssrrrbbbkkklllkkkjjjiiijjjfffdddhhhdddggg]]]llllllggghhhgggeeecccxxxwwwmmmiiigggoooxxxwwwppphhhgggfffhhhjjjjjjgggccc\\\UUUSSSbbbUUU[[[pppFFFBBBCCCGGGAAACCCDDDEEE<<<@@@>>>666>>>:::===EEEDDDLLLAAA;;;>>>888333...333111000///---...111***''''''333***)))''''''&&&+++sss%%%'''((((((&&&"""%%%%%%'''444(((,,,&&&###%%%$$$&&&!!!'''222111000 777 !!!&&&%%%+++---,,,666YYY===777MMMCCCMMMIIIPPPJJJMMMXXXVVVVVVNNNJJJXXXAAAAAAFFFGGGLLLCCC;;;444<<>>CCC===TTT;;;???555DDDPPPZZZGGGNNNOOOPPPCCCIIIFFFGGGRRRIIICCCAAAAAA777???SSSDDD111111111,,,///222QQQ555222111444555::::::???===333666<<>>sssTTTGGGRRRJJJDDDHHHVVVDDD???DDDDDDIIIEEEQQQ[[[YYYVVVcccbbbfffdddfffdddkkkbbbccchhhfffllllllrrreee^^^OOOTTT\\\XXXYYY___aaannnttt sssllldddmmmsssjjjiiigggdddjjjjjjrrrkkkjjjiiimmmwwwppprrrnnnkkkhhh___kkkhhheeevvvtttqqqqqqiiieeeeeecccjjjdddhhhooobbbfffoookkk^^^ddd``````TTTSSSTTTQQQTTTQQQZZZUUU^^^VVVAAAOOOLLLSSSjjjmmmEEEHHHDDDLLLIII???<<>>///222555222444222555,,,111)))&&&++++++((())))))%%%######!!!###)))***888,,,%%%))))))((($$$%%%((()))$$$"""&&&###!!!%%%### !!! $$$!!!$$$***,,,111888:::FFFAAA888888888===KKKPPPPPPJJJOOOKKKNNNFFFGGGEEEDDDDDDEEE???DDDAAAJJJPPP999888222---...111///111777222111111444222444<<<@@@666222:::CCC<<<777<<>>>>>HHH222444000+++555666222111...000...444'''++++++...'''###!!!$$$###"""######((())))))///&&&)))))),,,'''222((('''$$$!!!!!!!!!###%%%%%% ---""" !!!"""444 777666!!!$$$$$$(((///---222<<<:::444999@@@@@@FFFKKKIIISSSRRRJJJEEEYYYFFFKKKCCCEEECCCAAA<<<@@@===AAA999666666777222'''%%%+++---///000------///444555777<<<777333333IIIMMM666000999HHHBBB:::AAAQQQAAAKKKLLLEEE@@@DDD>>>DDD]]]XXXQQQ\\\ddd```ddddddcccZZZ[[[```\\\aaa[[[}}} wwwiiiccchhhnnneeemmmjjjttthhheeejjj  llljjjqqqoooyyygggyyyuuuooopppppplllhhhgggjjjrrrpppdddkkk}}}ooojjjkkkiii~~~|||wwwfffddd[[[fff]]]___ZZZ]]]UUUUUURRRVVVRRRPPPUUUMMMQQQKKKHHHJJJJJJKKKGGGFFFDDDDDDMMMJJJTTTeee$7fffQQQHHH???@@@:::>>>777<<<999HHH???555333222333777222000???000???000)))&&&&&&$$$%%%!!! ###'''+++,,,+++333+++888++++++,,,***>>>((('''((( ,,,%%%((("""### )));;;"""$$$555"""!!! (((!!!&&&)))***+++333333<<<666OOODDDCCCBBBQQQNNNKKKMMMMMMIIIHHHFFFOOOEEECCCAAAEEEFFF===;;;CCC:::888>>>@@@[[[333---***---(((---+++///111444GGG444888999...555666BBB888555>>>???JJJ<<>>===CCC<<<:::>>>DDD333<<<555---333888NNN+++***///"""&&&'''"""%%% $$$&&&///------777111>>>,,,'''((((((***'''%%%)))!!!'''%%%$$$###$$$!!!)))<<<!!!######---000)))555IIIFFFFFFOOOBBBIIIDDDGGGXXXFFFQQQJJJ___TTTHHHGGGFFFHHHHHHFFF;;;BBBKKK:::888LLL777444<<>>@@@BBB@@@DDDqqq999EEE999666]]]NNN<<>>===>>>@@@lll777EEEOOO777CCC222000444//////.........222:::999000888BBBDDD<<<===CCCCCC???BBBFFFCCCDDDLLLIIIIIIFFFPPP<<>>FFFEEE???>>>CCCyyyaaaNNN===999>>>555111///333...&&&***###%%%%%%###BBB111"""$$$$$$###---MMM---333***+++)))%%%&&&$$$$$$111;;;(((+++...000___)))$$$***+++)))###'''!!!... ((('''***222 """((('''$$$===BBB<<>>AAA>>><<<333EEE333:::+++555000444///))),,,---+++'''...111999777111555777;;;999888BBBGGGHHH@@@AAAHHHJJJFFFFFFHHHbbb```AAANNNCCCHHHOOOLLLYYYQQQOOO[[[XXXdddWWWWWWeeeMMMZZZUUUYYY]]][[[^^^^^^YYYWWW___aaafffgggeeebbb```XXX\\\lllvvvrrrwwwgggbbb___dddWWW]]]bbbWWW^^^RRRPPPbbbbbbrrrccccccfffbbb\\\[[[UUUUUUWWWTTTSSSRRRNNNLLLHHHIIISSSKKKKKKHHHJJJKKK[[[DDDLLLKKKJJJDDDBBBZZZcccxxx oooiiiQQQNNNMMMCCCEEEDDDIIIGGGIIIIIIOOO;;;FFFJJJ===BBBKKK888:::WWWPPPAAAOOOMMM333000,,,,,,111***...,,,)))%%%===:::777333$$$000***###)))---111'''(((---111******)))---444***&&&222(((---QQQnnn)))%%%%%%+++))) &&&===!!!&&&'''&&&!!!$$$!!!)))...000666:::@@@IIILLLDDD;;;FFFMMMMMMPPPPPPVVVLLLIIIJJJQQQFFFMMMEEE@@@HHH;;;;;;888???111:::333888;;;...999***,,,---***'''+++...111777555555<<<===???<<<@@@FFFAAA===EEEGGGFFFBBBFFFEEERRRSSS[[[AAA>>>BBBJJJKKKRRRUUULLLSSSSSS\\\QQQMMMHHHEEE???JJJPPP^^^PPPUUUZZZSSSUUU[[[jjjdddXXXmmm\\\OOORRRYYYUUUNNN___pppggg```hhhjjjaaa___ZZZ[[[```YYYYYYQQQWWWZZZ[[[[[[^^^iiiggg^^^]]]SSSPPPVVVKKKLLLHHHXXX^^^AAAGGGGGGCCCXXXCCCAAAFFFKKKDDDDDDKKKDDDAAA???___{{{rrrrrruuufffKKK^^^JJJ@@@???AAAXXX<<<:::@@@AAA>>>===<<>>>>><<<666888RRR666333777LLL///(((111,,,000!!!!!!***"""***III((()))+++)))&&&%%%$$$(((+++((((((000&&&***&&&+++$$$444,,,%%%%%%%%%,,,333000)))%%%###"""%%% &&&///"""$$$$$$$$$ '''---+++222===999DDD>>>FFFEEENNNJJJIIIIIILLLNNNVVVXXXLLLrrrNNNCCC<<<@@@:::CCC>>>555777111---222111222111222......)))%%%,,,...+++666555666999FFFEEEAAA>>>@@@CCCDDD@@@;;;CCCDDD???GGGLLLTTTnnnBBB999777???MMMHHHHHHSSSMMMMMMRRRQQQLLLDDDDDDCCCGGGPPPOOOPPPNNNPPPUUUVVVWWW\\\XXXZZZaaaYYY[[[pppPPPIIIQQQ\\\UUURRRVVV\\\YYY]]]dddaaaTTTYYYUUUYYYWWWRRRPPPJJJWWWWWWZZZWWWZZZeeeQQQIIIJJJIIIEEELLLEEEKKKAAA@@@BBBEEEBBBJJJCCCNNNGGGBBBBBBFFFCCCBBB:::OOOSSSwwwXXXCCCOOOTTTBBBGGGDDDIIIFFF<<>>GGGPPPBBBEEEWWWFFFOOOHHHHHHJJJIIIFFFKKKQQQOOOHHHJJJ@@@DDDDDD???888777333888000333777999;;;666666333...###000444666555<<>>CCC===EEEHHHGGGSSSCCC>>><<>>LLLOOOHHHGGGRRREEEJJJSSS___JJJFFFCCCQQQNNNFFF???;;;888444777999AAANNNppp===//////...***+++555:::???VVV]]]LLLQQQWWWEEE@@@===FFF>>>BBB@@@999XXXMMMTTTQQQDDDBBB;;;333999EEEHHHHHHNNNJJJRRRLLLUUUjjjKKKFFFKKKCCCJJJGGGFFFLLL\\\8nnnNNNGGGKKKIIIIIIMMMPPPRRRMMMVVVPPPNNNKKKLLLKKKTTTJJJPPPKKKIIIFFF>>>DDDIIIGGGFFFKKKNNNGGGEEELLL\\\OOOKKKEEE>>>DDDFFFGGG@@@<<<===@@@???>>>CCC@@@MMMDDD\\\DDDNNNAAA@@@BBBAAACCCOOONNN___IIISSS@@@CCCCCCuuuCCC<<<999===888<<<222666555555333---111//////---@@@///III555GGG666***(((&&&$$$)))&&&***&&&"""%%%))),,,&&&333---&&&%%%(((666---+++((((((---444CCC///)))***888222111111---$$$(((%%%IIIXXX+++!!! !!!666 )))""" 000$$$%%%""",,,)))+++FFF;;;;;;EEE>>>???CCC<<>>BBB@@@III>>>???<<<;;;<<>><<<<<>>888BBB???@@@;;;---&&&000AAAMMM===BBB@@@@@@SSS===BBBBBBMMMEEE>>>>>>@@@EEEGGGEEEFFFCCCRRRLLL...000??????IIIMMMLLLJJJFFFOOOXXXKKKEEEBBBdddKKKYYYUUUVVVIIIWWWMMMNNNBBB>>>===AAAHHHGGGFFFIIIHHHGGGIIIVVVIIIEEEAAAAAA???>>>BBBAAABBB>>>@@@CCCGGG???@@@AAAHHHHHHIIIFFFFFFEEEBBBAAABBBCCCBBB>>>???@@@;;;999<<<<<<<<>>FFFBBBEEEPPPNNN]]]AAAQQQRRRaaaHHHIIIGGGKKKQQQYYY@@@===???<<<777;;;===<<<))))))555===<<<>>>???;;;;;;AAA;;;888:::UUU???AAA<<>>:::>>>BBB>>>>>>CCCAAACCCDDDDDDMMMFFFKKKFFF??????@@@???BBB<<<:::888FFFDDD@@@:::===>>>???HHHeeeRRRVVVFFF<<>>333\\\???222666222333333000///***SSS444777888///))))))%%%$$$$$$###***)))'''******---+++111000---+++:::...///888---222---+++444000\\\999222---@@@///&&&***888444(((000"""$$$***%%%!!! )))'''!!!"""$$$$$$&&&$$$###'''222555999<<<===BBBfff666<<<@@@IIIBBBBBB@@@===HHHZZZJJJcccNNNSSSSSSQQQ@@@JJJ<<>>;;;666???CCC======TTTEEEEEENNNUUULLLQQQcccppp;;;AAA555555@@@FFFIIIXXXOOOGGGLLLSSSVVV@@@>>>::::::MMM===UUU@@@@@@AAACCC===???777CCCJJJVVVpppiiiGGG>>>;;;IIIHHH<<<<<>>AAA@@@BBBFFF@@@GGGAAABBBCCCBBBBBBCCCCCC@@@@@@CCC:::>>>:::===:::888<<>>EEE;;;===777===>>>777<<<444111///...444QQQ444000...***+++...777333999555***(((+++,,,***)))CCC111333,,,...<<<...111666666AAAUUU999555:::111666,,,------>>>TTT///666******'''(((***"""///%%%222 )))!!!(((%%%!!!!!!"""###;;;...&&&555888<<<111888<<>>AAA@@@>>>===BBB<<>>===;;;;;;999@@@@@@<<<>>>;;;;;;BBB???===AAACCC>>>???>>>???CCC;;;777;;;:::<<<;;;AAAOOO999<<>>888888<<<888???666888222111///666666...444...///++++++///+++000WWWAAA***)))///888888gggNNNZZZ555777999777777666999333AAA222......222777???111DDD@@@@@@444///'''%%%"""+++"""###)))&&&!!! 777###000 """...777)))'''***<<>>GGGHHH>>>CCCAAAJJJGGG<<<@@@===:::@@@IIIPPPCCCFFF999555<<<777CCCCCCFFF@@@HHHOOOTTTJJJQQQFFF:::666333???>>>BBB;;;999;;;<<<@@@>>>>>>IIINNNXXXKKKBBB@@@EEE???FFFCCC;;;===777:::;;;;;;;;;777<<>>AAADDD???BBB??????EEEIII>>><<<<<<:::IIICCC>>>FFFMMMNNN>>>;;;000444222222...000000DDD999444333===///444///TTT>>>000888///999555666===UUU:::OOOKKK>>>...;;;ZZZ<<>>AAA@@@<<>>===:::@@@@@@JJJoookkkTTT===:::@@@===999999666444888555444888???>>>777>>>???@@@>>>@@@;;;;;;===:::HHH<<>>===555777444DDDFFF???<<<888;;;<<<<<<<<<;;;<<<888555:::<<<333;;;GGGQQQ222333666YYY:::<<<>>>@@@<<>>eee:::===LLL000///555:::DDDDDD222222444333...+++111```YYY444///+++&&&%%% &&&(((&&&$$$***&&&$$$"""OOO"""111"""***>>>AAACCC@@@+++&&&444------444222;;;:::===222444555777555333777WWWLLLUUUFFFFFFNNNLLLOOOAAA>>>AAA===>>>]]]XXXKKK;;;555---333999===:::555222222,,,888<<<777===777<<>>666777<<<:::<<>>CCC999666888<<<@@@===@@@???<<>>888===BBB<<<===DDDCCC888999888<<<:::???BBBBBB999BBB;;;BBB>>>===999222444>>>888<<>>[[[;;;===EEE111666MMMGGG222;;;???XXX888999kkk???CCC444111AAA444333222---555555---000===---***AAA>>>sssLLL000******&&&+++...###'''%%%"""///$$$ $$$YYY EEE+++***DDD444 ///666333444+++...111111666555666999777888222333111>>>mmmEEEEEESSSTTTJJJBBBDDDJJJMMM===>>>ZZZbbbIIIIII888...999777999AAA:::999777111333555777666888999BBBEEEOOOFFFEEEGGGCCCJJJ;;;BBB<<>><<<;;;:::888;;;666===BBB===CCC;;;;;;555:::DDD222444000666666;;;YYY;;;;;;777MMM===:::GGGppp???CCC444444888~~~\\\666DDD]]]???444QQQGGG;;;;;;666888<<<555:::777999444333MMMTTT777333///(((+++)))333444888+++...---666...(((...+++'''...+++%%%AAA......BBB>>>!!!&&&+++%%%%%%<<<''' 333FFF,,,555,,,$$$$$$###+++******---222+++///222222222000666333444888KKK -IIIHHHQQQMMMdddBBBFFFiiiDDDDDDFFFYYYCCC===HHH444555;;;777DDDAAA;;;666111,,,000555===:::777>>>:::???UUUHHHRRRDDDHHHIII<<>>FFF<<<===sssGGGMMM000666<<>>LLL===@@@888AAA@@@>>>AAAGGGGGGAAAYYY======999AAA;;;999888999:::<<<<<<999===???CCC666???===FFFHHHTTTKKKFFFAAAEEE;;;IIIAAAMMM@@@DDD???KKK<<<@@@TTT===777777===---===888>>>:::BBB555AAADDD<<<:::000555>>>;;;777222WWWDDD>>>:::EEE;;;<<>>===;;;999111777777222===333444777888<<>>EEEJJJ>>>>>>>>>@@@111>>>:::KKK???===:::888111222777BBB999NNN999<<>>eee;;;;;;555<<<;;;ddd>>>RRRIIITTT???BBBHHH<<>>777111666222((("""&&&'''///,,,...%%%===***111>>>***))),,,"""%%%!!!RRR&&&&&&"""###$$$---"""&&&///---333III111DDD555333///AAA666BBB000;;;BBBBBBBBB>>>AAAGGGIII>>>JJJ???:::;;;;;;===mmmLLL<<<666===>>> FFF@@@:::<<<444...333;;;===;;;AAA@@@;;;JJJEEE@@@LLLEEEBBBLLLCCC;;;EEEvvvNNNJJJ666FFFBBBHHH@@@CCC555MMMNNNJJJEEE666888DDDEEEBBB<<<======999<<>>??????999===>>>@@@???FFFFFFHHH999>>>===;;;???:::999>>><<<===HHH>>>GGG@@@666999999;;;:::BBBeeeRRR???DDDDDD???<<<;;;>>>444666888333999>>>777OOO===EEE666@@@;;;>>>777NNN;;;+++888NNN111333999555CCC777444:::333666???333666777***555777444;;;777JJJ111222555222+++III>>>777...+++---***((())))))'''+++)))333///---000777;;;@@@)))))))))CCC&&&&&&***111...&&&...555777000gggJJJ### 555&&&'''""""""666(((222333222///...---222:::333000///,,,+++...333;;;JJJ>>>===HHHnnnNNNDDDEEE>>>888999AAABBBNNNAAAQQQ???555888NNN<<<999777222222,,,,,,777;;;;;;PPPBBBAAAEEE@@@EEENNNTTTKKKNNNEEE>>>UUULLLEEEBBB444222///444???HHH;;;???888CCC<<<>>>555BBBFFF???<<>>DDD@@@?????????EEEHHHCCC???FFFFFFHHHDDDMMMAAABBBSSS@@@>>>:::@@@BBBXXX@@@CCCEEE;;;<<>>GGG;;;AAA:::;;;888999EEEIIIHHHBBB===sssYYY>>>===???AAA:::999SSSrrr[[[IIICCCQQQ===@@@666<<<:::DDD666999888999888777444///444+++***+++)))222888333@@@BBB???999222///111///777HHHEEE===888GGGBBB777///333000222,,,...&&&***---(((---///+++444---000///???000111III---(((...'''(((&&&,,,888***666---,,,<<>>===OOODDDGGGQQQ888000:::444;;;<<<333333;;;555;;;===<<<;;;GGGBBB===KKK<<<===<<<===>>>LLL>>>???[[[GGGCCCDDDEEELLLFFFAAABBB FFFBBB??????HHHDDDEEE???HHHRRRDDD@@@IIIJJJ???>>>888DDDFFFAAAAAA:::FFF666:::;;;===<<<>>>JJJPPP???ZZZ777<<<888AAA@@@^^^SSSZZZLLLRRRLLLAAAEEE<<<>>>222===;;;>>>999555000888...---333,,,%%%***...111888+++444888222???------+++KKK444333---===<<<333AAA@@@999000666---***(((---...IIIBBB---000,,,+++AAA333---:::888///777111+++$$$,,,+++***:::///)))'''>>>,,,""">>>$$$&&&@@@"""444%%%%%%(((+++...BBB///555555===---111444444,,,///444444<<<;;;???EEEAAAEEEQQQPPPeeePPPDDDUUUSSSfffHHHCCCDDDAAALLL888FFF:::===III^^^PPPBBBDDD666444444888;;;<<<===KKK]]]TTTdddaaaGGGBBB:::EEEBBB=========222;;;888DDD999888000>>>...111666444999:::;;;999;;;666<<<===BBBLLLEEECCCDDDEEEGGG>>>AAAHHHEEEKKK???;;;<<>>@@@MMMTTT\\\fffHHHCCC===>>>CCCHHH>>>===BBB<<>>NNNKKKGGGGGGBBB:::===999BBB333666:::???<<<>>>NNNpppVVV===;;;BBB777777444555444222666666000...111222000000111000111333...333444<<<(((111:::000DDD333222///222000222444333111444000***--->>>333...+++))),,,---,,,(((555,,,&&&%%%===***+++(((***'''>>>ZZZ___(((+++''''''$$$$$$ ###!!!$$$%%%%%%&&&%%%""")))111...000CCC:::///222666...---888555:::AAAJJJHHHJJJOOOVVVJJJAAABBBHHHNNNaaaKKKAAADDDKKKGGGXXXCCC111333888@@@wwwZZZYYY|||======AAA222000BBBAAAHHHOOOiiiwwwGGG;;;555888111222;;;CCC===888888???[[[===111999AAA[[[;;;;;;>>>888===KKK<<<999777===AAA666>>>777>>>===CCC;;;???DDDNNNGGG???;;;AAAHHH@@@;;;???>>>CCC;;;HHHKKKFFFRRRDDD===AAA>>>:::888>>>BBB:::<<<;;;JJJ===DDD>>>DDD888======@@@===AAA999222???<<<===;;;???===___dddSSSBBB666;;;777666555...333;;;---///---333888666111666111<<<555666+++///000,,,...,,,+++111222>>>333...---;;;000)))666,,,...+++***666111---&&&$$$$$$%%%///$$$,,,000+++''''''000(((&&&...###,,,333000===///'''###000***%%% !!!111,,,&&&---000---AAA---555888555<<<222...111333666777;;;SSSHHH^^^PPPuuuTTTwwwPPPRRRHHH[[[EEEOOOQQQiiimmmTTT:::...111999[[[VVVLLL>>>666;;;BBBKKK<<<888666DDDQQQQQQ 5PPPKKKRRRAAA;;;777888MMMIII======EEE;;;;;;>>>;;;666::::::GGG<<<===:::<<<666??????444444777===999999:::;;;BBB<<<:::999OOOGGG<<<;;;RRRHHHDDDAAA<<<@@@BBBLLLEEE___fff<<<;;;======888999777<<<>>>AAAIIIAAA888EEE===KKKJJJDDD;;;>>>888:::===999GGGHHH>>>MMM===EEE===HHHKKK```GGG333222333::::::555///,,,444///...)))000222,,,,,,000===999JJJ;;;...+++:::(((***(((111,,,...000111...777---******---,,,+++222---******000(((&&&,,,&&&)))'''///000&&&,,,((('''***'''%%%$$$###+++)))&&&''',,,((("""###'''$$$!!!&&&!!!$$$$$$+++(((***%%%222...---111...555111444:::KKK222...333555===LLLPPP```LLLLLLVVVGGGGGGAAA;;;___HHHJJJsssYYY]]]YYYFFF777>>>JJJ<<<:::HHHBBBEEECCCCCCccc___HHH:::>>>IIIZZZpppZZZGGG<<<;;;555555111333VVV======KKKAAABBB@@@CCC999111111>>>???888999222999;;;666222444999;;;;;;999:::777777;;;:::@@@777===@@@IIIBBBDDDAAAGGG>>>:::888JJJIII:::;;;>>><<<333666888<<<222...666:::AAALLL===EEERRRgggOOO999444888888HHH<<<888DDD666FFFAAA888CCCBBBIIIGGGJJJ;;;:::CCC888SSS999@@@000000***666+++///+++333111555///777111WWW333@@@---++++++555...444......111000///888<<<---&&&'''---******000)))***+++(((///333***000222///%%%'''%%%...'''...)));;;""""""+++&&&%%%###222---###"""!!!!!!999&&&&&&&&&+++''''''$$$111===///333+++999111111;;;333===000555666999SSSYYYEEEGGGAAAHHHCCC<<<@@@???YYYPPPMMMXXXOOODDD888WWW999999666;;;LLLEEELLLHHH@@@EEEIIIgggOOOUUUrrrEEEDDDBBBzzzWWW???333555555111888:::;;;;;;777<<<@@@@@@AAA<<<===111///555777666555777888888666333:::999888555666444;;;;;;<<<666444444222OOORRR999GGG@@@CCC???999111222111000555777666444777555444666111///:::IIIfffCCCKKKjjj sss<<>>999:::<<<888555555<<<;;;^^^[[[KKKJJJ===DDDGGG@@@555...AAA333===---+++...000000---+++000777---888///,,,,,,111999999333555333111000111777***'''(((%%%$$$&&&+++''''''+++'''***(((777)))...???GGGqqqDDD444000333...___III///(((---666)))'''$$$,,,888,,,%%% $$$&&&777555,,,%%%###%%%&&&555555$$$///000++++++...///111CCC000///555000@@@888KKKKKKNNNFFF>>>TTT888IIIBBBLLLIIITTTQQQIII777@@@AAA>>>555222777???GGGFFF:::@@@KKKdddeee[[[rrr888FFF;;;cccwwwHHH<<<666;;;===777999???666888222???DDD;;;JJJ===999>>>...555aaa444CCC444PPP888555GGG:::;;;666888888999<<<;;;666999:::666;;;:::>>>BBBMMM333333888333111000777888888888777555222...222111///777<<>>YYYKKK>>>HHHOOO444111:::<<>>555FFF000'''------000000...555DDD...)))(((---@@@000)))&&&---BBBSSS???777///333777888333***///&&&'''(((%%%)))***444666)))>>>111+++)))///888???JJJoooEEEHHH]]]000222???///)))***QQQ...333(((((((((%%%((($$$'''@@@;;;333666&&&***!!!"""%%%(((***000<<<<<<666999111//////999222222111999<<<___PPPHHHCCCFFFEEE^^^BBBEEERRRUUU[[[FFF>>>:::>>>888CCC;;;;;;===CCCCCC:::DDDIIIPPPYYYeee]]]???666999fffQQQAAAbbb999;;;999111444777---,,,111HHHMMM]]]HHH555777333222333ZZZ666...>>>...444;;;555111333:::===RRR555888;;;666666999777333999@@@DDD::::::;;;555111222555111333000111888222777333555///111222:::DDD999777KKKZZZFFF@@@>>>IIIFFFLLLEEEGGG???555333999777888333KKKaaa888444000111333***///(((+++111---......666222555...)))---222...+++<<>>@@@888,,,777666000))),,,///---***(((''',,,)))///++++++---CCC222+++***...444NNNGkkkBBB???777FFFDDD---000---,,,###$$$***+++'''JJJ000)))))) """%%%###SSS,,,%%%'''((('''$$$***'''###$$$)))...PPP111DDD;;;000222555777999111777<<>>555<<<000222111333666666AAA111555555000777999DDDPPPaaaBBB333///777???444111((($$$///111444666AAA:::999555NNN777444888444000999<<<333:::DDD<<<999:::;;;;;;BBB777<<<444///---333333000333:::000333777999333;;;888@@@666EEE\\\LLL???HHHJJJIIIDDDFFFLLLGGG;;;555444+++444444555777111///333...,,,***%%%&&&)))666333...+++555WWW111===(((111***///333;;;MMM===:::888......111FFF111(((&&&***)))222((($$$'''"""&&&###'''++++++***&&&...'''888kkkzzz<<>>BBBBBBeee;;;000444000//////---111000111///222444888111111444@@@555000333<<<:::777DDD>>>AAA@@@===555888333111111444111222777///222555,,,'''$$$'''111***...000)))---+++555222:::666222---000...555111...===888555AAA,,,CCC888'''###$$$%%%...***(((&&&###@@@&&&###***///???)))!!!(((UUUiii666:::111333***333///FFF@@@222777YYY)))///999$$$,,,)))333===  !!!%%%###===***...===666'''(((222+++---***&&&+++HHH)))***---OOO555555666777<<<666TTTBBB999@@@WWWNNNEEEMMM>>>DDDKKK^^^OOO>>>JJJTTTPPPnnnAAAEEENNN>>>HHHHHH===YYYuuuppp{{{LLL@@@PPP---(((,,,666999::::::888===555:::===<<>>555<<>>555333---777222333...222...***)))+++(((///111111///...222000777444000BBB222,,,444...))))))000666222+++000:::666(((;;;%%%!!!$$$&&&***%%%(((,,,$$$"""######)))***---(((******???...+++---777222//////111444666***)))DDD777333222222(((%%%((()))'''###""" $$$"""(((444444444PPP000$$$###222'''111(((///:::RRR,,,+++***666333333444666;;;>>>~~~<<<333FFF^^^JJJLLLfffPPPFFFKKKLLLGGGAAACCCLLLMMMooo>>>???:::AAAGGGKKKUUUwwwxxxXXXJJJKKK444///444555666@@@888999>>>@@@:::444@@@OOO???888777666333999666111EEE===???HHH---///444666555111777III::::::444fff777<<<444555777222000444444777555III:::444///222444222000---+++000///777666111222333...111111111444:::SSS555000HHHSSS>>>>>>666@@@000***444111111EEE...777KKK000000222333+++000111...555---777======666777---+++...,,,+++222......---000888---(((%%%"""******&&&''''''&&&""" ###%%%"""$$$)))''',,,666<<<;;;666+++AAA:::>>>///333777222222999000999((($$$$$$***+++---DDDUUU$$$"""###VVV<<>>333000888@@@NNN777===666IIIAAACCCKKKKKKFFFGGG\\\XXXKKKHHHIIIEEEHHHEEE@@@<<>>666888777>>>999000000III111111666:::666111<<<555IIIaaafff---///>>>444777FFFEEE444222AAA666)))000999:::555555444///,,,+++???222...---111111000111000111///222555kkk888000,,,111000000222888888AAAEEE;;;CCC777777jjjPPP999888111222AAA???NNNHHH>>>444222111444III,,,''')))LLL444333<<>>LLL///)))444111+++(((***000)))888---$$$'''###$$$'''%%%$$$(((((($$$'''&&&'''888UUU--->>><<>>CCCWWWOOO^^^===;;;LLL$$$"""'''***222))))))$$$  !!!999"""%%%666111111---$$$,,,%%%&&&&&&$$$"""...777'''""",,,,,,...(((444111777CCC:::666333:::===AAAKKKAAAxxxIIIPPPJJJEEEGGG\\\HHHKKKhhhbbbDDDIIIdddUUU'nnn[[[iiizzzCCC;;;CCCJJJ___OOO111555777999333555:::GGGMMM///---GGG333444***,,,222111:::222888WWWccc444999::::::666BBB999<<<333111999555---222;;;;;;666555///***(((...---///......333222888444;;;......000999,,,///111---...111555///;;;GGG555EEE666666IIIjjjCCC555000444444;;;???uuuBBBBBBCCC888444111111///000,,,999&&&***---000+++---888+++,,,@@@999777555222000222???///((())))))000444((()))$$$777@@@(((###+++,,,+++&&&222>>>)))000///OOO555***)))###///111999???TTTGGG666888---111$$$,,,$$$'''&&&&&&   &&&&&&)))222 ###'''+++"""&&&$$$((('''&&&+++333EEE$$$'''%%%---333333555888FFF>>>UUU111<<<@@@BBB@@@???EEEQQQVVVJJJFFF\\\GGGJJJEEEGGG@@@999CCCBBBJJJ;;;[[[XXXLLLWWWbbbUUUFFFHHHOOOIII666666666999333333777===222444222444NNN444...222---333111222...rrrmmmBBB---000BBB666333333===:::???:::444555888777<<<:::666666555555000000///......///222<<>>---...000...555666+++000,,,222,,,555111+++444000''',,,RRR444GGG555///,,,777111&&&???---)))(((%%%'''---222000:::666...OOO:::444<<<***###444000999444CCCIII777...000999555LLL...### ###;;;      +++)))###000...%%% &&&,,,***$$$%%%''')))UUU444...%%%$$$&&&$$$:::---,,,...:::777:::777888===???<<>>CCCEEE@@@111444???NNNAAADDDMMMTTTGGG```QQQHHHjjjAAABBBEEE***555555111:::<<>>///<<<+++)))111---222444666,,,222///'''%%%'''%%%))))))+++)))111999222ZZZTTTRRR999---888JJJ\\\777,,,***""">>>LLL666///###+++NNN222+++---###    <<<!!!!!!+++((())),,,!!!'''%%%###)))*** !!!###%%%###***,,,***///NNNVVVAAA///777>>>999KKK>>>???:::===HHHLLLEEEDDDAAA>>>OOO@@@OOOAAADDD>>>AAA777XXX666AAAGGGVVV[[[MMMSSSZZZTTTIIIVVV222888III---444555PPP===777333111KKK---......333777:::>>>...444666CCC000+++555bbbOOODDDVVVEEE???777@@@GGG???555000555333TTTVVV===<<<666DDD777<<>>???===;;;;;;@@@===222+++......555222666888555444555III444222*** %%%777777<<<555HHH888CCC888777888444555666;;;000)))******,,,+++444111uuu111222>>>333...,,,000333+++444777===333;;;222111+++***,,,111******111;;;UUUOOOYYY___999///LLLHHH///,,,CCC+++555''''''000000---%%%QQQ$$$---GGG&&&###   ---  %%%"""&&&MMM ---'''***))))))%%%'''$$$(((&&&$$$&&&###&&&,,,)))...KKK666:::444111777:::444555555@@@JJJ777:::>>>AAACCCCCC===JJJCCC===FFFEEEJJJXXXIII555999===<<>>@@@444@@@999EEEHHHYYYppp\\\gggDDD>>>:::@@@444AAATTT{{{JJJ<<<+++,,,,,,///;;;///999___333...:::555666555444===555111222444000......(((444;;;;;;777;;;999777FFFCCC555555...111??????:::888EEEZZZIIIIIILLLVVV}}}GGG[[[@@@???888555666;;;DDD888555222222...777444000444000555BBB:::|||JJJ111222:::333888;;;<<<444kkk666///888>>>:::444555///888///111999===???777,,,***,,,888999777[[[qqqGGG999555000222---===***,,,,,,'''///@@@555444NNN}}}SSSAAACCC[[[:::??????000;;;---333***///+++EEE333AAAMMM000***((($$$"""QQQ,,,  666   !!!444999555:::333000$$$$$$$$$ ###!!! !!!$$$333+++,,,,,,***)))''',,,222:::333666111;;;555555OOORRR888444888555:::???===888;;;CCCBBBFFF^^^uuukkk]]]HHHNNNEEE,,,<<>>999555UUU777)))((('''444fff```]]]-oooCCCBBB---***444(((222CCC444$$$''''''444666III888======555...111(((333***+++...'''***+++WWW666:::---999JJJ===@@@222...---       """ """###"""BBBGGG000000$$$ ### $$$"""&&&)))+++333,,,&&&,,,222000666222666---111333444333>>>;;;444333555666444999CCC999BBBFFFBBBNNNnnn___YYYpppVVVXXX@@@222777444;;;<<>>111///...444000555:::///666555777:::((('''(((EEE===XXX\\\VVVFFFAAA222333(((...!!!&&&888###"""CCC------(((111NNN444;;;'''(((%%%...&&&%%%...###%%%%%%***@@@III)))888cccDDDYYYFFF@@@((( ,,,  - - -   %%%===))),,,$$$777///###$$$!!!(((PPP%%%%%%777---++++++222///+++&&&)))...///888GGGJJJ---222555;;;444>>>000777@@@BBB:::@@@YYYGGGXXXyyy{{{PPPPPPIII333111---///333...666///+++111555999555555555666::::::<<>>222111///+++111>>>000///999666...000000000777GGGSSS...+++777(((%%%:::444>>>AAA888AAAHHH666333###%%%!!!### ***(((!!!,,,333TTTPPP%%%---uuu%%%$$$&&&%%%)))%%%FFF000***...XXXPPPSSSAAATTTiii>>>777    - - -  - - -  ///--- QQQ"""--- '''%%%$$$###&&&"""$$$HHH"""'''...(((&&&,,,111333---///******///666555jjj888333333777111===555;;;;;;===999???MMM@@@EEETTT___WWW~~~HHH@@@;;;+++""" """222;;;333222222---333222777:::BBBPPPGGG777SSSPPP777777GGG666<<<999???QQQ:::@@@777666777888EEEEEE555???FFFEEE888222===OOOmmmeeeYYYVVVqqq - dddVVVEEE777999999777---///000555:::111///...999888@@@FFF;;;EEE:::>>>CCChhhIII222777777UUU<<<===333999;;;EEE000555333777999...///333CCCXXX000KKK444$$$***)))222DDDJJJIII???@@@444///'''$$$""""""###...$$$***&&&''' ,,,aaa$$$ ---$$$000""")))'''666,,,+++GGG+++DDDCCC***FFF@@@***"""!!!"""      - - -  $$$"""888222"""'''+++!!!"""###""""""$$$###&&&###...))))))(((NNN;;;...111+++000444333888888777......777111TTT777222333555===333888???GGGmmmUUUcccWWWTTTNNN???666<<>>\\\pppRRRIIICCCDDDXXX OVVVDDD999888888:::444000222000555666444999222BBBCCCXXXFFF???:::<<>>333QQQ555555MMMKKK555444000000000111???111FFFKKK444:::EEE444222444***---,,,@@@444DDD444,,,444111---&&&***$$$!!!"""%%%!!!"""!!!!!!000... )))&&&'''000...&&&+++&&&***888...,,,$$$&&&'''"""%%%&&&     222//////>>>!!!!!!"""###'''&&&,,,)))111 !!!'''&&&$$$333***,,,---111444:::+++;;;444999444...333;;;777888555999777444KKK999FFFhhh&kkkKKK@@@GGGAAAIII777666555111333///444222666...000,,,000000444999lllEEE@@@===666III777333777>>>BBB;;;777999@@@<<<:::<<<<<<:::BBB>>>:::999AAAGGG@@@888444AAABBB@@@??????UUU 1bbbRRRCCCHHH555HHH999888000...///777444;;;???:::666BBB@@@555@@@777:::999:::888111GGG444888666666555000888777666@@@@@@JJJ888@@@888555@@@AAA;;;AAA666;;;111000---333,,,...222333---***%%%)))######!!!(((000###%%%,,, ((("""(((&&&%%%,,,000000,,,MMM777,,,555$$$!!!!!!000 )))      !!!@@@SSS:::AAA 333'''"""%%%"""!!! ,,,###;;;&&&###(((&&&***,,,...///333444111///,,,111---444---777;;;...QQQ@@@:::999888:::BBBCCCQQQAAAHHHOOO999GGG>>>555444666777888???HHH333111111111///555888333///<<<888999666222UUU:::DDD<<<@@@ccc===<<<;;;999>>>@@@:::666555AAAEEE???:::AAAQQQ<<<666;;;;;;AAARRRQQQCCCDDDgggddddddAAA999BBB888777::::::AAA555777:::===HHHOOOMMM>>>@@@888===;;;999;;;000888111666>>>888444///555UUU???:::<<>>HHH...333999555JJJ444222333222+++...000333DDDIIIBBB666888999;;;===EEEGGGNNNYYYEEE;;;QQQAAA@@@888III<<>>;;;AAA:::BBBPPPNNN;;;===VVVIIIAAADDD777;;;<<<<<<<<<;;;444KKK111,,,888999]]]HHHEEE<<>>AAADDDFFFDDDBBB111,,,666000888222777...))):::+++BBB222,,,444111111111...GGG]]]bbb>>><<>>EEE<<<888AAA;;;???@@@AAACCC???>>>VVVaaa111333444888;;;444DDDIIIEEE<<<===RRR555;;;EEE666555000111>>>HHH999111555>>><<<@@@999888222zzzFFFRRRUUUeeeZZZFFF;;;///222888111111)))+++BBB666+++111%%%%%%***%%%&&&######$$$$$$%%%)))(((LLL&&&%%% +++""" """---"""    777444OOO888###%%%""" ///!!!###(((+++"""+++------BBB===999666)))333999\\\UUU,,,))),,,&&&//////444999===MMM???WWWKKKDDD===;;;CCC<<>>111666LLL222000///***;;;/////////555>>>>>>GGGMMM???FFFAAA888555999999:::OOOTTThhhQQQ///---000888AAA:::???:::222666444HHHNNN\\\<<>>>>>FFFEEE888333999SSS;;;:::444<<<===<<>>;;;<<<:::555999<<<666bbbRRRHHH333333::::::>>>DDD333777555444;;;DDDJJJAAA999===AAAIII...///,,,222999888<<<555777555555777333999777777===999222777444@@@===666@@@GGG---999222222<<>>444777---...222...&&&,,,---,,,;;;,,,DDD===+++lll*** !!!""""""%%% '''###'''"""###### 555111%%%!!!$$$%%%$$$!!!  """   """(((333___---###+++***"""&&&$$$ !!!)))'''===VVV>>>000bbb\\\===SSS000777///,,,---111...AAA===,,,&&&;;;&&&$$$777444^^^;;;RRR===DDDFFFBBBwww]]]oooCCCdddooofff<<<;;;777222...111111111UUU<<>>>>>777...;;;222111///<<<>>>666;;;666777444666444;;;,,,///222333777===:::NNNQQQ666222444888@@@222:::...333333000888???888999IIIAAA999bbb>>>222888777KKKIII:::<<<222...888555XXX555AAA\\\QQQIII555999>>>444111***''''''...'''(((***222''')))000AAAAAA...!!! !!!%%%:::333$$$666111888"""###!!!&&&NNN000***)))***$$$$$$%%%---######(((###===        SSSYYY((( +++ 555)));;;eee+++)))222222UUU<<<333------...EEE000555222111777&&&((('''"""555111;;;---<<<@@@666333HHHNNNtttIIIOOO```mmmhhh:::888666:::000000---III???...,,,JJJ>>><<<888:::444000+++,,,000...///111222CCCOOO<<<555888EEEJJJ666<<<888000+++555444555666......000555,,,222:::666//////111///111>>>777444---222000555888777GGG444222555555222BBB@@@???555:::666IIICCC666777DDDTTTHHHDDD444666...333OOO;;;@@@>>>777AAA222999,,,777,,,///'''+++...YYY666555FFFSSSKKK333555yyyBBB...+++&&&***###&&&EEEZZZ '''111,,, &&&222&&&***&&&---'''LLL!!!%%%'''JJJ111FFFBBB999CCC---...'''"""+++    ***)))CCC:::888(((&&&kkkrrr)))***999'''666CCC333(((---222333000---222555...222%%%***"""---666444///888...---///BBBBBBIIIOOOFFFiiiyyyQQQ444+++&&&111000333111)))666///---EEE999KKK<<<---333999///......111000===CCC<<<666777777bbbZZZ===---+++***...333'''222666---:::111;;;888...000;;;222111222333666888000333333777555;;;444999999666===???>>>@@@999CCCAAA???@@@===<<>>IIIHHH444CCC555[[[SSSDDDAAA666+++###'''+++:::CCC<<<--->>>++++++---111'''+++...AAA---,,,,,,333444:::...222333444===ttt KKKGGG444***)))&&&'''HHH:::444:::999...---///)))(((---444+++444666222777...111444333777999:::333777EEE666999<<<;;;<<>>DDD999111222555@@@000111,,,;;;111++++++000+++555111&&&###)))BBB'''***:::...&&&(((***777'''...FFFIII<<>>,,,""""""333%%% 333######111111///OOO------JJJ[[[IIIooo.8|||UUU<<<888$$$%%%       %%%000$$$###GGG"""$$$!!!###%%%)))NNN'''''':::>>>III999JJJ1|||:::<<<===<<<+++'''!!!)))---***---333...EEEMMM...111LLL444111;;;000''''''$$$111111***333000000%%%+++(((***111((()))***'''000999,,,...444111LLL///555222,,,444KKKvvvTTT;;;:::000''')))&&&+++777777***++++++(((...444///<<<222000333...222444111333000///555555999///:::>>>888[[[>>>HHH888kkk999:::888;;;:::666,,,444EEE666111999...111&&&$$$666666''''''(((,,,&&&,,,AAA)))&&&$$$((('''###'''!!!''' )))AAA<<<;;;***<<<111***!!!%%% (((%%%$$$"""222*** ***!!!333"""+++,,,!!!666===FFFBBBDDDFFFXXXAAAVVV"BkkkIIIDDD[[[444OOO!!!      '''!!!%%%  ***'''!!!((('''$$$$$$888+++777GGGVVVZZZWWWIII666+++&&&$$$'''!!!"""$$$ %%%+++''',,,&&&***'''===333MMMRRR111555AAA444------***)))++++++555000...***%%%$$$%%%'''(((///)))'''000111666+++...---'''***+++111222:::???222444000&&&***'''%%%******///222---///111,,,+++,,,---000///222:::===222444333///...///444...;;;888@@@<<<===888FFFHHHDDD>>>;;;666555777]]]:::333999999666===EEE555444***(((%%%???###"""111???%%%((())),,,'''%%%"""######!!!""" ###___000###999,,,111UUU%%%)))&&&!!!&&& !!!000--- """***EEE&&&XXX((('''???000444;;;eeegggYYYWWW^^^]]]-\\\|||ggg)))!!!%%%   ###$$$   ///PPP$$$]]]888###$$$'''000333333&&&***000:::___ cccVVVNNNjjj999GGG,,,666,,,""")))&&& (((&&&'''(((+++111---+++333<<<555---+++***(((222<<<((((((!!!"""///+++000///,,,)))###'''(((...)))$$$---+++```+++222---111+++111777999$$$###)))(((%%%((()))***&&&&&&,,,>>>$$$(((III---000,,,***///---555(((***''',,,444---111000PPP444555555<<>>;;;ZZZ999111WWWXXXCCCUUUAAA555555///OOOgggDDD222...000&&&+++,,,///000:::GGG)))%%%(((+++...444###&&&$$$###$$$$$$!!!###555(((!!!''''''...888DDDSSS+++&&&+++777>>>111444 (((555###%%%###!!!&&&vvv///GGGppp#yyyUUUYYYPPPfffZZZpppOOO444$$$---&&&VVV&&&))) '''+++%%%   - - - ///!!!$$$&&&DDD,,,&&&000///222...###***???999lllhhh{{{NNN:::iiinnn...333222+++''''''$$$!!!;;;FFF%%%$$$&&&'''HHH***,,,<<>>***,,,---&&&---PPP(((&&&333444888@@@111333;;;666<<<444444;;;::::::???>>>ZZZSSS]]]DDD888BBB333222???<<>>$$$iii"""***%%%???CCC@@@&&& 444'''SSS''';;;444888111@@@<<>>@@@888555@@@333555333$$$++++++(((###!!!%%%!!!)))$$$(((((('''!!!(((---333!!!!!!111$$$---000222"""===(((???===%%%***!!!$$$ $$$333((("""###&&&""""""###%%%OOO(((,,,AAA111&&&@@@,,,///GGG111@@@     - - - - - -  AAA!!!%%%DDDCCC///(((""""""!!!111RRR===---222000SSS\\\LLL666TTT)))AAA===DDD%%%%%% &&&$$$%%%$$$###'''%%%$$$######'''%%%"""&&&$$$***'''((((((###///&&&'''$$$&&&222111######+++,,,)))###""""""!!!///...+++"""!!!"""&&&/// """***!!!&&&(((&&&"""'''***---EEE---(((888000,,,''')))---666AAA===^^^JJJXXXtttoooSSS555,,,+++000///>>>VVVmmmIIIMMM333HHH666444)))'''(((111 !!!###### """ $$$"""!!!!!!$$$&&& !!!&&&"""OOO"""***@@@333===$$$>>>)))### ###///(((fff###<<<111...--->>>!!!###$$$"""GGG%%%&&&111CCC'''---555'''       !!!:::rrr!!!!!!###!!!(((III777000---(((***JJJGGG,,,///...,,, ###!!!$$$...###!!!///%%%)))###---!!!%%%###$$$$$$###(((&&&"""&&&,,,(((***(((666TTT###$$$"""222)))"""###!!!###!!!!!!"""!!!???%%%!!!$$$!!! !!!""""""###&&&&&&(((&&&///:::DDD???+++(((:::---111888666:::kkkuuu|||mmmddd777222222%%%,,,:::)))...555...333222<<<''''''(((###%%%$$$...+++,,,)))###!!! :::777***$$$???111444<<<''' %%%'''444 ###HHH???!!!''''''000,,,'''***<<<%%%+++!!!+++     )))...XXX<<<(((777"""!!! JJJ:::999((($$$&&&RRRuuuYYYBBB+++!!! 000&&&!!!+++"""$$$"""***000!!!'''$$$&&&''')))'''%%%$$$!!!$$$"""$$$###!!!***%%%@@@&&&999kkk"""""",,,(((!!!!!!((($$$$$$*** 111$$$!!!...'''"""!!! !!!"""%%%777???>>>vvvSSS...222000999999888444444}}}% ggglllOOO<<<---,,,,,,''':::,,,$$$###!!!)))444'''---888%%%,,,((((((((('''$$$$$$!!! ###000!!!999PPP;;;777DDDOOO+++&&&  (((!!!"""000'''++++++222&&&(((       '''666111444...###!!!444$$$<<<000HHH999777$$$'''$$$+++...  %%%666)))'''333%%%$$$(((...(((((('''!!! ...))) &&&""""""'''%%%***%%%&&&$$$******"""$$$ ''',,,&&&!!! """!!!EEE"""### ### ###%%%&&&!!!!!!AAA))):::'''***%%%...444***---+++<<<<<>>999999..."""+++555PPP555YYYMMM888///(((%%%&&& """&&&***+++$$$"""$$$---***&&&###111+++%%%!!!'''###$$$((('''+++%%% !!!&&&"""%%%  !!!$$$((( !!! ///!!!"""JJJ''',,,''',,,+++111NNN555XXX^^^XXX???''')))***777999@@@)))###000((($$$III%%%''''''666 ((( %%%777$$$"""###)))"""!!!)))888///$$$!!!"""      BBBMMM... ,,,&&&)))rrr&&&666!OOO---%%%!!!=== (((%%%"""$$$???222---FFF111888<<<111&&&,,,$$$((("""$$$ $$$(((&&& """%%%### !!!""")))###&&&!!!'''!!!$$$***''''''111???222>>>***%%%888NNNddd]]]YYY'''000 888MMM666>>>+++,,,;;;000!!!!!!333%%%%%%%%%---***###000 %%%'''  - - -  - - - - - - $$$aaaSSS222 $$$""",,,***^^^)))888@@@EEE$$$)))###444 $$$,,,$$$%%%###******$$$%%%333CCCSSSBBBEEE000### ###"""&&&&&& ***!!!%%%555''')))""""""### &&& """ ...  +++!!!666"""%%% %%%$$$###%%%|||DDD$$$###,,, !!!&&&***===&&&!!!PPP!!!***$$$<<<%%%!!!222  VVV         888HHH...$$$###&&&777)))!!!$$$BBB((("""(((111"""$$$""" 888###$$$$$$###111^^^CCC333RRR !!!%%%!!!!!!&&&!!!### ,,,333888333)))$$$!!!&&&"""!!!"""%%% !!!!!!"""---"""!!!$$$!!!!!!444!!!### ===''',,,eee)))555 $$$&&&!!!(((--- $$$ 222)))!!! ((("""  - - -       )))***===MMM333???$$$"""---***000***(((######""" %%%!!!###&&&(((&&&$$$$$$'''DDD666...///NNN$$$###!!!$$$""""""%%%!!!### ***######!!!!!!(((  ))) !!!!!!+++JJJ""" '''!!!'''&&&((( 222((($$$"""!!!### """   \ No newline at end of file diff --git a/data/fits/NGC3344.Mono.8.fits b/data/fits/NGC3344.Mono.8.fits deleted file mode 100644 index c84ac2c68..000000000 --- a/data/fits/NGC3344.Mono.8.fits +++ /dev/null @@ -1,12 +0,0 @@ -SIMPLE = T / file does conform to FITS standard BITPIX = 8 / number of bits per data pixel NAXIS = 2 / number of data axes NAXIS1 = 256 / length of data axis 1 NAXIS2 = 256 / length of data axis 2 EXTEND = T / FITS dataset may contain extensions COMMENT FITS (Flexible Image Transport System) format is defined in 'AstronomyCOMMENT and Astrophysics', volume 376, page 359; bibcode: 2001A&A...376..359H PROGRAM = 'PixInsight 1.8.9-2' / Software that created this HDU COMMENT PixInsight Class Library: PCL 2.6.1 COMMENT FITS module version 1.2.0 ROWORDER= 'TOP-DOWN' / Order of pixel rows stored in the image array END % &%## #" "#&!- "$('8*,(&13))/3,(*Ff0+/21NeRTtbE@O5Cp?*1.1+3/3-.*6)$DM+/,+,+//+'5../,4(012/.,.4<217553236:@6977V38;8352=4=2719723>136;4463.50+.-(/>=,:;S;8O6SVP=IDA2*+18'(%%*%&%$&$'#  +(!"!!!#"$ #'%/#%((&*'>(-3-1b*56$#%,+()09KBDN<//6@95-2336:4'':1/3-PC?KLF=JGCIM@AG@C:81,.-/1)*/$0%(*%(&$"!!':( % "!&$! 6*'&"! #"!'!$2-(-,&/4/3+2+,%><'+3%$++//6LW309KU=I40../67(+,.(+(&%('*+31/-++5()-'+,0.-///>95057672.0.443<==:=GA?2+-:>G36:>78:LcVKRPTC=`BP7=/1,/,+K%%','10%&$ *(;= "#4$"6$#$+#:"!" ,=(,/%+((0+/A181<,*8*5$(%)0*0-3=845C3!-)()($247JR628)% #.:-0-2,84-/475?D3-/1+()*,)-1033(62(&(4Q-(*('('++**)-/56N8::667?592-/149<76:>^CaA??DOHA8AJ:>/=[BUD:N;55;7ECJQNQMHM\KM@CW:KRb460*.+1&*")*%%! ! &!&!!((-!'$&1 $ 0%&)51($)01**&)FDm{V5,(%&!'1L*5.0+4/,/29721834009--+111H55+',*'(+'*1('*)*+.*//,,43-473465;2289?59<6589VNJTMGMBAA@GH3.3HFHCQ]>-3@:3:@bVMW`SPHQOCDBEM[R:011/3(0,'*+$'$'# !F!(! !)"%#% #0$8**(-*@k;5'/))/.-3Krɥ`/*'%"#'12..-.1.)/)/2928BK51+5//0),4,*+)&$')'%%-5''(*.+/-*010301203005842879?9F9853?MElRBECABOJ9499R]VU\D76MA56>XMHUZXbR[SRU^kQMG=2.-4+*3,%')$""#''#(/#=!2?Q"!0#& $< ","'C/6A2-V+*'//).B'+,10C_m=0+($'(+.6+//3:/+++07DJEd842-+(+.%%,++*$-*71H%)*++&%)-),/0.,/1/425020224C9;:D>68:7:4:;MCXLAD?B=AFFF8HzGFNnC01?5?ODIKSWi|LVBkgGHCLR3170/02#%%"!'00'#!/"@( -(& &+2# )*&CG%,0>4*(('*1<*7I/C2*:ZPR0+)1-1,*0.30-?1),1++07VS>2.(((+;+)(+J/&'&+./,%#(','(*+--,0-00/*/0316340K35;8;5>CH=15;FMhDBODCAEU;A0,9c\RRPYhXPCWjE>A<7<4A13/2&))('%# ! ")%O !+W1\((#" %**2='2&#+-15'/.7,-'+F8051K?72@-:A7.3&(+-0E(.8./-*& "&%/0FioC.08-*'*3*&+09,./*)&'$%&+:&(,,+%---,+.0./.085955;17878?@?;:49X`DVGDUKAQFD:=9>EqMI?@=F;:LJDMPSbUJKnPYYXWCGDA0/8E83*)(,*(> #"$$#!* '"!.2'R22$"- "!!-*#&$.7M$%&=/5.1(,.-.B-236++J99(+213.+(&-/2(/0//,+)$  !1=08p@*2-(11#;D,-1;04-))5/(''+,*,)'+0/*)++0*,./027_i7XD737===;:4>C?CD2"#"#%"!!.%,,#:  %! !&!"&))CQ5DT7.8Q@='23+.:d2((*(0)*(.A40/'$'$*,:,*,,-+,-%& !$*-+&F[*$$%))-10,1,17*+&-),+)&&(&'+*+()++,*0.+02758<;>L=93>:;8<99?<@>DADFPDF?GHD78In=BQ]<23JDCisHHBFGPbXukA;F>@:2:?8/11322'&%#&"$!!&# !  & 1-$%0 %# $&*#+2!'#"5*5+8C+L>ABN?.)%#(8J"!(%.&# +((;Q)$''*(2*,/'*)"#%$#&*%&%%&8()*(%07602(21<+)('7,*-*)''(****/-,-././..03389>9:>=A;5:;:;4=:PBAA?I?EHGDD?=BDI_P_JHIUS]onKB9:ABI=<:.262660,%%(*(=!  &.'!) !%,%(%$#$9"%9&"-026+-62;Zcf.?*%#")& ! &-$&'#,!$)&%A&*1@)/)90**)$&3,%'*+*('<$%-(/,153-.+9+9+-+%)3/*+&-42)(,./*..1.2/0.-0/2R6QJL;:<:898;5887?@:AHEGTPM@E<7;BGHII>>;??<;SLTlR[WdQTLIG:6>=>:454.-03<1%'')+&,-$#&!#$"$    (5'">/) #! ,+#0.#.0(-/14/.5CX_7980--+%""!%+#$&#$%'(*,&&&.FZ)+)?&$&0*"(/&'*-'&'(&'&)+4,/0;.).:--'(+0+.4,2*..++*+07/654611,,.2731::=L<<;:;<35764CECAC?AKJLs;87HJM=69VcY[p]XNKF=5<=626/775-.32*%)%'#!$!!#!" #$ 'D!$# /!$0 !!## ##=(7,421/0687817R:71:/*(%&" #(#!"!//,**/*&--1*,(<''&I'%&'B())'&(((%,&&)../,-+56;*90)-+-100/00.2/01;1:1546/,,,-474.3Ux>==>>8:<359@FG>EQFALIDA<>=dPWJ=?7<10/5A2.,/-==9)%'$$%!(""##!$' .%&!#) 0 /&)I;&")+'8$&-*/71B=;F8L4;?@86/+1+2&#(/0#$ &(')"%*)%#'*%'()(),&&''2$&*(*+-,)-X)3,)A1-'')'1r6-.0,1-2G/090..349567123@1551399433=G857=;6==64:9;A?P?GLDEMC@?=@@EAD?::;==81'#LQPhOROY@BE=D9/0=5..;4+,*;1+*$')')>&+$"&##*5:"(  >:  %#%$O$%!!)$$&%+('.?35@8+-5YgLG@80,-/("+*-0'%)-+&!"*(&))+(-*$%)("',0**1'&(''*)/3)&.*,&&+*0-12/+.2/./982/*25317;759:313147530721B:787::@9955<:6DLSGF@B@MEE?B;.,(&'%)'",%(/"#!!! %%<'%&%)*1)_'&%$%   *$#%**2(..;DA3241]cL:J/+-!,%(2))'),,8($ &*)*'a)($')&(&%&).212+($*()(*'***)''(./56/31,..05.-/7.35/051/8.699::25FEBA>?R>FC;:>=<<=774Ghpz_YWSMHG?8599676911@,+)#('''(%%$% $%)*  ,,!!!$ & "#($(/'# %!$&)#"!'0.)&14174TWIoզc?-12&',4)+(),(*,*).%'$)(''((&#$'*%'(''"&+((%)()+'*+,,+(*+));0,-//.,-/984.1525A:42/5466AO59;:9796=><;8:77@<;E=<@I;>>:?ADGA:EI@=BB=>?BLJCA><=638@^x[PP_[RVNF>V;6@=FkE4;U/0+0.)"%$6W.%!)"#" ,$!  '# "%X/+'&Y+)!'""7,!O!$"$!)0'13)&)#6EJnX928.)%*2***82-*)((&5)"%2)'%'('''$(&'*+*,+.-%(-*/,&%&--)-7.0>011-232/3;<>82940?834358517<:@;8>7?=:<<6<=:5:=8;H=DE@<>G@NCZLXO?ADDAE=;;92305CDRUTZRoQGX><=:=53616F.)-(10''&4J-&)# "'$((%#9 4!s !&91$" !'+"&<%'#"('h5$&"%(JM}y_3820>5(-**)-*.,,'(&)'!&($(-6)*+(+.'0+-.-,.+(,,,-.'+))*,,,0C72.98?95494??=<=58K289:4:6/55=>B?L<>CA=BPDS?C@>E@=?::>>=;9./6DRVjZNRPLLZ9@D:9<5400)/3-,37+*)0%.'.%!$#  %),**%$!"0*,#(*3#% $ +##!$%!#"2""#%%&%$&+",;MdK2=F433,(2)1/4.10.)$&((**)-+(+./*%*//(,/.-,,10.1-.++/+-*--/5401.4.032458@5639;?74=A636029;R<=ATC75=>>89889:989O>>HE=>@D@;=BD=GILCBFDAE?;=?BFA99;38?QHCNgP^G@9A>?:84./,*/,..1@96,2++'%1(*.>!$D)$%'*?W '!)%"0"#!,%'!##"#!('+$ "!##%,0/50@TN65984==;8B:8=<:;66;BAA@A:D8@>@?BEIED@@@A@D@?HH?;8:=A:JAK[bSF=L=JIG@:8B3//5/',G6+@@0(((/-$%$#%!07 ""! //1)%"#"4&% "#/"#  '""5#%"'$ &)$$#'+*&9ANVJIF;.9623/*0/7.)-+#)'-(*--*-2-59.*0/3-/...+-*;/1.+-..1-0/-.022/3,/.712389j@<9B=844-9411F:66@=C853638@A:B:987:867DDCAE:685?A?CPPCBAAACDEFKA@CA@B@@:G^_QiPAF>8BD97:7:KZ@>:744DCLJELLHTHBMJ[BN75841512-->35H;93)"##$#$$NI,G2-$%/ *$IF8!"G(&F$!#'##'#,'%#%&)(+)&4?HjaM6;6P?+(/0-:/5,.'*&/=8-,,17D730482-1535644B797H>8D>8B?835874412/969E?9>85DUQ:640<4413696>;=56B>>26D:F@F:7<;>9977>>=<@7::::@?HLHM>?@9C413411447:;G656<.0/61166?586BG:>:D9\?CN;==A;<<98B@><;;@?@=IEDGHNB?FAEF?DBQG?@>DZJJMEHGM^iaQOG:658540.+0-/T\3,$+&,%%" !/'$1$#("#!6% $&!"#$!!7!21+! $$!% +"")##&)2%&$%)&"#44?VsaXC5;6<74812-+-4B0/4.305541-.-333BA>8987694<9>=:Z=8<859=;654<554368323369452?B;4]JA750436/547:B<;:FB;56878285i=8:;:634H2412AE62;9<>H:79=<5=<@BJEEJHDBAGEEB;AGGGD@?@:9<;9:9?7;@758:95W87568=6=@>@5976465120.48RP=?3233-50157IFADB94<9:8=@547S:45=JFTJ]bN@G@=BEC@C??IES9>;7,0FCQZ[xQQQB>H852/..,-',.&*3*( &$%!"(%!'!!"++-$*'276!!!'$ +""##$!% "$$"#".'4-:@PL;@VQA3439F75347322;)-/10,*9;72355A<@AD7?B;:@:@@557;;;7789>BC><896:9B=;=888586241198G;Co=02C.1217;98AR1049:OCH6=?:>DCCB=DLGHCB62/33?er^VEHH;793@2-*)'%))(-+'(*# %'&)$ !""%(*$0F**$ $($ )*! "4/!)*4'(&#! !$#'+,((0=,:4KXCQ:H??E<9305502.1+0.32/3355;>YD>=?B@;6;=?;=B@:>;848?<86997547948<:>@:899:245@L6<>5:A;4::=E`993LDY?018;68T7:cFDCDEBCAC=?@@FCCELeM[;/+0/0beyhSF;H93433)6+)(0$&-+-#,')''%$&##%'//*R6)$$& -) (%$4.<$"&$) :%!$)-# .'&3*$'(%*/'.9G]A986[@?U6795487745388<6;DA<:=B=><>C>:ED>FA@@A@>>BABB<:<;<74Q6<5887=78<7AH@UD9;67;62445;@;A5;=C9<;;7415:6.-'*$+4#")(3((,)&%%"$$*# #%&5;K32)$+ ! '( (I:"!$%#,$"!.-)##  #&0("%+)$)(,7??G_:778B9K84>D21543@659=AC@BD>CDAGDF=><==>BBHDNKBHBHLB=@EMC>B@;>;:;4377557<:<:>9FEO8E89;:F3769569>8><7=H=/17;6@<6ND:7:6;<49?BDA?D@FLCEDIAGAGM@49@1??EaHFPgOPFA:>;341+P1*2**')()-*(%1%'(380%$%&''O~7&+#% * -'9$9#* ##""'7>421*"" ')&/%*'*(%((++)/.//33G`[8E;9<661:7=9@K:>==;=:>8778:7<6759=H=:;?IEDE9:3:;[QB7=;6?J992@36:;9;99?D>>=>>@I97I?BA=BG@EAI;768?385;G>=<;EACDDGDAGDMLSJRJI[HiOGKGQNLNJSOQIUOUWIABDFE>GAD>BC======>@7957=FAA<:;CAC7<:=>MU==;;=A=;66?:?69<6;?><8@BCB@=;6:9:;>FF@=>D?=C>@EDJHDIXNG[Ur`NLTGNGNSPORQDGHFHPNJDHLKGFABAA?B>?=?EADC<=:9CH\NDCC>A?=;:EFDG>>@8:9Q;@8><;F=LKDZlBAF@DLR=8?B9BF=BC=5908-.9-**+/+((#%%%!''(?,{B" "05%%#1"#!(.)$ !!!!#!13)3$,)0%#.'&#"$ (%/-572<<@MHF<:AC;@KH?<:??]D?N7=9DCDFKEKKLSLgWCABQLNMVQKNcHLKGCEQBA?HPTLJFGGD?BBLEACJHGAB<>?I@<=JIBD@>FEPOWGLHIKFF@?=<(08859EGKFA:<9:2/1>14/.))('.&! !$%031<(#!!%.-$ G##)9 !"%#$O/4&)($$&=@(),&#&)*%*,.@;36=CJJ>_[OEA=99A@DAGO?CECACAXPjN]NWPJMKLMOYXOPTNPKRJB?CLLOCJQVQWJdTJPEGFDGIGKRIHEHBGFGGIGJFEHIKIMEDAFHJ=>;@<<9CB;@A??DRODCGS>;86EKFCAA>BKMKGTGHJCIB@AG("8C?9=HD@D>>;?4/6642?))+7'('$&#%$ '%%+:U)&+"%#!("%)) @''(6#'  $5#!+)(.R(''.%"$()($2;=Y557@C>HI:==?DBDRRPD@BDULEL\LRGMMNIOTUQR^TQKNMQN=:J]fFFPU\YSOPISQSLHIENLOEJFFJKGIHMOTMQIMGPFHSC?THDJ;9<:?A;KE=A=C>CBA@>@??=?>YMECKMgkHDAGELLT\h]MNdSJfZZ[UPOPNVWQMU[Wea_\\hlZ`\U\ZTPJKFLOLTKGLDJRKLKTNRSONOGMEHVR@EKRIC@CBDBCH>=A>CC=HCA@\EBCKHHLI\TJB<;:G?=@WB7==GEDAB?BA?FJ=9:FEIHHKDEJFEELFGIEECL<5/;;FRIGTBDB<33624-01-&/$((('#$#$%#)***&&#" "  ''!5$!&$%#$%*)"!!'#!& %/'B@-*769@A>EA@EFT_>8;=A?F@BCF=FAKCKEHF>RZ~\TXjY\[e_Z[dYaW[ROWMMONVW[b`Z][[iinm`T\\X^VPJONPUS[SMGHKPJ^QKKPRJHKILJNE@89?NJBBJCGKI@@?C>@B<@B@>>@;ADUHDOLI>A@FFFESJJQxECND9--:?AQKIFG@9101813O00(,%*%(%-&($&F&()+-#((##!,"&! $A!'#!"!' ) ",#"" !#!#$&$"$(.15+134.55OG;69<=GbVB=AHFCDNLJGFNLMBABEB@HBBDLD>B9L>IKB?;A3+21/0,5?D:;1659ADQP@9>QCEPeKFUDREIRGJMXUpöupzmzx_V]eie_Q_iis`^^VRoote]~of__fhc_YUVUaXUWdYSRRSPSLOWKJ;:FLINJJIEMTNIFGFOLJDFGIH@BGBAFDBEVJ@BFEB=CK=?@CECIJIIEFGF<0@NEGIENIROA26B=8237.-%*-&)(%-$!%#!!%(((#*&"#%'% ""% (+!#%/A)'"-&&'",*.51&(06,.,-3<,1:Z87358301353779BB[xLITFFIFIGIKN`imochȅalhhhUT_TUWfVjqje\LPcfj_cb{ytznrjeaa^e[ZXZ\]\`^ZSRTROTO?:7FNRYVPQLuiPEGH\LLLaNJHHCC=GDEFF847>KOJDF?DC==3/,0-/'(+'&+&&&("(##(+-'@"!###* A%#$($#3$($#$#5+#$-!'+%.*9./.<)/44000-24-24==@?;:2:78@B?DDB>CGDCGBFKKHPfd~pqoe`pzbh}l]b]YTa_YWPZ]\b_WX]kci}xrc`mfpnnvlnn|p[aikioa\]\YVSTSYVTEFIMNTTUNUVYMIOPjUR[VMINLFCQIGIB<=1AZFGEK?PQWViSX\igzssbefh[_[UO]KOQWPR[W[ngkieyxzhcZmdcgiinnsdUU^faa\``VUTX^]YWRJQORQRQWi`X]GKOi^RRTXQKLJ@AGJHQE=<>EFLIGE?>?>CB:431/,00(#(('&),($'$/%"%$"$# #"'%!#-""'Cc%!',5;@:>'%-&"!##'(4.-+.,*)+1-*,7/4188@:5E=89=@EQDDBAF<9;BQWFINLMKMRMLNp-0:A>@BQIC@??F=?:E74504(%/+%&&'&+)()+(#"6"#%(&#&* $#'$#*768:suR,)*&#8Ak"%,C-,1(.8%263765??O@67>:=G?I=8:AD9?>98:?ShQLQMKKKRSYMKUY`\Y_Xa_\]TVcXVVUTU[P`ea]agvgUceouefjhf^igcb\jide]Z[Z`_\c\]`dbcd[[[WSVXZ[h[W]lWVXVLQQRMKG>EIFNPM9@Q>7CO^rTTU=DILEB?D:A=A;K>18*+-"(!#%&,.3*),)$""$"#!#'8($5(#!%-"!/H2+7cJ(&) %-=s'+25,62=(304F155E=?BKbUuE?A:BGDNLKMNPGE9664,8@BGE>@A=E?>;;e@8-'(%''''%*&+=-,')$#$&"$&$'7 #$#-&*)$Q:3?9)%-+'#*##@+0+/816073/57D5P;69;NP<>?@ONNF@<@=;8:98A=1<=AMgXIKJLCB?GHIIMRLSNJO<*0,5CHG?ELBDFR>;<=72,+*%$'9$&#+'/'&$##,$%#%&* " &$'G-'!(F:,%2+%$$$(1A,-'(/,/0+.53276=IC6:JIKB<89Q^UA@C<;959HX>E;6==CIIFPNcqXSHPW^SQeQVZ[W_VRPSUWXYILX\R\bqeg\b``cjelsgehndhjqnjlmi`_ckg\X\c[\]bba`_]b]]ab^]\UYY]ZSUPOPTQVRJNKKKJDDBBBCNJWKLGKGA>GHHKLMQJMJ^WI8C2DGIKEBCEKB>==97=40**'&%-+-(>&$%"$#$%&$ %(#%% "" #'%!'+!*'/0,')*'&+.0+12,2-,-*'.0?HM@=ED?=@9;:<87::DE<<038HQ;HINNEHLLFKY[Q^YYVJTUL`Z\\Y[VWRNQSUSZ_FTXSQdc_bc`]__uegutlgdderfihhttiecbea`_ZYZWZZ^[YZ[Ya\^b_^^^WXZWWTYPMTVRNLMMKKONMHCCA>>BJMDDB?@DDDIMNJLLHOO?6@54EOP@EDCB;=;;;A@Z2-3/&&*')+)*,+7"+$$%16?1 ##+#!&("''"&++,-"+9*',3,*17*+**)-57?DMIH=<:AKUMQJPLEWPD@HB/PZ\JCPGCB=@=A==6+).),5/(*(*'+*&'$. "%$J'!#($#')( !)! (%6.-*)))*(+&L+1+1-/69=569:I79E?:8>L:B;5>B;:7:>39GR@APTXLPHFDIMW{d\Z]ISQRUQYRG]MMDTKLQQICJGO[`ddccb\Xbjdtcejhjnhbflgjqqrlxssumneabdh\^\a__e`^X[Y]jc``cc]][YVWWSPNROIHJIHQ_PMKKIB9GNPIMJLLYSMC>K0?CIJ\DFBCC==8:33,*.*(*.."&#&&'0,## '2$ $#(')&&'$"+1*B$"&#F)*++'-'+A))..149:6C8?HH[SJNO[NDGFKZp\YWa\ZRYSV_WLUMBADIFJXMHFLS]fb^_ced_ee_b`eptnjtcdfjkmkstv{tqphjljibbZ\^^_b``Z[^_ed`^g]^[\U\VTUZSQKMKHJIKILMLR]><=NCB@><;?CTJMNNQXWKFB@<5BEAEAEBBAC8499/-,0(,)+((%)&+-+%5/'"''('%'#,,%"#'&)&&&$%'%<+(*=+/%&,)',533<86CMSavUG9>@CMAEB<>8;@<476=CG@XNQSJV^OQIMMNUVTJQZj\]faROOPIBCEA?:81?DLOPOTRONIA7786?--*>/.(%%*%"&&%$"&(%!#%)*-,0A"%%#1&<5#$((*&*,2+4*'#')(..06F;95:>`aEZF@;IO_HF;;<^V9;5648;AJQLRIIGHUQCJLPPNGSTXfeiwRLO^PFC?GGELMR]WYVc\\_okfsebjnffvttmpmomgiix}v}wopwww|wolqkhdfcfd__aaehdcaa]]\\[ZW^]VNEQ\ZVVQTNQQLJG=?BE;8397CJJJKPQUHEBGFGWNDECC?MGF>830//1+-2+1%! &$"##$($&##"'')*-)*&!&$(." $&()"(-G)%($%("/40>OF9;92528:MIFCEBGJHNNGJFVUOLHH:BBegYRV[QMQROIQRSZ]aZ_[]`a][c`}ngfdgjqokecgilzxwjmqru}w{xvz}okghjkccljgfknen^`[bfb]YZLEOVUTQPPUQOMFEGHIG=5.;@INKLLONEGHLOMA=KGA?AFAKBAH44;3,.)5--,1*1.(&)A=/+&'(&%'&(17/,/+#%$$%%)-&*/)'''2+.4.637539:8CDJULBG?GFq]FFIBM=HD@FEGSOHDFI^dINOSLRQMMQSQP]SWSMHOO^WRXXg`Y]gjpubhljzwoh{wm[S\Z[ekxvxmljn}wzkur{wrpthbfuaibginm|yuhki]VS`TOVQ[XSZWX]SQEHNMKH@4IMKMOWQSLIDNLGGB:>6?<-()-0,+,'/0-.**,&%*()&*()'-)#03*)*)%-#+).+('',*,4+5;793HFKgQBYDGNBDLDEMHXC9<<9:EEB:9JSGIKGUJb?EHRl\UN`bWTNO_ZNNPOOHGEQU^VVSZ[_a]bifhgqikprr{gTQWhqrs}voyvvz|}{x{yupqjgi|}ldbgk|ygje]Y[ZOS^ZWY]YUSTQPHJSFD8POGDJILKLLGA>NQKXahXYYJGOUDKONC?<5/./0.(+*',1,*)+0Q?A)(&%.('))>R&'"&(+.-$)'#'#((+/-5L6?>WJQ}]HLC<>I@;:?APRU?;IE7BA@>@DEHGHPPOXIMReXhTVTRYVHOOS`IECBITIUVSOSVXf`\XUr}kaw]\`\_cnnlmj^`gptxnqu{spnnokbegdnzllje\\VXQPXcXUUWVTOSIHJIMK\KGLIPLJNUD31:=<5T_`]SZg\XMECDEZGM@?D95=1/-)114-*.'*-0/D87EBoayvXVU]eZ_]\WqpQOVaaRUKHMOHKOB<8CO~yfbdgklaapW[TVRJONOLLJOGC;BEGIJHSU[Y]aef_^g`abhufiwopvrpoemtsvsp~vopszxxwzslnqs|q{|wmhcL@CIQT]\XTOPKVb[ONOQM>;GGKELQQ\aXREOJOLHMJIJHO>;<89A@650,,+-6)*/-H8<.-42F4.3@0')*'(-*,,2/320'):'/05NJLpgsibYjxaHHEBBCM99>BQzv|znwnr~bYZdOHTOOPNJHCN;=FJPGMSSSU^\iec^`j]`gmursu{z~xyqrrsyzu~~pqsz}{~ty{sorzyzrwrln[KHRUT[bgUK@ESZpUHHJ@?FGILIIKM[T]TM@.9EKJNQGMHA<7IP9:9741.----.2/.'-:148-HG.*b4)+(1%*9D//(4)+''/1+46HA@cn\khim|GQCC>?V@@@@?Nwb[^^TWPKMOPMMLPKZIMJONNRRVWa\[eeabgjjixtxx~{{sy}yxjsntuzszzxxnzurzywuotcRXVcXZ]]SRRESYy_UM@FCMKIKI]VUiUULH4-?HQUU\TJO54/+,+/.30.0/2A16K,,-)-3.(',.-+/05'**-)+*(0)KOCPNXe{mf`_cfNJeMQA=AICBINL[l]_^RMOOQPNMR_euGVHMJNMNMTXXWdhhinvxmmvx~zŧw|{~ujv~yx{{|r|ztns|e\^^ZTZUUQNCKHWwQMIMFCFIPPR_VXS_\NYiGNTZNIFIFDQAX~l:324/,+/422+.,22i:39,)()-23+.3+-,+..*0+-,/2-136RH@YDLujaETFTTXGHFFBB=?CJKT\}ȿ̙zkjh]VPKMMMIRPPh\A@BFIOLCRa_`d]gek_sy~zq~u~yytuplszk^[USRU\XMP\WGNYNKEB=DABOP\[_^]ZPGKnaRRQTIRCFHDA;@F3.102A91)40),/*4E?A8.(5238;35L55301403--/,.B048FG<>EjlJEFCJBFONJBHB=?DDEN[fy๞{n[]TPNLQIENXWvWILMOKQPTZ\_ggbe`ilq}vwv|}{y~~~yylnnmhhusq\_Rd]]d[CV_LHNOOK<;=;HBFMP\e]ZWU]eTUMNTNIFCBJ?<<:=>4112E:2:++-/2:EFAD-(%1F94.102640,-222.//..28B@FNOJSxJHAIHCPLUMK>=PG?ACKP]ixh\TRRNMICFJ]^FOaRTQWU\X\d``e[_fhop~wr{wy~|}}q}|xvuwuoupvlni[[^]``\ZQUG=KYTKKD?=8?DGJSS]ZWVcfldIWOKRGA@EFBB@99=6628<683)*/-5;PETj6,),]5/211/183*+013+++.?4067EDFEAFCLDANTWRUq@<>Z>=@CDOZbzɸ~i`\XRKCBCBF=5>??KLMSXTW[`ruo[OzLKB@BIPEB988?R3<1:9>C25*,6:IcyP2(*/104,2)+11.,5-.,.+26@/<01A@L[D=EOJJII]HFI96<@>9>CENZawжn_Z\RJADB?:4YHSVbZ]klliockffljdcm|rx~}ymkop}rztxzpljr~|ohe]\_^\Z\V^R\^YXWOPDHDCFIJMTYW[fghagmfMID@A_LVD?<:8K4527?807,1C5=69IaT1%-+4202)1%)(*10+*+/4-056-9GIFHH=Q\]\ijnipogmrnhptpsp~twzzptykosy~{|y|up|wlvrqtllhchdZaaaZ]WUXWXTRPIHIFHLHMyWaY[b^^S[|PB?EChUGAEHG;577=4,7=>N7:277F6T5D/--42A2*0$'&*&(+(+/+30.7=Fc:H?EABM@C<::@99577699@>EEQYdrԼpmi`XJDJKKE@LPS[]_fvv}mo}oeopk|}wy}rmjlx}{ts{}}|tdtv|vnfdki\]`e\fYUVT]YXYIEJGIFKRYSWZ`fmaW\QQD@?>OFIBALA?Ds;:17;:8<1E:99Q?52.1@?:=E626J=9:??HPWVfϺda]TLGKS[MLQRSRYbbgs|xphewzr{yy}umjv}}|wz}~s{x|vegxeVaaY[]\YXW]tUTQ?KLLLKTTRYaethd[Z?35-8?:A>3:;5'(%%(&&(3,-.1.::=B687EEB=?MC:=:K20,5>784::DMLODFBB?33/5:5139:=64<4/-:BII:7AAC%*!$(%''$+.-4+4:=>@:BIR:8401521A1+-/;674<@LHKTv|͸ymg]_SQKPUSSQRYV^vzrvu~zuup~zywqyxz}~xuixo̞ux}y}vqfag~i^hhd[[]^\YcToGCCHINPO`Xlqimsp`[G>:EGC:>;<53,3,,00000/>>9D>WDD8<412H&*( !#&'(,/10139<:73>=;8735.,+03336/6?89:>KGVXS`udOQKPMVTSR_Zegjr||s||w}}rhju~swvzyotwd_Yecf`[[[WVVSUVI<@YXNNUXVl|le`~yKAAC>?DFCBCE96992-0-.21*/;QBMCT8?0.D^&!'"")%'),1/.26A8;867EE83340-444446772847CB]SPEl}q^XQGOWT[jjkoqeq}~vv|y~qkonryt~k`}xzxqlnpttjgbQV`gmVQ[Z\_]XWIDD@KXROJT_gnhdd`mdW@AC7:D@55%,<951.4;KvwHIlQ?31-1<##($,&'*,...++.35;8=9=5575<15?U71046d;5677A=2:EBjFGACI<:>,130<034>X_lIvP8745@C%&'5/*,*+-,/20-077<9;;F9310/81510,060;558PfDB?PPMOPZZVYYTkZwaIGF^VW[msfd^ihutwxwxntwppsoyvv}~uy{k{io{tmsqtvceSPionrl]dbqsa`SMQCOPRUUHX_Z\nfd_feGKL?=H<:69FK@D;>;3552/.3:7CV_VwKLyU=/3362#"!'/'+*,-2-2=50458;6:3;24303-,.06396270HY<=?JHEJLJTWS^eeld\{VSYcYeirpepbmpu{zvwvrqrtjrwzyw|~z|{axs`ntvtpthgf[[dlospc\aZa[]UMPPTmIP|IOTbgsjll_QeJ=<>E=?=9?>@A>;750138<;59@ECE2S[VBO??@:%#'('()+%'@TP>7=53@4?A6789/0++/,--11/38OQ<=@HE@IJJLXTX\fkpmhbwri`^gjx~{vmr|z~|wrznh][]jmn|~}~s{{w{xwrsvtqsndha_kolkdf_dc\ZVKQW^{uIPPSShpdk{{jMJIBAICA@8=J?=??:15,7+3R728B\oSWMOQEorB<6"!"$'(-*.,HYE@>67432884142/+2,,,.-46.3OJ989FB<@;BU]YV^ovzleg}hpmwrwxssw}xrf`Z__qnx{{rw{l|~~}v{upq~kenfailqejineeX]ZW\Zn~_bMRYboig__XS:MQKA@=DG78:=54;C8=653272;5/.>GNa@2/8:=GF=BE5.+$&$&(,*,2/6GQ>>67;77=X=.-+,,*',4033FA327A634:=CR[^`htdsele~zp{sk{tzuoqwsw~zsuy}ns~v}{odotpgadbhrwnfklptr_]LUZY[dyu_\FGHNKG[ipZ3IibPLEE><59;8DA48362447:/9>D[H9+/.569?4=]B(! !(%&'JI5IQt?82BA30334,,,-*+(,,//>4553<5359O]A9:A?;881154/2+1*)&),05/,+563:<;A8>EPP\cag»mblj`kst{phmkmqpuzuuŸwz}ghi~|~}~y}}zopowninnorw~oof~wxz^m^aSYVPRZd\TL4;CIKQ]VINNFFLJBB<;==;97:7775;96?LCMAHSD9L2412,...(+2#*)%1.494EL<@[@B\BC.238+3,.)-/++09.--2?6347=<9MCPQ_ap~^Yf\aalr}jo{}zxqil}uy~lf{kwy~~~vspiiwqwwprqugw{zqo[`URP_\^VLB34;DBCP[UUbOCEGI<4986:7;;;98A7;JHB>EBFKU^0-/*-20,.+/+=".3*+(3;840;:BGQ;;;B211+0+,*,&)19..,*024/.042>??ET\WgmrZOWLaelnoqlppkmrw`Ia|vvv}zng}mn|{fs|~xx|}vlfwwpuyxwo{tlsf^bZjtnTN156043:?cOYOQ_I9;8/;@=?;6<9B?>?GQIS`^ZGQldlo|wzlidek~pts_SNcest|wv}wsjxuwwxmwln{}w}~ztgxzutrlpyztmnojtvokspjc]Z]fUIOF=:938AIOUVRSZS;44<>@@BF@=>GA?8=?>-18Db<;?67.1344-/'%#+)';%7630*.-*.19C94D@8S;3[.@112,+5+-,-0/(.4011>QCESKFP_\^a}Zrmr{zsleadooph]rtn_e|y|ryz~zvqn~op||vphn|yu}z~r}{ytk`rx}{uupqhihkrsjisi`X]\_XJGEJAAEGTILUWWURI67ICA@C89D=;8?@>@9206>EJE7-43*()-$B)*(!&N4*',457/20=F67CZ=9?=J:G4/5&&*),=.+,0+/=8"/M,&(15242>6HJ>G^D=H?UA-*46''-+)+*'.+22ABD=NJJKMX``ab^L`X\wrnjigf^\d`]mqkq~nrmqtrtpwqiic`kpvx|}tikdyzu}{v{ziweallzwvvjipfiywztaa^VSVRKEACJOS`LKPWflO>?RFFLGHG<:?FCjKGSCGJ?@GC\G84:766>?4-''*%*,)#+3I,.40/32>8DHS=:?9A?>5811+'+*)++)-./2;9DEHFNJJQUXd`XOTVogiujc_X]SVbZ_bklf~vlkoqssqqqoj[ghqxv}ztsuvxz¿}xi{{v}yy{zv|vkdiip|vkcVSTRRCOAHBQHMWVUNZyYNFAKFCJHL:9;B>QnOpMJHAB>UA\@<5/4205.(')-.1%+ '-$?B7+-<63/7BAIK?CVS:741//1..().-@6346FCEHKNOQQPQPUPMPCHftmkndoZS\k]^dj[c`flmmyvn~pom_\hjw{r|xu|~~yov¿}t~vnn|z~|~wr~fsrq{swtiy[POF<;=DE=AELONRRVUUTE9FCLcQH@8AIBrsRJDEEB9H>BDA972-E/,)('&%&*(#&%&$&95././741:@@?FD`E93E02-)+.3202:;8=ARJLHMNRQU`WRJYXJUOttw|ac^V]hb^`__^kjlwminkvtm]Z]demqx~~{|}|tx|}xv~}y{z{xsy~tsqqyxqnd\lC899ADBEWIGIKIJJNQF0:HWWOIC;IDYSHSXMDD@?CDGF5JB736**%''%(*)&&'(("),D>*-58N5:;:<@Iqb=C81.+-+11355?>EQDGFKOOSQTcX\WU]_nwokkei|ddfpjiefilihgciirqlide`oqpu~vyyrzuwy|{tqy~|z}~|xwzws~zqruqkbXLCK@89>AMOPHBHKMJGF@';LYPLNFKITeMFPBEFB>LEHU74:7;B0.-+*)%&&%$#*(#&)05F20AHU;FG?@A]9;:E22.*+*14<8@FNNHANDHHJNSTYWYZUXuv{luga`cdjdm`msmoebhhrnnmdeesppmtor}vumtz{{{~ynuxÿyx~xtyzz{oxxppwtvu]RMNQLABFDOGIAFKQJIL?29DGKKSJDIEPtHBMSI;>:EFQL6:J40.,/.5,%#+'""*+%#"&6-6N9OAD;E7<8-++,45:YWG?FADGNpRHMOOY[T]`kmr|yehwb^lmoipi|ginlshr}oqnpd_qqpngv}|}{qx{xvxyzruzulmprz{ldYVMQKLC?BEFAAHLLMKSPH:NHVQUKDCFCMKG?HQB?A@ABBHMNTNIHP[dea\`olsppghrt[[h`fej|xujlhkonkoxuostgtimjxzvuuyÿwxs{vunpnoqs|xqkdZSNOLJJ=AGCHSKOPNQR[MHQUXhTK?C@>769DIEfNE=630K,+4,,*)0l=;;BE?DQ\RUZWgmun^qky{uc_^\[\``]^`]^p{egekiprqkqprifirnpsw|{pxz{~wrpsxytspppxlh_YRQQJE?HAA@BFLHLSRNECRU[cUMCHIAAC62?@LCQ]eN>E<9:62-3.,*'"$&$!!(*+4.3?B>=MaiFCJb=4/90-+',(+./--?P:DBPONQN__hv{vxlk\]UTRXZZ^Z\]`qjfcmidclu}ubgpjpp{xxdjYex|¼xzvvstu}yzoqnuroec\XSPMLOUJ>AFBFGIUQYOC7LTbZSEFIJ=?6999=9=@?ADAEMDWOXpN;3@2'%/21/)4('##(%#--,.:9JNlZUIOBEF?14--,(%$+*110767UGFFRMNZi\da}yxnv|xng__\TN[[a`ucgbbfedg^hs|rsvsriovzzx}{}ntt}ýrzs|zjqqsv~{ijnq}nmhd`_acSTQIHDIPDDE=DHKMP?;TSZTSMIDC>@??ADBADU8KHUzC480,,,0A8+'$&!7$(,*26EYgvDHN?A?LG5-.1*%#+,/0--.>?{GBJKNOV_Wg^p~shVbtyvha\\\TY\eihihw[ogxgefkyppscmust{trry~qľrtrusyz|vgip~mldf_hl[^UMMMPPK@960@KLKGGCLNSPMUSEB??AMLTPKNGG8NGht??+4/5(*4,&"%&#!$8E-?038?cxhgP:;LE=73.+)'%'(<+*5365>DICGWMYPUXxJ]|YNXWhwfb`_]ycd]fewjmkeecfokdf{\fvsupos|qrzrv|sn|¿|stx{stz~znjlokiaku^]\MCF[EB@809AHMNER>GKRTP[M[E:;;HeWMaaG?>CJLC93..7.K4,("#+6"&#*4/?82EDaWJHG4:JDB9:/)@.,&++,)65F4;:C>LMMIMh|Nbu}QDlbbfdda]fwb`d`oabql`mljhiheFdeqsnkttsuw~mq}½~vrrxyu~zwrupuvmopf`gdVSUFCAI==>=:>FJLLI3..*'%&(&!! '!*9/2<+,F,)**!#!% "%&2gXJPPPW;8989<7B55mK)&)(>2;>=:B>TXSOERKXadi{]OIP]hgfwcjflthV^c\[gc`eikqpvwo|ztlhZbmnlqtyxs_hqzxz~zĿzwvsv}}u{uuqy|sdaYXUSGEEFO@<9@ETPB@FG7LIVkuNJJNJMD>HRLPPPOO[GHHN52+,-&)"#&)% !" !!8/nStD^I<;8244,7?59E*-(+/;TKB=MH;IjUEOY]ndjwz_XYVhgniuiZ_j\ZNGTapg_insnvyvnphUhqqnnuy|~f`mn}zþ~unu}{uqz|{qsknoh^X^YUVKFFIHA?;@?HABKPeGNUS_[QKVOCUFHEGHMNT[kYVSFJ.0(+/&"!#$$(#"!#!-26T~OA?8>>61089-0;-5-)+/0:M=Ew|[RRDMM`_db_nĀabidrhRT_rzqz]RYUWjiWeltoox{qzc^mrttvtuzqblzz{wlrsuqw~y{onne_\_RVRSGSCH:<@@:@ESUPHTQV[_^]KIEBIFL?CLWVpyZ]GF\T+)'+&%&$ ##,( "''<>0:a=3:C<:7:033F154/01)=]C=HZJ?ANFFW`^de{~iidjim}tyijfYkc[YVYffZb]e|mtyspsnlzyz|~ukwtmzĿwoqpihq~wonl{vw}~|hmbcYVLKGC<:B957A=9@LTQNGITW\``QIDIRH?C@Em^hpVYfexM1($" #!#'&%!?>4<231:434D3:72735A214)9=19aHFDITOKRP`bkiwzyhj`_[aqunmmrTSSWUUXU\^doY`[jtsuoyxrnlrux|wznpvnZy¼}{njq}~|lffoyuxttlk`mXWNFCAA9?8;=@:7EMSRRVMNd^emUKDHDC??BJ{dZ]W_YiZM3' ""(&#%($"$#9=340-325205169=5556;3>-,367AE?8@BOPMTPWSavf^o~onaU^]`fe{oizU^UIFPRZa[YZVckj}{qsUbqobr}|qgvfz~|tÿ|ur~sjden~{mceg[SX[SGNC9>5=@?6DMPNPKd\VZYZ_NLMC;BJ?EGJX]]MX;;4K,))$%($&($")$%2$!"@248C3081-0.'/8B:288:3-.*,/735:KGJZEE^kWT^eajlb_][a_w\drryvbgsNQR]VYg^ijgilqlY^pwisqox~a~u½sysv~vjskzpmocUP`cPIBW@=?A539DOPSYYN\QTYYQMIDBDB=CMLAO]lQC=:69,)1''+1)),(&!(""$"I_9A93..1/..+15.220/1*0/.86:.5@@?@?NFABOTWEO=7(/43/,)&&&)&%7!! ;FEB01.-1/;5103.061''3.:169_AA>DUDCMWOJUXerj^hfg_[leboeirJX]NVecYVXY\_eaasxg]W_k`f}jirkqijoxqr~vpppqu~x|lyroyy{togz]bqmRNCNVG@>:?GCEG@CLShME5P<'.1*.,%%(#$%% #1;FG8655@469-+/.0-'$&/36>09IA9=?AEIHQQLMZ[b\W^_eg^gik|inc89HHVX\\[gVYhdeifqb`S^ahdyeoyxrjlwo_y~sikeu}~xlruqs{umh^\XX\L@>FDDG>HEP[V\[\^ci}eb]WJWaE<>?BADR=8.0N@@0/-)'*(&')%$%%# !*$ :@L715125513603B;%(&).068W9885;:CISQVOXV`^`qpi]ehlwwp`QVIRWcZXYb^]ZNNTckhU[[`ajtu~xnh}uh~¿~ngbiu|uuztszor}vokaWV_QLZF>>;>AGMOPQXZX^`Zic]Q=;AMQNDGC<@@:@R1-6431,-0+.))+'' $'."!#"rLO68P0.14F652*/+,/(21417B668:BDMITUW\c^eb_dkX_``ngn[^GGXymX`i`[_`abX`hecm_calwz}~~xju~smrrjt|{}|u}}xxpxmfg_Z_]TZJA?@@C>>783,,.+,)&-,("$""$&%%#! tW@6F>/*)J80.?)''/2(-13.;488;ACCE]Z[VXXde^`[`gZhgpws]jQHS[XQWc]Z\g_d`sac\]b^[_tvpt}{tbzv¿~xxqnjvyyqlru{zuyxxqjfccas\QPIGCBGKQLYW\bafhTSPTRPOKOMRGLA;=JPD88:.-,.++)$%%%)&!" "!(-!#" ?B65/-++-B32-3.(4-(-,/9/.;AA:36;=>ADJWRYY[cklXXTRZ_ckgkeZRHFR[LTbZal\WXX[ZY[\NWb\_ltqtlc|r|yjipvuyrxxz}}}{qnncs|l_VTHI?A9,(&$>-1.93>:94<;AEYMSd[SaZ_[RRNQ\]be_[^[`\qbOWXY^[Z]g`XRTY~[Z\\cltzu}|w|{pkuxwu~~wws|urmlopcPNPRFCCJFOL[Or\[XUW\VSTPRPPOZPHHHHVB:65202K+./*&/7((%#$&"" ! # '"# +@F5..-/((#/.40>98((.+%$)72308C9EC?EE\RnocVBGSNPc]WYchlcf`Ya\W`]YV`b]fVZRkba]]`XVipv~||{z|{yyy}vuxwz}xyyvy~nmvldY]jSZNGJKORT[X[Z[YYYYMFQRiSRRUQMVSOND;<95.-,-'(+)-.%!$%#'!+"$"/&&#&.24.3,/2*)%*/00/00/-<*&&&'1413?9V<BHSUak]^gi_Xge^[`iguqu}dzxzvv|wxzxz}~zztrsy{~udhbNKJ@A>KQViXXjdc\}]QZ_YTZO^lb`[SGYGHDQKTHD46+%$''(/&%$"0&94%!&''0)+%&%,?1//2,-+*.-/,05/+%'%--,+566A/.4DBLLZbaV[pa_YoiaaWY`Sw^QOUN=>?HGLjbbX`WXXY_s_admtuyۺz{tr~{y}}~|ywx}skv|zy`cdVJLACINR_WWX\W`dWVXZ][YURSbh^`aocKVUZGA;5I,6(&))&%!#'#-5(6&)(4NYE2+4'+8.-)+-+J+/.'(&"**#1'+57+.0380,2=NLL^xiZjpi^VclmdnlVYWgaOQQLCB;?KOHT^Z_XYQSVTTaiigojsy~Ӵvti~~~~yy~lwnwu||qmTNKIILMPQLN][WYX]_[Y[baaV_bhbwj[JJG@=4<40(')'"%'*+'-)#)((,-5c43720,49>2(%70*)*--)7$&%&*.-***.5115C754G?E]eYyrSXljfXRTZ]SRMMLOC>;@CGKVPUZ`VVIGSQSgma[iq{{rzx{}{irx|volptwxx|ozc[UDEIRKOVNSQPYVUe]nm_\vs^]_^Yo_JGAE@=443-/-"&'++)$$(((()&b-/8+<=M99JJ=4*'*')%"*(;%('*'&*),126.101/<=;HC?E\b[ŁOL_hgYQXUMUQPIIFJ>@=ACFFLTVj[SOLNRRWci`\nrqmuy|uxt{{moovnwxy~ke_dXSJDGO[JUNXUNVWWR]beg^c]`gfpjOF\HECA@?M3/051*)().FL)+(&(*/&*&,.++-R2QP04/.+***,.='""'(-/&&0#4713.3.3G56XDBIRVecjPT[ddnOKSLLOOCJGIFHCFFVHHKMOUXTGMYRMUZ^_Xlh{p}zzlpme~tvzs}vs|pkpswr}wn}qYZTUJQLEGRXOKQLRXTTO]fju`[fe__j]TOEBDCA=:9:540-+()-(%^7/*-3('%"-&%&$$&?150-4,((&.+&("$+9&)-+%(%%4/3,//86@GFJLePYRZTWQWSY_c`c^aab^gkXIN`I<;::7;932-)%&))*+X6)(-((+$'+*'+.*3VF+*%2)'),'*&(#%'0&#!E%/6,'+5-3/F?DMOH{[H[HNU]ruj`VSkPPYT]GIXmJ38]WEMBKF=H`ahacYQTOMQYOHNJ@@>?GHICJKNOSSROD5.FLdT__SSnuj[cjxcqgZfw|o~~uvporqv~txfj`XOQKFDaWNNSU^^ZVWOLPYYYZ_q`^d__akU`CF=9?76728;00+-&$&&'$!$&..(1)-.&8$&'0('#)&,3.%$&$&#''(-%(# #!'*+G0+06694IBKB;>;;EMrai_]QNQPMKHMEG@7DGF@EqBPJTSZLHHVADP^rwa`dmyrbi|wvupwv_m`df{nj}~||vsy}v~||w{|yvih_UYRTQSNMZSSUUPORRU[W[YWZ]_aacd]aZPJC>FA=9=N1729G/.(-$)&##'0+-.-*')2G3*)*%))%*$$*3.+5,*.**+# $!" 0 '%..2*(-02388;BCUQMdg[kmnkgVTLMKMIIT>9A@EGDQGFDDLFJHGJFB:LGR_`aj{m\^cjvry{w}hsztpwvnuyyx{uvu{x|{xvuw}xqcSU\^TRQUQPR[VWPWUYbRJVZ\`]__ca_^h{MBACFA8:9?K2/6.0,)(%)("##$%#&,=+79->&++)+&%2+&'(3+1-)%%)3'(#$"!"-(",-4/-46.3344E;:F7M]begwibemvwvqzsuwyuvony{z~~{ossupzysvsuxoaaZWl\NO^ROM\VWRSXZ\VUSX[_^f^ca^YVgdI<=<:99886C@C0,-))&$&%&#$'(+,)&*--7-2T*,,#!24(0)''N-*&%>q.r'#$#"#$3/3,,2@0335:?;CQTNS[Zkqkf\[OFJCDFKH@>>FA?ADMECECJTLFEACABR`[\edleq{yx}rtux}qwwrtvy~~~{xrnsrvwzomqysna`[[\[^RNRTZUYXYYTXzcb\^Y\mfm\]cUSJFGFDT697497O{L.3++)+$&((),-0:(8*01UC2+5:2+$ D"'%"3$''(=F>)$# %*<*'.(7)/3039;=K;BIUSTZwiaX\\SSHUWOAG@;ABB??FIAECBBHEBD=>BQuWZ``narsuxrrjrlxrtxz{||}~}vssroxw|zriiolddXd\YR^QSUUWTZU[TUUb\URTYUZ_^[YZUMJFA?CAM><;77Aatw50+*'((+0$$,,((,91/2:F(+'8G%$!%"%%$!'19''$(# #)(+%!)#,959<467@NJZMSjtqb`aXdZBGNDPJCE?@FECCGQBFHHCH?B?ACEDHFOabhq{~wsstqnww~pus|~{~~}xxz{}zyrw{u{tsvnkekd\_`Y_}UOSYa^]]XTQOLTUOGP\`a_ab]ZTNHC@C;9?B@@>@?MUFB81-1*.&"&)$#&)/<05+178%+,% '" +**!#!$&!$!" )$-(+0N*'%"'77-1Y59EVJTVbbvtwud]LN>NROCIVD@@DB@HNDAEAKCHHEE?AAB=>Pf\gv~sxwsuxzyjqqjrrqs}~y}{|z}suwsxt{vnjkdelfaa\TTVONX\WbtZPOMNJOZT\ehgcb`Y[RNKA@?;AGAA>B>K@DDOQND?LIaUR8/1?+'(2'%$'''*+308;04(/$$"!$.(&!*(5$#$%!") #+14sn+,:-+/&,D/;EC=B;=HHL=mWNFA;41,**&*+&$%4d5)(,,+*53# /?)--%$)4!"%&$:O($$';0.".'" '"2@5;57?9HGIM@IQWfXLOLELED?LGDB=BBE_RP@IZ:?BBBEC>A=;CCSUc`iw|pl|w`x}wz|srz}y|}zywz}v|x{ykgfev^aa[]YXSOPOM\WRW\e]daaa_blggk_Z[|SHELCSBOZBB@Jm]TH8/3+,1-'+*2&*+,1/,+),,,,:/%-.&8$'.0.(6"#$1'1+&$(-)*0(-#*:!! "+3//5;9B9JOQmADYZlHFFOKJNKF:D?D?@>UYBUACJ?C@SKIB>GBECAXMV`xmrvt}tmiWow}x|zoi~vxyswtuu{{psnhfe\X\XVURPMSQRVOU]Zuwfbgc_^_jYVUTryLEHUBEDL^HVDVbA=A?251,2+')**/(()-8)'(-&)',&((31%%'%07$'0"%"):?6"3&76ZJ2#'!$"#%,131769=GOdW_\V[GMRQKJNTKH959CHBBBABCPB?EDNGIB@F>HA>OOe]}ylro_V_yW^mv{xxv|zqw|z{yvsy}{pspnnneb[`RYWUTW[SZXRSVQXaefeh`dw``a[TUOYNIDFDGXKQRPQMEB5;]C,+3*&%*)2(+)&.))')(*,%9'I-'&,V<)-J1%$2$!&'?'# 9'A[+!!#!4#:F5:56B=B]YN`a`_RYTTKYcNLT\DCD>@LEC?IaKND?I??=?DMPc|tovyoPX]b[OTgilmuu||x}~vxy{yyusoxqwpx{woftaaVVaWSONT^Uu^\YSQT][efiebbddje[f]QRFKFA=AC?CF@[JILA85,30-+('(0-('++',)(#$&&+&*.-(+$%.12%-;- !!$+(#%) !'C^*"=?0219E?SJNQRb[PPVYd`LYMTJJFB;>CDFXD>?>?E>@EIWKCFEDC?BHYr}{mbyt\_eeUIRboqiqsqlr}zx~}{yuqswx~uvukngke_dfcffaaSMKYYVNSUUU^]WUTQWY`hba_c^^[]a\[QMMF>H?@CFHE@9DMWD3./5-/+&*(./,*1**+8&&''''$&BJ*#&>1+/(#7+ %4)(" ##"%2%$*9/0X>B>FJOOTJPN]Z]gLHCBGJ=28?IDJ\G<ZNDC;DoFw1115:6.,++*/1-&-.,#%*&('.%#+JD)(+(:67#(5X) "$ " "&&$>,//<@NAHNHRPNPP\T]_QEPSLE73;=HE@@A=@CBDCDB<;;?=?@BKOSGJWqi]durw`JYZbcd`rvmxm^R_gzzy|~y}{oqrmtvs|tmsjiuwnem[c\d`eai[VVW\UUXROMOXb^fWiga`dibkifhp^XVUQONEB=EA?D@nIHL78=5283-B2B/29+.,(+*+#)('()&%;',&##&$*3&'+422')1#$" ">##&(+-+/75FI^GQIMVOPWZ^\]aTW@117A:>?I<==?AFJ>?;A?@?GEDC@BELWbxgptsysQJlrgan|plZK]`zsu~|yvxttyprmuqtqy}|vxvecmzg\Z`_`b]TVYVYZVZ`_eWRU\ZUY]bkiaegchd``]kUTHIDAGDB>EKJO<:@7633.111-+.++0*66-+';),)(&( $1&4$"%$#*)%*+1>'4 !!*6!6!'" & #*+C,;;;878?==>AJLA>>B=AABB?;FHSuWczchtuzrr_ZisoojwveSRT\espotv}|}mrqvtnipinfilsiwwkitbwc`^]]zcZ`WT\]g^\]X[VYVi\Xcbegfgddhce]\Z[WGEN<9DE@DDA342254--(-.0/+/+,1*-<.+'$()0%$3% #)!!#&"$,(,(&"5$& :c!#'+15LI815>CD=75=<:GN@IE8==AFwNNRUpljgjlD924*2@:>>;7<;>AA@=76<>AS::?;CQS^UTYgfvxuqcZP]vugl_npj^ccncfjc``spxq|vxsmrvqxzgi_qebT`\V`cn`_bUXY[Za\TY^kib`ab]]]\Yf[UTX\[addlreckjdVPNKKO:9;:7;;ArrD17847971/./-3,),.$+-10)=,$(-,'%"!!"!$*&+DP-+(+6+'0! $.$$.6569?A>BJMVRYdk^^k_T^Z:<52223:;6==A@BH@=D5@FLA<<<@DHVYY\pgwxqps}a]hexnhhhsXstpshg^_Y^}ptvpdisvvorsrqlskb_ZTWZoo~aXWUURc\a^W\^\][_h_hcZZSWQRMXY\Z`gcdriea^\TMGHHd=@;?8:EBHHL<;963.18570()++,,,'%(%'L'$$*)(&%$$##2)+RU)*'?2:), "$  $ /3.5A@DPBEM_UPOZ`ma^P_X@2..319a=A./6<>7@8599C@<9::;@HD>9@DEIORVMTOUghlkro]ehjfmljqljkvyrbebWQa]U_^ekbjbmhfhwxlxddda^U\b\ZYXVWf]``Z\bb_ffjhrdddgo]]fohcZ`obbaqfhWVPQFHCA?TD;>76:aG:KJI@86:/*(-**0*(,+**%"$%&(%-%)&%%" $''11/,*&(3-,-+L*"!!#/$!)$/,+.1Fc67120,*.(&'+**)'*%&"%('('(*/,"%*&.>5C)+.3498)# $+!( 2+  "*,$**1G4S>IMOT\IOeub[TPNOGMAFUS+/7796;4<497<9;;@=<58C@:9>B>@8C<;3822,)+,),4,,+('%#%'##*,%%*&,%! $)F?:,:'@7(' !'$$!697%!"./(*16Fg8CNNMD\JGKWg`SM[TMPUIHBHH0)-6:272323;6786>A8:GUGNM]TXEMYgi`pjqzicWfXuqttzpq^[ZbegkoQO`j\Z[[ZUfgjuja]c]a_\ZV`gghbdo~lpjkinnooijrlzmullotnqko[LNNOQ^[UKI;;7:KNG:58;>B=657671/.+,)')(((),+(2)(%2#'&#$'#$'%%1%'((#/#g,% &( )R .'*.23DGBEJCLMHLSLJPXYM`WFFDJ<:,*.-125<66<5:@7<@JNRTPDOJXVZclooe]]ME_mkmgh^chl`TTTOZab`^aYUW\c]innj^[a`d\g_]`dacbedmklfdeojhmmfpuyyqqourt{qoi^`TSZUNO\bQJ<<9@?8@A;:1?@=<75;0-.0-:,/&%&')%%)+*&**((""#!%#$$C+(*(+/"+)4)?F!$ $)*'(%(03:=@?JJJKUTQ]ZFNXSPLRHF@A@U64/*/852497=9:;<8<;7<;@IGRReFFEVWdka^a[U\ZS@\hoy|cilne\XZPU`f_`ZOXXZ\^d\mm``a`^[b_hkiehmedcgf`beijgjrloospzuwuonpxjeg`VRRRSMVOOC:!'&)/<@@G=?K0*,/-47;:=:<<99:::7HHDEL?QA@IJ]_ZWR^e^`[Paumjkynjbx|pd`_^[SPG\W^nhongYXkdZgddgde`eckmkc`bbcafldcinmbglnijxlpvrqgakws][WZ[WSOW_HBIFSTVKMPOOOIUKNKHEEF?=AEHWK?B7C??JFOQT_ta`vUeZebfb^RVVcedd__a_hNIQ[ow~i[ldcb\]ksrbklkjijfdhdg]llghgecxwmigoxwphgfhjjgc\USbU[pFBCGACDE<@>6>:=EDLA;>83.310/-.1*''3*)''&+s%'((&"%%'4(,&#%$&!'210 7 !&%+-,6Y=7MCMIPJMXVVNJXAAFGLC;4C=T;?5DPZGNOPCIFGRICAA7?SD111,/2Q52145::?=36sTGRJDHVD?DDIEQ[YVcbfdfdkbchfllre^OT\XY_antsldmsjigdjjrkjimwprnkh_khevtqqieecjdhobfok^d``TSTQTQZU^VAOLSjmEHDLI?/252425,1)&++())%##!#)*8,%))($%()$"&#!%# ! $!$*,18:FA888=KPPJOKNFGEDDE?DAJP982-.1/17211424<@62:C<7>H240+5621.0.4'++.'#!$#"##())/&)),'2('$!!!#%% -" !"4 76!$$(/-2<:49@@FKISRJEYFKCECA<@=A96672'%+-/0--/457<733IM609HB:AQAKLE@D>D]XQ\d`ddcZ[`\a[}wichnemjthejljqoygyuopplhgjrpdk}ojki~|wfd[f]_Z]UURVRPUMQKHJJKGFDDMJTefQH?@:>7<9H?5323720?0?0)&&$%! #'+,+3+8++,*>('( ,%("# );"$5"! (!&)*+33<6ODCBQNKMMIHFOECAEF=;C:8>@[3-*-(-+/14G489.56B85>?J=C<:>D3<5-38N+*/"&'"% $&/--71>,'((*'%)!'%$#$!)<!##-0)5IFFOBIDGXFQJ_THGFHHF;BK:8L74@B@Dq9E96]N=>@l7EO7C204//...2:908BD<=CC?BFCDLIIFPFE?>CyaN=9>51/3.&*#%%#B1"$$#-M-3*+)%&$$1;(+.0_)$*+)#'!. ('*2 "('$=BA><3E3:+504/),-+'.197157;98BGH@AHJFFHb`ANCHOLYQO[XdWWeMZUY][^^YW_afgeb`X\lvrwgb_dW]bW^RPbbrccfb\[UUWTSRNLHISKKHJK[DLKJDBZcxoiQNMCEDIGIIO;FJ=BK8:WPAOM30,,1*.,)%=:73$0*#)-1'(-1**)-4*&2(-Qn)%%+) &=!&'&!$!).06:@ILD;FMMPPVLIJQFME@H;;8?1:38;.9*,-*'+.1755<=?<@FA=EGFBFERS[A>BJKRULSS\QMHE?JP^PUZSU[jdXm\ORYUN_pg`hja_Z[`YYQWZ[[^ig^]SPVKLHX^AGGCXCAFKDDKDA?_{rrufK^J@?AX<:@A>=><68R637L/(1,0!!*"*I()+)&%$(+((0&*&+$4,%%%,30)%#"% &/"$$$ '-+2=9D>FENJIILNVXLrNC<@:C>571-21212..)%,.+6569FEA>@CD@;CD?GLTnB97?MHHSMMRQLDDCGPOPNPUVW\XZaY[pPIQ\URV\Y]daTYUYWRPJWWZWZeQIJIELEKA@BEBJCNGBBFCB:OSwXCOTBGDIFGPBEWFOHHJIFKQOHJ@DD?87380379;663.#0465C=EHGSC>LOHGREJS_JFCQNF?;8479ANp=//.*+5:?V]LQWE@=F>B@9XMTQDB;39EHHNJRLUjKFKCJGFL\nNGKIIMPRMVPNKLKTJPKIF>DIGFKNGEL\OKE>DFG@<=@?>C@MD\DNA@BACON_IS@CCuC<9=8<26553-1//-@/I5G6*(&$)&*&"%),&3-&%(6-+((-4C/)*8211-$(%IX+! !6 )" 0$%",)+F;;E>?CB@I>?<;<8B?@;-&0AM=B@@S=BBME>>@EGEFCRL.0??IMLJFOXKEBdKYUVIWMNB>=AHGFIHGIVIEAA?>BAB>@CG?@AHHIFFEBABCB>?@;9<<FBEPN]AQRaHIGKQY@=?<7;=<))5=<>?;;A;8:U?A:>B>>CACDDMFKF??@?B<:8FD@:=>?HeRVF3\?262330/*S478/))%$$#*)'**-+10-+:./8-2-+40\92-@/&*84(0"$*%! )'!"$$&$#'259<=Bf6<@IBB@=HZJcNSSQ@J;6?C==TEENULQcp;A55@FIXOGLSV@>::M=U@@AC=?7CJVpiG>;IH<A@BF@GABCBBCC@@C:>:=:8E;=7=>7<41/.4Q40.*+.7395*(+,*)C13,.<.166AU95:16,-->T/6**'(*"/%2 )!(%!!"#;.&58<18A@>=B=;;9@@<>;;B?=AC>?>?C;7;:<;AO988<8?6821/66.4./++/+0WA*)/88gNZ57977693A2..27?1D@@4/'%"+"#)&! 7#0 ".7)'*GH>CAJG<@=:@IPCF95<7CCF@HOTJQF:63?>B;9;<@>>INXKB@E?FC;=7:;;;7AD?B??EI><<:IC>FMN>;0422.00D943=/4/T>08/956=U:OK>.;ZA@=:@@JokT=:@=99648548?>7>?@>@;;=:H=574DF?<8;<<<;<85:<3;GQ236Y:<>@e:=L0/5:DD2243.+1`Y4/+&% &(&$*&$"O"1"*>AC@+&4--42;:=2457537WLUFFNLOA>A=>]XK;5-39=:522,8<7=767<:C968<@=@?8=B<=DC898<:?BB9B;B>=924>8[;=E16MG2;?X89k?C41A432-55-0=-*A>sL0**&+.#'%"/$ $Y E+*D4 /634+.11656978231>mEESTJBDJM=>ZbII8.979A:971357689BEOFEGCJ;B<;:8;6=B=C;;5:D24066;Y;;7M=:Gp?C448~\6D]?4QG;;68<5:7943MT73/(+)348+.-6.(.+'.+%A..B>!&+%%<' 3F,5,$$#+**-2+/22206348KIHQMdBFiDDFYC=H45;7DA;61,05=:7>:?UHRDHIF<=sGM06L=@8A@>AGGAY==9A;989:<<9=?C6?=FHTKFAE;IAM@D?K<@T=77=-=8>:B5AD<:05>;72WD>:E;=;91772=3478EJ>>>@1>:K?=:8127B9N9e;;5<;d>RIT?BH7162("&'/,.%=*1>*),"%!R&&"#$-"&/-3I1D53/A6B0;BBB>AGI>J?:;;=mL<6=>F@:<4.3;=;A@;JE@LEBLC;EvNJ6FBH@C5MNJE68DEB<==9??9=>@?FFH9>=;?:9><=H>G@699;:BeR?DD?<;>46839>7O=E6@;>7N;+8N1395C74:36?367*574;7J1252+I>7.+-*())'+)3/-07;@)))C&&*1.&.570gJ# 5&'""6(232/.-2:30/,+.3;J>=HnNDE>89ABNAQ?58N<9722,,7;;PBAE@ENTKNE>ULEB42/4?H;?8C<>5BF?D@???EHC?FFHDMABS@>:@BX@CE;G;A:;89EIHB=sY>=?A:9Sr[ICQ=@6<:D6989874/4+*+)283@B?92/1/7HE=8GB7/302,.&*-(-/+4-0/?01I-(.'(&,8*6-,=ODGQ80:4;<33;5;=<;GB=K<=<=>L>?[GCDELFABFB??HDE?HRD@IJ?>8DFAA:F6:;=<>JP?Z7<8A@^SZLRLAE<>2=;>9508.-3,%*.18+482?--+K43-=<3A@906-*(-.IB-0,+A3-:8/71+$,+*:/)'>,">$&@"4%%(+.B/55=-144,/44<;?EAEQPePDUSfHCDAL8F:=I^PBD6448;<=K]TdaGB:EB===2;8D980>.1649:;9;6<=BLECDEG>AHEK?;@MT\fHC=>CH>=BNKGGB:=9B36:?<>NpV=;B774542660.12001013.34<(1:0D32/20243140*->3.+),-,(5,&%=*+(*'>Z_(+''$$ #!$%%&%")1.0C:/26.-85:AJHJOVJABHNaKADKGXC138@wZY|==A20BAHOiwG;5812;C=88?[=19A[;;>8=K<97=A6>7>=C;?DNG?;AH@;?>C;HKFRD=A>:8>B:<;J=D>D8==@=A92?<=;?=_dSB6;765.3;-/-386161<56+/0,.,+12>3.-;0)6,.+*61-&$$%/$,0+''0(&.#,30=/'#0*% !1,&-0-A-585<2.1367;SH^PuTwPRH[EOQimT:.19[VL>6;BK<86DQQPKRA;78MI==E;;>;6::G<=:<6??447=99:;B<:9OG<;RHDA<@BLE_f<;==897<>AIA8E=KJD;>8:=9GH>M=E=HK`G323::5/,4/.)02,,0=9J;.+:(*(1,.01.7-**-,+2-**0(&,&)'/0&,('*'%$#+)&',("#'$!&!$$+(*%2.-1.514:K2.35=LP`LLVGGA;_HJsY]YF7>J<:HBECCc_H:>IZpZG<;5513V==KAB@C911>?8929;6249;;9:77;:@7=@IBDAG>:8JI:;><368<2.6:AL=ERgO9488H<8D6FA8CBIGJ;:C8S9@00*6+/+315/71W3@-++5.4..10/8<-&'-**0)*+(/3*02/%'%.'.);""+&%#2-#"!!9&&&+''$1=/3+911;3=0569SYEGAHC<@?YPMXOD8W996;LELH@EIgOUrEDBzW?35518:;;7<@@A<=1/576578863:98564;;<6442OR9G@C?91210576475461/:IfCKjs9:<855<;^[KJ=DG@5.A3=-+.00-+07-8/,,1993531017*'(%$&+''+'*(7).?GqD403._I/(-6)'$,8,% $&75,%#%&55$/0++./1C0/50@8KKNF>T8IBLITQI7@A>527?GF:@Kde[r8F;cwH<6;=79?682?D;J=9>.5a4C4P85G:;6889<;69:6;:>BM3383107888752.21/7YK>HO41:5F0'--00.5D.)(-@0)&-BS?7/3783*/&'(%)*46)>1+)/8?JoEH]02?/)*Q.3(((%($'@;36&*!"%(*0<<691//92219<_PHCFE^BERU[F>:>8C;;=CC:DIPYe]?69fQAb9;9147-,1HM]H57323Z6.>.4;513:=R58;669739@D::;5125130182735/12:D97KZF@>IFLEG?539783Ka84013*/(+1-..625.)-2.+@8,760),/-*(',)/++-C2+*.4NkB?7FD-0-,#$*+'J0)) "%#S,%'('$*'#$).P1D;02579175<021366A155079DPaB3/7?41($/146A:95N748409<3:D<9:;;B7<4/-3303:03793;8@6E\L?HJIDFLG;54+44571/3.,*%&)63.+5W1=(1*/3;M=:8..1F1(&*)2($'"&#'++*&.'8kzBBe;040//-101/248114@503<:7D>A@=583114127/25,'$'1*.0)-+52:62-0.51.=85A,C8'#$%.*(&#@&#*/?)!(Ui6:13*3/F@27Y)/9$,)3=  !%#=*.=6'(2+-*&+H)*-O5567<6TB9@WNEM>DK^O>JTPnAEN>HH=Yup{L@P-(,69::8=5:=553-723.2.*)+(/11/.20740B2,4.))062+0:6(;%!$&*%(,$"##)*-(**?.+-72//146*)D7322(%()'#" $"(444P0$#2'1(/:R,+*63346;>~<3F^JLfPFKLGACLMo>?:AGKUwxXJK4/456@89>@:4@O?8763961E=?H-/46517I::4f7<457204475I:4/2420-+0/76123.1114:S50HS>>6@0*411E.7K0023+01.5-7==67-+.,+2..-08-(%"**&''&" #%"$)',6<;6+A:>/3722909($$*+-DU$"#V308@N7=6IACKKFG\XKHIEHE@687>900I116:61<5Iaf-/>47FE42A6)09:554/,+?2.-110101/25k80,100288AE;C77jP9812A?NH>4214I,')L43L/)41+(*0)8-$'#$'%$(($'&'8U->CWO^=;L$"'*2))$  !9"%611-$,%&&$".7'",,.(417C:63:=AKAxIPJEG\HKhbDIdUn[izC;CJ_O157935:GM/-G34*,21:28Wc49::6B9<3195-2;;65/*(.-/..3284;..09,/1-.15/;G5E66IjC5044;?uBBC8411/0,9&*-0+-8+,@975202?/())04()$7@(#+,+&2>)0/O5*)#/19?TG68-1$,$'&&   &&)2 #'+"&$('&+3E$'%-3358F>U1<@B@?EQVJF\GJEG@9CBJ;[XLWbUFHOI6669337=2424N4.2-312.rmB-0B633=:?:4587<:665500/../2-.0.56+0,2,51+40',R4G5/,71&?-)(%'-20:6.O:4<*#4094CI7.095L.# #;      +)#0.% &,*$%')U4.%$&$:-,.:7:78=?CE@14?NADMTG`QHjABE*551:/<+)1-246,2/'%'%))+)192ZTR9-8J\7,*">L6/#+N2+-#    <!!+(),!'%#)* !#%#*,*/NVA/7>9K>?:=HLEDA>O@OAD>A7X6AGV[MSZTIV28I-45P=731K-..37:>.46C0+5bODVE?7@G?5053TV=<6D7?=;;@=2+..5268545I42* %77<5H8C878456;0)**,+41u12>3.,03+47=3;21+*,1**1;UOY_9/LH/,C+5''00-%Q$-G&#   -  %"&M -'*))%'$(&$&#&,).K6:417:455@J7:>ACC=JC=FEJXI59=@4@9EHYp\gD>:@4AT{J<+,,/;/9_3.:5654=51240..(4;;7;97FC55.1??:8EZIILV}G[@?856;D8522.740405B:|J12:38;<4k6/8>:45/8/19=?7,*,897[qG9502-=*,,'/@54N}SAC[:??0;-3*/+E3AM0*($"Q,  6   !495:30$$$ #! !$3+,,*)',2:361;55OR8485:?=8;CBF^uk]HNE,95U7)('4f`]oCB-*4(2C4$''46I8==5.1(3*+.'*+W6:-9J=@2.-       " "#"BG00$ # $"&)+3,&,20626-1343>;435649C9BFBNn_YpVX@274;1/.405:/657:('(E=X\VFA23(.!&8#"C--(1N4;'(%.&%.#%%*@I)8cDYF@( ,  -   %=),$7/#$!(P%%7-++2/+&)./8GJ-25;4>07@B:@YGXy{PPI31-/3.6/+1595556::21/+1>0/96.0007GS.+7(%:4>A8AH63#%!# *(!,3TP%-u%$&%)%F0*.XPSATi>7    -  -  /- Q"- '%$#&"$H"'.(&,13-/**/65j83371=5;;=9?M@ET_W~H@;+" "2;322-327:BPG7SP77G6<9?Q:@7678EE5?FE82=OmeYVqdVE7997-/05:1/.98@F;E:>ChI277U<=39;E05379./3CX0K4$*)2DJI?@4/'$""#.$*&' ,a$ -$0")'6,+G+DC*F@*"!"      -  $"82"'+!"#""$#&#.))(N;.1+043887..71T7235=38?GmUcWTN?6\pRICDXτVD988:402056492BCXF?:3Q55MK540001?1FK4:E424*-,@4D4,41-&*$!"%!"!!0. )&'0.&+&*8.,$&'"%&     2//>!!"#'&,)1 !'&$3*,-14:+;494.3;785974K9FhkK@GAI76513/426.0,0049lE@=6I737>B;79@<:<<:B>:9AG@84AB@??UbRCH5H980./74;?:6B@5@7:9:81G486650876@@J8@85@A;A6;10-3,.23-*%)##!(0#%, ("(&%,00,M7,5$!!0 )      !@S:A 3'"%"! ,#;&#(&*,./341/,1-4-7;.Q@:98:BCQAHO9G>54678?H3111/583/<8962U:D<@c=<;9>@:65AE?:AQ<6;;ARQCDgddA9B87::A57:=HOM>@8=;9;0816>84/5U?:H.395J4232+.03DIB689;=EGNYE;QA@8I;A:BPN;=VIAD7;<<<;4K1,89]HEADFDB1,60827.):+B2,4111.G]b>E<8A;?@AC?>Va1348;4DIE<=R5;E6501>H915><@982zFRUeZF;/2811)+B6+1%%*%&##$$%)(L&% +" "-"    74O8#%" /!#(+"+--B=96)39\U,),&//49=M?WKD=;C16L20/*;///5>>GM?FA8599:OThQ/-08A:?:264HN\>FE839S;:4<=;<:59<6bRH33::>D3754;DJA9=AI./,298<575573977=9274@=6@G-92247-.2.&,-,;,D=+l* !""% '#'"## 51%!$%$!  "   "(3_-#+*"&$ !)'=V>0b\=S07/,-1.A=,&;&$74^;R=DFBw]oCdof<;72.111U>7.;21/<>6;67464;,/237=:NQ6248@2:.3308?89IA9b>287KI:<2.85X5A\QI59>41*''.'(*2')0AA.! !%:3$618"#!&N0*)*$$%-##(#=        SY( + 5);e+)22U<3--.E05217&('"51;-<@63HNtIO`mh:86:00-I?.,J><8:40+,0./12CO<58EJ6<80+5456..05,2:6//1/1>74-20587G42552B@?5:6IC67DTHD46.3O;@>7A29,7,/'+.Y65FSK35yB.+&*#&EZ '1, &2&*&-'L!%'J1FB9C-.'"+    *)C:8(&kr)*9'6C3(-230-25.2%*"-64/8.-/BBIOFiyQ4+&1031)6/-E9K<-39/..10=C<677bZ=-+*.3'26-:1;8.0;21236803375;4996=?>@9CA?@=IH4C5[SDA6+#'+:C<->++-1'+.A-,,34:.234=tKG4*)&'H:4:9.-/)(-4+4627.14379:37E69<;D9125@01,;1++0+51&#)B'*:.&(*7'.FI,""3% 3##11/O--J[Io|U<8$%       %0$#G"$!#%)N'':>I9J|:<=<+'!)-*-3.EM.1L41;0''$11*300%+(*1()*'09,.41L/52,4KvT;:0')&+77*++(.4/<203.24130/559/:>8[>H8k9:8;:6,4E619.1&$66''(,&,A)&$('#'!' )A<;*<1*!% (%$"2* *!3"+,!6=FBDFXAVkID[4O!      '!%  *'!('$$8+7GVZWI6+&$'!"$ %+',&*'=3MR15A4--*)++50.*%$%'(/)'016+.-'*+12:?240&*'%**/2-/1,+,-0/2:=243/./4.;8@<=8FHD>;657]:3996=E54*(%?#"1?%(),'%"##!" #_0#9,1U%)&!& !0- "*E&X('?04;egYW^]\|g)!%   #$   /P$]8#$'033&*0:_cVNj9G,6,")& (&'(+1-+3<5-+*(2<((!"/+0/,)#'(.)$-+`+2-1+179$#)(%()*&&,>$(I-0,*/-5(*',4-10P455;Z91WXCUA55/OgD2.0&+,/0:G)%(+.4#&$#$$!#5(!''.8DS+&+7>14 (5#%#!&v/GpyUYPfZpO4$-&V&) '+%   - /!$&D,&0/2.#*?9lh{N:in.32+''$!;F%$&'H*,*,-&-P(&348@13;6<44;::?>ZS]D8B32?$i"*%?C@& 4'S';481@@85@353$++(#!%!)$(('!(-3!!1$-02"=(?=%*!$ $3("#&""#%O(,A1&@,/G1@     - -  A!%DC/(""!1R=-20S\L6T)A=D%% &$%$#'%$##'%"&$*'((#/&'$&21##+,)#""!/.+"!"&/ "*!&(&"'*-E-(80,')-6A=^JXtoS5,+0/>VmIM3H64)'(1 !## " $"!!$& !&"O"*@3=$>)# #/(f#<1.->!#$"G%&1C'-5'       !:r!!#!(I70-(*JG,/., #!$.#!/%)#-!%#$$#(&"&,(*(6T#$"2)"#!#!!"!?%!$! !""#&&(&/:D?+(:-186:ku|md722%,:).5.32<''(#%$.+,)#! :7*$?14<' %'4 #H?!''0,'*<%+!+     ).X<(7"! J:9($&RuYB+! 0&!+"$"*0!'$&')'%$!$"$#!*%@&9k"",(!!($$* 1$!.'"! !"%7?>vS.2099844}glO<-,,':,$#!)4'-8%,((('$$! #0!9P;7DO+&  (!"0'++2&(       '614.#!4$<0H97$'$+.  %6)'3%$(.(('! .) &""'%*%&$**"$ ',&! "!E"# # #%&!!A):'*%.4*-+<99."+5P5YM8/(%& "&*+$"$-*+%!'#$('+% !&"%  !$( ! /!"J',',+1N5X^X?')*79@)#0($I%''6 ( %7$"#)"!)8/$!"      BM. ,&)r&6O-%!= (%"$?2-F18<1&,$("$ $(& "%# !")#&!'!$*''1?2>*%8Nd]Y'0 8M6>+,;0!!3%%%-*#0 %'  -  - - $aS2 $",*^)8@E$)#4 $,$%#**$%3CSBE0# #"&& *!%5')""# & " .  +!6"% %$#%|D$#, !&*=&!P!*$<%!2  V         8H.$#&7)!$B("(1"$" 8#$$#1^C3R !%!!&!# ,383)$!&"!"% !!"-"!$!!4!# =',e)5 $&!(- $ 2)! ("  -       )*=M3?$"-*0*(##" %!#&(&$$'D6./N$#!$""%!# *##!!(  ) !!+J" '!'&( 2($"!# "   \ No newline at end of file diff --git a/data/fits/NGC3344.Mono.F32.fits b/data/fits/NGC3344.Mono.F32.fits deleted file mode 100644 index 50fcbe8e3..000000000 Binary files a/data/fits/NGC3344.Mono.F32.fits and /dev/null differ diff --git a/data/fits/NGC3344.Mono.F64.fits b/data/fits/NGC3344.Mono.F64.fits deleted file mode 100644 index 9097f201a..000000000 --- a/data/fits/NGC3344.Mono.F64.fits +++ /dev/null @@ -1 +0,0 @@ -SIMPLE = T / file does conform to FITS standard BITPIX = -64 / number of bits per data pixel NAXIS = 2 / number of data axes NAXIS1 = 256 / length of data axis 1 NAXIS2 = 256 / length of data axis 2 EXTEND = T / FITS dataset may contain extensions COMMENT FITS (Flexible Image Transport System) format is defined in 'AstronomyCOMMENT and Astrophysics', volume 376, page 359; bibcode: 2001A&A...376..359H PROGRAM = 'PixInsight 1.8.9-2' / Software that created this HDU COMMENT PixInsight Class Library: PCL 2.6.1 COMMENT FITS module version 1.2.0 ROWORDER= 'TOP-DOWN' / Order of pixel rows stored in the image array END ?????’??????????????????’???????????????????????????????Ɩ???????Ó??????Ș?ə?Ĕ?Ĕ?Ǘ?ə????ё?ٙ??ŕ?Ǘ??Ș?ӓ?YYYYYY?Ԕ???ؘ?QQQQQQ???ʚ???ϟ??Ș??Ș?ŕ?ə?Ǘ?ə?Ɩ????Ĕ???SSSSSS?ŕ?Ǘ??ŕ??ŕ?Ǘ?Ǘ?ŕ?Ó?ʚ???Ǘ?????Ș??Ǘ???????Ș?˛?ʚ?ʚ?ə??ə?????̜?˛?˛?Օ?ə??͝??ə?ʚ??Ξ??Ξ??????Ǘ?̜?????ŕ??А?Օ?̜??PPPPPP?Ғ????˛??ё?˛???̜?ə?ə?ʚ?˛?ə?ϟ???ə?͝???ʚ?Ɩ?Ĕ?Ș??Ó?Ó??ə??’?’?????????????????????????????????????????????ŕ???????????????????????????ʚ??????????Ɩ????ŕ?????Ó???’???Ĕ???Ó?ŕ?ŕ??????ё?Ɩ?Ĕ?Ó?Ĕ?Ɩ??ŕ?Ș????Ǘ????ᑑ?????Ғ?̜?Ξ?VVVVVV?ӓ?RRRRRR?͝?˛?ŕ??????PPPPPP?Ĕ???Ɩ???Ĕ???Ǘ???Ș????Ǘ?ŕ??Ɩ???Ǘ?ŕ???????Ǘ?Ș??Ǘ???????????̜?ə??А???˛?Ș?̜?˛??ə??Ș?ə??͝????ə??ʚ??ŕ??Ɩ??Ǘ??Ξ???͝??͝?????Օ??Ξ?RRRRRR??PPPPPP??ё?͝?А?Ԕ??Ξ????ŕ?Ș??Ó??’?’??’??’????????????????????????????????????????????????????????????????????????Ó??????????ŕ???????????????Ó?’?Ǘ??’?????Ó???Ɩ?ə?Ɩ?Ș?ؘ??ʚ????’??ŕ??Ĕ??̜??А??ӓ???Ǘ??ח?Ғ????ŕ?Ș??Ǘ?????Ǘ?Ɩ?Ǘ??Ó??Ĕ?Ó?ŕ???RRRRRR????Ɩ??Ɩ??Ǘ??ʚ?Ǘ??Ș???Ĕ???Ǘ??А???ʚ??ʚ?˛?͝?˛?̜?̜?͝?͝????͝?͝?̜??̜?PPPPPP????Ǘ?Ǘ???̜?ʚ?Ɩ??ə?ə????Ó?Ó??Ș?Ǘ?ə?Ɩ???ϟ???ё?Ξ?Ғ???RRRRRR?SSSSSS??PPPPPP??????Ș???Ɩ?Ǘ?Ș?Ĕ??Ǘ???’???’????????????????????????????Ó?????????????????????????????????????????????’????????????????Ó????????Ó????Ɩ??Ɩ???Ǘ??Ǘ?ə?ŕ??ŕ??’???Ó?ŕ?ə?’??ŕ?ŕ?Ǘ?Ǘ????ə??̜??UUUUUU?Ξ?RRRRRR?????Ǘ??˛??ŕ????ŕ???’??Ó??ŕ?ə?Ș?Ǘ?Ɩ?ŕ?ŕ?ʚ??Ĕ?Ɩ?Ó?ŕ????Ɩ?Ǘ?Ǘ?Ǘ??̜?ʚ??ʚ?˛??˛???????ə??Ξ?Ξ??Ξ??PPPPPP?ϟ??А??͝??̜?͝??PPPPPP?????ʚ??ʚ????ŕ?Ɩ????ə????˛?????Օ??Ԕ????Ξ??А??˛?Ξ?Ǘ?Ș??Ǘ??ŕ??’?’?Ó??Ó?Ș??’???????????????????????͝?Ξ???????????????????????????????????????????????????????????ŕ?????????????Ξ???Ǘ?’?ŕ????ŕ?Ǘ?PPPPPP?Ș??Ș??????ʚ???’?Ĕ????Ɩ?ə?Ξ???ʚ????֖??ə?ŕ?Ĕ?ŕ?Ó?????ŕ???Ǘ??Ó??Ɩ?ʚ????ŕ?Ĕ?????ŕ?ŕ?Ó????Ș?Ó??Ș??Ɩ?Ǘ?ё?ё?˛???ə?͝?̜?Ș?ə??ə???ʚ???Ξ??ϟ?PPPPPP???Ξ?PPPPPP???Ξ????͝?????˛?SSSSSS?͝?ϟ?Ξ???ϟ?QQQQQQ??QQQQQQ??Ξ?͝??ӓ?Ғ?Ԕ???????ϟ??ə??А?QQQQQQ?ʚ??????Ó??ŕ????ŕ?Ɩ?Ș??????????????????˛???????????’????????????????????????????Ɩ????????????????????????????Ĕ?Ĕ?????’?????ŕ?Ó???ə??Ɩ?Ĕ??Ĕ?????˛?Ғ?Ԕ????Ĕ?’?????Ɩ??Ɩ?????Ɩ?Ǘ??˛?ʚ?ϟ??ə?Ɩ?Ǘ?Ș?ŕ??Ĕ???Ĕ?Ɩ?Ș??ə?ə????????TTTTTT?Ɩ????Ó??Ó?ŕ?ŕ???Ĕ?Ɩ?Ǘ?ʚ??ӓ??????˛?ϟ?ʚ?̜??Ɩ?Ǘ?Ș??̜??˛????ח??XXXXXX?PPPPPP?ϟ?ϟ????PPPPPP??PPPPPP?Ғ???Ǘ?Ξ??А?UUUUUU???ӓ?͝?ʚ?ʚ?͝?˛?QQQQQQ??Ғ?TTTTTT?ӓ?TTTTTT?SSSSSS??SSSSSS???SSSSSS??????Ԕ?ؘ??????ŕ?Ș????Ĕ??’?’???????????????????????????????????????????????????????????????????????????????????Ɩ???Ó???Ș?????’??Ĕ?ʚ?Ș???Ĕ??Ș????Ĕ?ё??[[[[[[???Օ?ʚ???’???Ó?Ș???ʚ???ŕ??Ǘ??Ǘ??̜?˛??Ș??ə????̜?Ɩ?Ɩ?ŕ?Ș?Ș?Ș??ʚ?ʚ?ŕ?Ó???Ó??ŕ?Ó??Ș??Ó??Ĕ??ŕ???Ǘ?Ǘ????ə?Ɩ??˛?ə???ʚ?͝????̜?ϟ?ʚ?̜???ʚ??̜?Օ?ӓ?Ғ??SSSSSS??SSSSSS?А?PPPPPP?PPPPPP????ə??ə??ё???TTTTTT?WWWWWW??Ɩ?ə???ə???ؘ?Օ?SSSSSS??????TTTTTT????А?QQQQQQ?SSSSSS??Ԕ???Ș?Ș?Ǘ?ə????Ó??ŕ??Ó??Ó???????????????????????????????ё??????????????????????????????????????????????Ĕ????’??’??????????Ɩ????͝?ʚ?Ó?Ǘ?Ĕ?Ĕ?Ǘ??Ɩ?ə??ܜ?999999?䴴??Ǘ??Ó?’???Ó?Ș????Ɩ??Ș??Ĕ?Ǘ?Ĕ?Ǘ??̜???А??ʚ?Ș?ŕ?ʚ?Ǘ?Ǘ??Ĕ?????ŕ?Ĕ???Ó?Ĕ?Ó?’?’?Ɩ?ʚ?Ó?Ó????ŕ?Ǘ?Ɩ???Ș??ə??Ș???ə???ʚ?????˛?̜?ϟ?̜?ё?̜??ʚ?ə?ϟ?SSSSSS?QQQQQQ???Ԕ?А?QQQQQQ??PPPPPP?А??Ғ?̜??̜?̜?Ԕ?WWWWWW?Օ?UUUUUU???˛??SSSSSS?PPPPPP?ʚ????SSSSSS??UUUUUU?֖??ؘ?Ԕ???Ԕ?UUUUUU?ח??TTTTTT?SSSSSS??Ξ???Ɩ??ŕ??ə??’?Ó?Ĕ?????Ó?Ó?????????????????Ǘ?????????Ξ??????????????ϟ?TTTTTT???????????????????????????????????????????Ó??Ǘ??PPPPPP??Ɩ?Օ?ŕ??Ó?Ǘ?Ǘ?Ĕ??А?Ó?ŕ??Ș????[[[[[[?RRRRRR?Ξ??ŕ???Ó??ŕ???ŕ?Ǘ?Ǘ?ə??Ǘ?ŕ?ŕ?ŕ??˛??Ғ?QQQQQQ?????Ɩ?ŕ??ŕ??’?’??ŕ?ŕ???Ɩ??˛?Ș??’?Ĕ??ŕ?ŕ??’?Ĕ?Ɩ?Ĕ??Ǘ????Ǘ?Ș?Ǘ???ʚ????????̜?͝???????˛????͝?SSSSSS????PPPPPP??ϟ?А?Ξ?PPPPPP?ё?ё?ё???ᱱ?ޞ??ё?ӓ?ۛ???Ș?ϟ?ʚ?ϟ???RRRRRR???RRRRRR??ZZZZZZ???Օ?А???????Ԕ?ə?Ș?˛??Ǘ????’?’???Ó???Ó????????????????????????????????????????Ǘ???????????Ɩ????????????????????????ŕ??????Ĕ?????’????????Ó??Ș???˛?RRRRRR?Ǘ?????֖??Ԕ??ŕ?Ĕ?Ș?Ɩ?Ș?????ə??Ɩ?ϟ?Ș?Ĕ??Ș?ŕ?ŕ??˛?Օ??qqqqqq???????ŕ?͝?ŕ?Ĕ??ŕ?Ғ?Ǘ??Ó??ŕ??Ǘ??’???Ó??Ó???ŕ?Ɩ?Ɩ???Ɩ???Ǘ??Ǘ??ə?Ș??ə????ə?ʚ?͝??͝?ʚ????Ξ?Ș?ʚ?͝?ё?SSSSSS???А????PPPPPP?QQQQQQ?UUUUUU?͝?PPPPPP?????А??QQQQQQ?RRRRRR?QQQQQQ????̜???Ԕ?Ԕ??ᑑ??VVVVVV??㓓?????ښ?QQQQQQ??PPPPPP??˛???PPPPPP?Ș?ə?Ǘ???Ĕ?Ĕ??Ó?’?????????Ĕ???’??????????????????????????????????ŕ??Ș?????????????????????????????’????Ξ?Ó????ŕ?Ɩ?Ș?ʚ?Ó?Ǘ??˛??Ɩ?Ó?ŕ?ё???ʚ?Ș??ϟ?˛???Ɩ??PPPPPP?˛??ə???ŕ?Ɩ??QQQQQQ?????Ǘ?Ɩ??????’?Ǘ??ё?ZZZZZZ??????Ɩ??Ó??ə???ŕ??̜???Ǘ??Ĕ??Ó??’??ŕ??????ŕ?’?Ɩ?Ɩ?Ɩ??ŕ????Ǘ????ʚ?̜?ʚ?ʚ?͝?Ș?˛??˛??ϟ??ϟ?͝???̜????Օ???UUUUUU??PPPPPP?TTTTTT?ё???Ξ?̜??QQQQQQ?\\\\\\?SSSSSS?RRRRRR?ϟ??Ξ?ё?͝???Ғ??SSSSSS???ؘ?UUUUUU?Ғ??ۛ??VVVVVV?VVVVVV??????PPPPPP??Ǘ??QQQQQQ??ə??Ĕ?????????????????????????????????Ó??????????????????Ó?Ԕ????????????????Ɩ?????????????Ɩ??????˛?SSSSSS??’??Ξ?Ǘ?ʚ??Ș????Ɩ??А?Ɩ??ə??ŕ?ŕ?Ғ?̜?̜??ŕ??Ș?ə??ŕ???Ɩ?Ǘ???Ǘ??Ǘ?Ǘ??ŕ?Ĕ??????Ș?Ξ???????Ɩ??Ș?Ș??͝???Ɩ?Ș?͝???Ɩ?Ĕ?Ĕ?ʚ?Ǘ??Ó?Ó?ŕ????Ĕ?Ó?ŕ??Ǘ??Ĕ?ŕ?ŕ?????Ǘ???˛??ZZZZZZ?˛??000000??˛?ə?˛?Ξ?Ξ?Ξ?͝?????ϟ????А??ӓ?????PPPPPP???˛??VVVVVV?RRRRRR??ϟ?Ԕ?ݝ???RRRRRR??Ԕ?ӓ?ZZZZZZ?WWWWWW?UUUUUU??Ғ??????ٙ??XXXXXX??Ξ?͝??Ș?̜??Ș?˛??ŕ???ϟ?????????’?????????????????????????????????????????’?????????????????’??????????????Ĕ?Ĕ??TTTTTT?ʚ???˛???TTTTTT??Ξ?Ó??ə?ŕ??????????Ĕ????PPPPPP???Ǘ?Ó??Ó?????????Ɩ?ŕ??Ɩ?’???????Ɩ?ŕ??ё?????’?Ĕ?Ĕ?Ɩ?Ș???Ș??Ș?˛??ŕ??Ɩ?Ĕ??ŕ?Ĕ?????Ó?ŕ??ŕ??Ĕ?ŕ?ŕ?????ŕ???˛?ʚ???͝???Ξ?̜?ə???͝???̜?̜?ϟ?????PPPPPP??ё???ё?ϟ????˛??RRRRRR?rrrrrr?ۛ?Ξ?А?TTTTTT?WWWWWW???ə?Ғ???ZZZZZZ???000000??А?ё???ؘ??]]]]]]??PPPPPP?͝?ё??????ϟ??Ǘ?Ș?Ș?ə???Ó??’??????????????????????????????????????????????Ș??Ɩ?????’???’??????????????ŕ???Ó???ʚ??ʚ?ŕ???ŕ???PPPPPP?А?ӓ?ϟ??Ĕ?’????000000?Ғ????’?????ŕ???͝?TTTTTT?Ĕ??Ó?Ó??????Ǘ?Ó??Ĕ????’?????’??’?’????Ĕ???’??˛??????Ș??ŕ?Ĕ??Ó?˛???Ɩ??Ĕ?Ó?Ó??????Ǘ?Ɩ??Ɩ??Ǘ??Ǘ????ə?ə??̜??̜???Ξ?PPPPPP?͝?ʚ??͝??͝??Ξ???А?PPPPPP?PPPPPP?ϟ?RRRRRR?ϟ?QQQQQQ?????ϟ??ϟ?PPPPPP?Ξ??SSSSSS???PPPPPP?ə??Ξ?А??RRRRRR????Ғ??RRRRRR?UUUUUU??WWWWWW??ۛ??А?̜??PPPPPP?А?RRRRRR?Ξ???????????’?’????Ξ???????Ó????????????Ĕ??????????’???????????????????’??’?????????????̜??’?̜?????Ɩ????ŕ?Ɩ???͝?֖??ٙ??ϟ??’???Ĕ???????Ɩ???Ó?????Ĕ??’?PPPPPP???Ș??Ĕ?Ǘ?Ĕ?̜????Ĕ???ə??’?Ó??ŕ???Ó???’?Ɩ??Ǘ??Ș?ʚ?ə?Ɩ??ŕ?̜?ŕ?̜?ŕ?Ɩ?ŕ?’?Ĕ?ə?Ǘ??ŕ??Ɩ???Ĕ????Ǘ????Ș???Ǘ???Ɩ??Ǘ??Ԕ??TTTTTT?Ғ??͝?????̜??͝?ʚ???˛?ϟ???PPPPPP??QQQQQQ????SSSSSS??QQQQQQ??˛?͝?А???RRRRRR?RRRRRR???͝?ϟ?ϟ??͝?????Ԕ????TTTTTT???RRRRRR?????Ξ????ʚ???Ɩ??ə??Ș?’?Ó?Ó?Ĕ?ŕ???Ɩ????????????????????????????ʚ?????????????Ó???????Ǘ?Ĕ???????????????ŕ????????Ɩ?Ǘ?Ș??Ǘ??ʚ????˛?̜???Ɩ?Ɩ?ŕ?’?????’?ŕ??????’?Ó????????ё?֖?Ĕ?ŕ?Ĕ?ϟ????????Ǘ??Ó??Ɩ?Ó??Ó???Ó??Ĕ?ŕ???Ǘ??͝??Ĕ???Ɩ?Ɩ?Ó??ŕ??ŕ????????ŕ?ŕ??ŕ??˛?Ǘ??ʚ???Ș?Ș?????˛?ə?Ș???Ξ????͝??͝??ə?ʚ?˛????QQQQQQ??PPPPPP??ϟ?PPPPPP??Ғ???͝??˛??Ғ?SSSSSS??PPPPPP?ϟ?̜??ϟ?ϟ??Ξ??̜?Օ??VVVVVV???PPPPPP?WWWWWW??ӓ??ё?Ξ?ʚ??Ξ????Ǘ?˛?˛?ʚ?Ɩ??ə???’?Ĕ?’?Ó??????????????????????????Ó????????????????????Ǘ????????????????????????Ξ??˛????Ș?Ǘ????˛??Ș?˛?Ԕ??˛?Ș??Ǘ???’???????????Ǘ?Ǘ????Ǘ???Ɩ?Ɩ?Ș?????Ó?Ó??RRRRRR?Ó?’??Ó?А??Ĕ?Ĕ?Ó?????’????Ĕ???Ǘ??Ɩ?ŕ?ʚ??͝??̜??Ĕ?Ɩ?ŕ?Ɩ?Ș???Ǘ?????Ǘ??Ș?͝?Ș??Ș?ʚ???Ǘ????Ɩ??˛???ə?UUUUUU???Ξ?Ξ??????ə?ʚ?̜??ё???QQQQQQ?TTTTTT?ё?PPPPPP??RRRRRR??PPPPPP???Ξ????Ғ?Ξ?ϟ?˛??PPPPPP?А???????Օ?VVVVVV??TTTTTT?SSSSSS??SSSSSS??Ξ????Ș??Ǘ?ʚ?PPPPPP????Ǘ?Ɩ?Ξ?Ξ?̜?Ĕ?’?Ó???’??????????????????????Ó???????????’???????????Ĕ????????Ǘ??Ĕ?RRRRRR?͝???????Ĕ?ŕ?Ó????Ɩ??Ǘ?˛?Ș?А?Ξ?͝?ё????͝?ϟ????Ǘ?ŕ?Ș?ŕ?????Ǘ???????Ó?Ĕ??’??Ĕ?’??Ó??’?Ó??Ĕ??Ĕ????Ó?Ó???????ŕ?Ɩ??Ĕ?Ɩ??Ĕ?ə??Ĕ?PPPPPP?Ș?Ɩ?Ó?Ó?Ĕ?Ó?Ș?ܜ??Ɩ????Ș?Ɩ???Ǘ??̜????ə??̜?ʚ??˛?Ș??ə??Ș?ʚ?ʚ?Ș?ə?̜?̜??ə?ə?Ξ???ʚ?˛?Ξ?͝??Ξ?Ξ????̜?͝?PPPPPP?ϟ??ϟ????QQQQQQ?SSSSSS???ϟ?Ξ???QQQQQQ?PPPPPP??ϟ???͝?Ξ?Ξ??Ș?Ó???TTTTTT????Ԕ??VVVVVV??А?QQQQQQ?Ξ??̜?Ǘ??Ξ?ʚ???͝??ŕ???͝?Ș?ŕ???Ó?Ĕ?Ó???Ĕ???ŕ?????????????ʚ???????????????????????????????’??’????’???????Ĕ????’?ŕ??Ó??ϟ?ə?ʚ???ŕ?Ɩ?ʚ?VVVVVV????????Ɩ?Ǘ???ŕ??Ɩ??Ó?’?Ĕ?Ɩ?ŕ????????Ĕ?Ĕ?ŕ??Ɩ???’?Ĕ???Ó?????Ș?Ó???Ó?Ó??Ĕ?Ǘ?ə?Ĕ???????ŕ???Ɩ?Ș??Ǘ?ŕ???Ǘ??Ǘ?̜???Ǘ???ʚ?ə?Ș?˛?͝?˛?ʚ?̜??ə?Ș?ə?Ș??˛?ʚ?ə??˛??Ș?А??˛??˛????̜?̜?ʚ?ʚ????????ё??А??SSSSSS?QQQQQQ?QQQQQQ?ϟ?А?͝????ٙ???͝????͝?ϟ?ə?Ǘ?ə???SSSSSS?֖?Օ?Ԕ??Ԕ????Ξ??͝?PPPPPP?Ș?Ɩ????????????Ó?’?Ĕ?Ó????’??Ǘ????????’?’??Ó?’??’?Ĕ??????????????????????Ș?Ĕ??Ó????’????’???????????’???????͝??PPPPPP?ə???Ș?WWWWWW??333333????Ғ?Ǘ?ŕ?Ɩ???’???Ĕ?Ĕ?Ó?Ĕ?????????Ĕ??Ó?XXXXXX?Ĕ???Ó?Ĕ????’??Ĕ???Ș??ŕ?????Ĕ???Ó????Ĕ?Ó?Ó???Ǘ?ʚ??Ǘ?ə?Ș?????ʚ??Ɩ?Ǘ?˛??ə?ʚ?Ǘ??ʚ?Ș?Ǘ????̜?̜????ʚ??PPPPPP???˛?˛??Ξ?˛?ʚ??Ș?Ξ?А?ё?Ξ?PPPPPP???Ξ???͝??Ԕ??QQQQQQ?Օ??Ξ??ё?QQQQQQ?А?PPPPPP??ϟ?Ԕ??ё??͝???Ξ???Ξ?˛?˛?????ޞ??VVVVVV???SSSSSS???ϟ??ʚ?̜?̜??˛??̜?Ș?Ș???ŕ?Ĕ???Ó?Ó?Ó??’?’??’????’?Ĕ????????????????????????????????????Ǘ?Ó???????’?????Ĕ????????Ó???Ĕ??Ș??Ș?˛????RRRRRR??꺺???ϟ?Ɩ?Ș???Ó???Ĕ?ŕ??Ĕ??????Ĕ??’?Ó??Ĕ??Ó?Ó??????Ó??’?Ó??Ó?Ó???ŕ???’?Ĕ??Ĕ?ŕ?Ó??ŕ???ŕ???ŕ?Ĕ?Ĕ?͝???Ɩ?Ǘ?Ǘ???Ɩ?Ǘ?̜????Ș?ʚ??ʚ?PPPPPP????Ǘ?ʚ????PPPPPP??ʚ?̜?͝??̜?˛?̜??Ξ???͝???˛?˛???͝?QQQQQQ?Ξ???RRRRRR?͝????ϟ?PPPPPP???PPPPPP??QQQQQQ?RRRRRR??Ξ?А?А?Ξ??ϟ?А??Ғ??PPPPPP???Ξ??ə???ח???????Ԕ?Օ?ӓ?ё??Օ?͝???Ξ?ё??QQQQQQ??͝?UUUUUU?Ǘ??ŕ???Ĕ??’?????’??Ĕ?????????????????Ó????????????’???Ǘ?ŕ???Ó??VVVVVV?ŕ?Ĕ????Ó??????˛?????????Ĕ??Ó?Ș?ə?Ĕ??Ĕ???QQQQQQ?Ғ?000000?ۛ??ᑑ??̜????Ĕ?’????????Ɩ??Ĕ????ʚ?Ĕ??’??Ĕ?Ó?’?Ó??Ó?Ó?Ó????Ó??ŕ???ŕ??Ɩ?’??Ɩ??Ǘ???’??Ɩ?Ɩ?Ĕ?Ɩ?˛?????Ș?Ș?Ɩ??ə??Ǘ?ə?͝?????̜???ϟ??ə??ə?ʚ??ʚ?Ș?˛????͝???˛?ϟ?Ξ??????Ξ??ʚ??Ξ??͝??Ξ??QQQQQQ??????QQQQQQ?QQQQQQ?А????ӓ??֖????ϟ?PPPPPP???PPPPPP?QQQQQQ?Ξ?͝?͝?̜??ə??ʚ???Ԕ?UUUUUU??֖?Ԕ??TTTTTT??????Ξ??Ξ?ʚ?ə??Ș??ё??Ĕ?Ɩ??Ș??Ó?Ó???Ғ?Ɩ??Ĕ?????Ó?????’???̜???????????????????????????̜?Ș???????????Ó?ŕ????’?Ó????Ó??ʚ????’??Ғ?SSSSSS?______?^^^^^^???ə?????ʚ??Ɩ???Ĕ?Ɩ?????Ó???Ĕ?Ó??????Ɩ??Ĕ??ŕ??ŕ??Ó??ŕ?Ɩ??Ɩ???ŕ?????Ɩ??Ó?ŕ?Ĕ?Ĕ???????˛???̜??ϟ?̜?ʚ??̜??ϟ?ϟ?Ξ??Ξ?ʚ?????̜?????Ǘ?ʚ?ʚ?Ξ????ϟ?QQQQQQ???QQQQQQ?А?SSSSSS?????˛?͝???????????А?ϟ?????PPPPPP?Ξ?А????ϟ????QQQQQQ??Ξ?ϟ?????Ξ?͝?̜??Ǘ???Ԕ?Օ?ښ?֖?ӓ?Ԕ????֖?̜????̜??ʚ????Ĕ?Ǘ?ə?Ɩ??ə?˛?ŕ??Ĕ??’??Ó??’???????’?Ĕ????????’??????????????????????ə???’??????ŕ?????’?????????’?’??’???ŕ???͝?SSSSSS????Ξ?ё??ə?ə????Ĕ?Ș?Ǘ???Ș???Ĕ????????Ĕ?Ɩ?ŕ??ŕ??Ǘ??’??Ǘ?Ǘ???Ǘ??Ɩ???Ș???Ș?Ɩ??ŕ?ŕ?Ǘ?ŕ?Ɩ??Ɩ?Ɩ?Ǘ?ʚ???Ș?????ə???ʚ???ʚ??ə?̜?͝?ϟ?˛??Ξ?PPPPPP??ə????̜?͝?Ԕ??Ξ?PPPPPP???˛?ʚ?Ξ????̜???̜??̜??̜?????QQQQQQ?Ξ?????͝?Ξ?А??Ξ??RRRRRR???А?ё??PPPPPP?QQQQQQ?ϟ?͝?Ξ?ϟ?А?ё?PPPPPP?̜?̜?͝?ə??ϟ?TTTTTT???ӓ???ח???̜?PPPPPP??ϟ?????Ǘ???Ǘ????Ș??̜????ŕ?ŕ?Ó?’?Ș??????????Ĕ??’?????Ó????????????ϟ???Ó???Ĕ?’??????????’?Ó?????????????Ó?ŕ????????’???Ǘ?ʚ????ӓ??Ǘ?̜?Ș??Ǘ?Ɩ??Ó??ə?Ǘ?А???Ĕ???????ŕ??Ɩ?ə???ŕ???Ǘ??Ǘ?Ɩ????Ɩ??Ǘ??Ǘ??Ɩ??Ĕ??????Ș?Ǘ?Ș???ə?Ǘ?Ǘ?Ș??ʚ?ə?Ǘ???????˛?ϟ?˛?˛??ё?͝?ə??ʚ??ʚ?͝????̜??WWWWWW????ʚ?̜???Ξ?Ξ?͝??А???Ξ???͝???͝?А?PPPPPP?PPPPPP??PPPPPP???????ϟ?А?QQQQQQ?RRRRRR?QQQQQQ?????PPPPPP????ϟ???ϟ?͝???Ξ?PPPPPP??Ғ?PPPPPP???ؘ??ё?Ξ??Ξ?Ғ?RRRRRR?????А?ə?Ǘ?Ǘ?ʚ?Ǘ?Ó????ŕ???????Ǘ?Ɩ??’???’????˛?????????????Ǘ?????Ǘ?Ș?Ĕ?’??????’????????Ǘ????????Ó????ʚ??’??Ó????Ĕ????Ó?ŕ???̜?PPPPPP?ӓ?Օ?Ғ?RRRRRR?ё?͝??̜???ə?Ǘ???Ǘ?˛??Ĕ?Ɩ?ŕ??Ĕ?Ó?Ɩ???Ɩ?Ɩ??Ɩ??Ɩ?ʚ?̜????Ǘ?ə?Ɩ?Ǘ????ŕ?Ɩ??͝?Ǘ?Ș??ŕ?Ɩ???Ș?Ɩ??Ǘ?Ɩ?????Ǘ?ə??Ǘ??˛?Ș??ə??̜?ښ???̜?А?Ξ????Ɩ?̜??Ș?Ș?ё?????Ξ???ʚ?ə??ə???PPPPPP??А??̜??˛????˛????PPPPPP?QQQQQQ????ʚ?ϟ?PPPPPP?ϟ?????А?PPPPPP?PPPPPP?PPPPPP???QQQQQQ?ё??PPPPPP???PPPPPP??А?????ח??TTTTTT?ZZZZZZ??PPPPPP?ё???RRRRRR?PPPPPP??PPPPPP??Ș?ʚ??Ǘ??Ș?ŕ?Ǘ???Ș?А?????????’?Ĕ?’?’???Ĕ????Ɩ????͝????????????’???????????Ó???Ó?????????????????’??’????Ó?’?Ĕ?’??Ó?ə?QQQQQQ?RRRRRR?RRRRRR???Ғ?Ԕ?Ғ??Ǘ?ʚ???ŕ???̜?˛???Ɩ????ŕ??ŕ?ŕ?Ǘ??Ɩ?ʚ?Ș??Ǘ?Ș???Ǘ??Ǘ?˛??Ξ?Ɩ?Ș?Ɩ?Ɩ?Ș?˛?Ξ?ʚ??ʚ??Ș????Ɩ??̜?????Ș?ʚ??ə???Ғ?Ș?Ș????͝?А??Ԕ?̜??ə?????ə??˛???PPPPPP?Ғ?͝???̜?RRRRRR?˛??̜??̜?TTTTTT????А??̜?˛??˛???֖????˛????ϟ?Ξ?͝??ё?Ғ??А?????ϟ???ё????А??????Ғ?QQQQQQ??????А?SSSSSS?Ғ??А?ӓ?˛?ʚ???Ș?ʚ?Ș??Ɩ?Ɩ??ə?ʚ??͝?̜?ə?Ĕ???????????ӓ?RRRRRR????Ɩ??’?Ǘ??????????????RRRRRR?ё???????ё??????????????Ó??????Ó???Ó?’??’??Ĕ??ŕ?Ĕ???ϟ??ښ?斖??XXXXXX?SSSSSS??͝???ϟ?ŕ??Ǘ??Ɩ??Ǘ?ʚ???Ó???Ǘ?Ξ??Ɩ???Ș?˛??˛?ə?????Ɩ?Ș?ʚ?ə?ʚ????А?˛?̜?˛???????А?ϟ??ə?ʚ??˛???Ș??Ǘ?̜??̜?QQQQQQ?ϟ?̜???ʚ??UUUUUU?TTTTTT????????Ș?ə??̜???͝?Ξ?ʚ??А???????ё??ё??˛??͝??̜?̜?˛?˛???Ξ???˛??????ϟ????SSSSSS??ϟ??PPPPPP??????QQQQQQ??Ғ?ё?͝?Ξ??ӓ??PPPPPP?А?ё??Ғ?֖?????ӓ?Ғ????̜?ə?ə??Ǘ?Ɩ???ŕ???Ԕ??ə?ŕ??Ó???????????????????’?Ǘ??????????Ξ??˛?Ó?Ǘ?????Ĕ???????????????????Ó??????ŕ??’?Ó?Ĕ???Ș??ϟ??ߟ?꺺?ZZZZZZ?[[[[[[?QQQQQQ?ё?А??Ξ??̜?Ș?Ǘ????Ɩ?Ĕ?Ɩ??ŕ??ə?ə????Ɩ??ə???ё?ə?Ș????Ξ???ə?Ș?ʚ??͝?ʚ??ϟ?PPPPPP??А?А??QQQQQQ???ϟ?А?????̜???Ș?ə??Ș?Ș???˛??͝???ϟ????ʚ?????Ǘ??Ș?Ș???ϟ?ʚ???А??????̜??ϟ??ӓ?͝?Ξ?Ξ?PPPPPP?͝???̜??А????͝?͝??ϟ??Ξ?RRRRRR?QQQQQQ????ӓ?А?ϟ?ё?PPPPPP?QQQQQQ?ё?ϟ??А?TTTTTT??ϟ????֖?Ғ?Ғ?SSSSSS?QQQQQQ???SSSSSS?ח?ZZZZZZ?XXXXXX?TTTTTT?????ʚ??ʚ????ŕ??Ɩ?Ǘ??ᑑ??ə???ŕ???’?’????Ǘ?Ó??Ș????????’?????????????????˛???Ș?ŕ????????????’???ŕ???Ĕ????Ĕ??’???’?Ĕ??????ϟ?Օ???555555?XXXXXX???ʚ?͝???˛???Ș??Ɩ?ŕ?Ɩ??А??Ǘ???ə??ʚ?ʚ??Ș?Ɩ??Ɩ?ə?ə?ə?А?PPPPPP???̜??˛??̜???̜??Ξ??֖?Ξ????ʚ?̜?Ξ?͝??ʚ???ʚ?ʚ??ə???ə??ə?ə??̜??ʚ??ϟ?А?͝??WWWWWW?Ғ?PPPPPP?˛?ʚ???ə??Ǘ?ʚ??˛??А??͝??ё?А??А???UUUUUU?PPPPPP??ё?͝???PPPPPP?Ξ?Ξ??QQQQQQ?Ξ?͝?͝???̜?PPPPPP??RRRRRR?PPPPPP?ח?PPPPPP?ϟ???А????А?PPPPPP?PPPPPP??ӓ?А??PPPPPP?PPPPPP?ϟ??ӓ?PPPPPP?Ғ??Ξ??Ғ???111111????͝??ʚ?Ξ?А?Ξ?ə?Ș?Ɩ??ŕ?ə?[[[[[[????’??’???Ĕ??’?????????????’??’???ʚ????????????’?ŕ?????????????????’?????’???????’???Ó???Ɩ???ё??ܜ???ٙ??ё???ə????PPPPPP?˛?ʚ???ə?Ξ??Ɩ??????˛?̜?˛?ə?̜??ʚ?ə???ə?̜?̜?ə?Ξ???͝?????̜?TTTTTT?SSSSSS?˛???͝?ʚ???˛????ʚ?ZZZZZZ?Ξ???͝???ə?????Ș???Ǘ?Ș???ϟ??ʚ?ʚ?????ə?͝?Ș???Ԕ??PPPPPP?QQQQQQ???͝?̜????ϟ?Ғ?QQQQQQ??̜??Ξ??ϟ?PPPPPP????˛?̜?Ξ??ʚ?Ξ???А?Ғ?QQQQQQ?QQQQQQ?Ғ???А?PPPPPP??QQQQQQ?QQQQQQ?А?͝?PPPPPP??????ϟ???̜??Ԕ?PPPPPP?А?UUUUUU?[[[[[[?????Ԕ???ə?˛???ʚ?Ĕ??Ɩ?Ɩ??Ș?Ɩ?????Ó?Ĕ?’?’?Ĕ??’?Ó???????????Ó?Ĕ???ʚ????????ə?????????????????????????ŕ?????’???Ș?Ɩ?’???’?Ó??QQQQQQ???˛??֖??Ԕ??ё?Ξ???Ɩ?Ɩ????VVVVVV??????Ǘ?????Ó???ə?ʚ?Ș?Ș?ʚ?Ǘ?????̜?̜?Օ????͝?̜??̜?ϟ?˛?͝??˛?ʚ???̜?ʚ???˛?ʚ???Ξ??Ξ????ʚ?̜?˛????ʚ?Ș??????Ԕ??Ξ?ϟ?ə??ə?ə?Ɩ?ʚ??Ș?ʚ?˛??ё??Ɩ?Ǘ?Ș?ə???RRRRRR?ё?PPPPPP??А?̜???̜???Ξ??ʚ??˛????ʚ?Ξ?Ғ?ё??Ғ?WWWWWW?ؘ?ӓ????Ξ?А?QQQQQQ????ϟ?ϟ?RRRRRR?QQQQQQ??̜??͝?˛???ё??TTTTTT?֖??111111??TTTTTT?TTTTTT?TTTTTT?А????ʚ??Ǘ????Ɩ?Ó?????ə??????’????’??Ó????ŕ?ŕ?Ɩ???Ó??˛????????????????????????Ó??????ŕ???????’?????????Ó??Ɩ?????͝??Օ?TTTTTT?PPPPPP?ə??ə?̜?ё?˛?ʚ?ə??˛?ə???͝?Ĕ?Ɩ?Ǘ?Ș????̜?͝?˛??ə?ʚ?ʚ?PPPPPP???PPPPPP??˛?ϟ?А?͝??????ʚ?ʚ?˛?͝?͝?͝?˛?˛??̜??А?????̜???̜?А?Ξ?͝?Ξ????ʚ?????Ș?Ș?̜???͝???Ξ?????Ș??Ș?˛?͝?̜??PPPPPP?Ԕ?Ș???̜????А?А?????Ξ??ϟ????Ș?Ș?̜?А?ə?Ș??Ғ??????????ϟ??????А?Ξ??????А???Ǘ?ə?ə?ϟ?YYYYYY?ܜ??ח?Օ?QQQQQQ???͝?˛?̜?ə???Ɩ??Ĕ?Ó?’?Ĕ?Ĕ??Ɩ?ŕ?Ó?????’?Ó??Ĕ??????’?????ё????????????????????Ĕ?????????Ǘ????Ĕ???Ó???????????Ó?ŕ?????Ξ???????TTTTTT???ϟ?ϟ?QQQQQQ??̜?ə??ʚ?ʚ????Ș?ŕ???ə??Ǘ?ə?ə?ʚ?ʚ?͝??VVVVVV????͝?˛?͝??Ξ?????Ξ????Ξ?ϟ?А??͝??͝?Ξ?ϟ?͝?Ξ?А????͝????ϟ????̜?̜?˛?ʚ??˛?̜?????????̜?̜????ʚ??????PPPPPP?ӓ?ؘ???ʚ??PPPPPP?͝????Ξ?QQQQQQ??̜?̜?ə???VVVVVV?ϟ??Ș??͝????˛???ё????QQQQQQ?А??PPPPPP??Ξ?ϟ???ё???QQQQQQ??YYYYYY?SSSSSS??͝?Ǘ?ŕ??Ǘ??ؘ??YYYYYY?^^^^^^???ё?͝??̜?ə??ə?ə?Ĕ??ŕ?Ĕ?????Ɩ?ŕ?Ɩ???Ó?Ĕ?Ó?Ó?’??????’?Ó?Ǘ?Ǘ??Ԕ??Ĕ????????Ɩ?Ĕ???????’?????????Ĕ????????’???Ĕ?Ɩ??????Ó??ə???Ó??’??Ǘ?Ó??̜??QQQQQQ?WWWWWW?PPPPPP?̜?????ϟ?UUUUUU??˛?̜?ʚ???˛?˛??ʚ?ə?????͝??PPPPPP?А?Ξ??ё???PPPPPP???Ξ?А?Ξ???????QQQQQQ???ё?PPPPPP???PPPPPP????А?PPPPPP?А?А????͝??˛??TTTTTT???ʚ???˛?Ξ?˛???˛?PPPPPP???UUUUUU??̜?͝??˛?͝?????ʚ?͝??͝?PPPPPP?ʚ?͝?Ξ??̜??͝?͝?˛??ё?ϟ?PPPPPP?ʚ???????Ǘ?ʚ??̜?̜??̜????ё???А??А?QQQQQQ?????PPPPPP??QQQQQQ?ё???Ғ??QQQQQQ?Ξ????ϟ???Ԕ???Ԕ????˛???Ș?ʚ????Ɩ?Ó???ŕ????Ĕ??ə????Ĕ??’?’????????’??ʚ?͝??ə??Ĕ???ŕ?????????Ó????RRRRRR?????’????????????Ɩ?Ĕ???????????’?ŕ?Ĕ??Ĕ???˛?ϟ?ϟ????˛?˛??А?̜???????Ș?ʚ??ə???ʚ?̜?Ξ?PPPPPP???А?????PPPPPP???ё?Ξ???Ξ?Ξ??А?А???ӓ??А??А???А?Ξ??QQQQQQ?SSSSSS???А??͝??͝??͝??ə?˛?˛?ʚ?ʚ?˛??????̜?ё?QQQQQQ???QQQQQQ??̜?͝??ё?ə?˛??̜?ʚ??̜????ё??ə?˛??ʚ?ӓ?????˛?Ξ??ϟ?ё?PPPPPP?ʚ?ə?ʚ?̜?̜???͝??˛??QQQQQQ?PPPPPP?PPPPPP?PPPPPP?ϟ??QQQQQQ?PPPPPP??QQQQQQ??ё?А?QQQQQQ???RRRRRR?ӓ???̜??Ξ?VVVVVV?Ԕ???͝????Ғ??А?PPPPPP??ʚ?ə?Ș???????Ǘ???Ĕ?Ó?Ĕ???ŕ??’?’?Ɩ??Ó??Ĕ??Ó?’????’?͝?ښ?ߟ?͝??’???????????’????’?Ɩ?ŕ?????’?RRRRRR???’?Ξ?˛??ŕ?Ó??ʚ??’?????’?’?Ó?????Ó??Ĕ?Ș?Ș??ə???̜?͝??А???ϟ?̜????Ξ?Ǘ?Ș?˛?͝??????QQQQQQ?QQQQQQ?А??PPPPPP??QQQQQQ?ё?????ё?ϟ??QQQQQQ?QQQQQQ???ϟ????SSSSSS?ӓ?RRRRRR???QQQQQQ??ё???ϟ???PPPPPP???ϟ??̜??˛???ʚ??͝????˛?Ξ?̜??????Ғ??̜?͝?ё?ё??QQQQQQ???̜??͝?SSSSSS?˛?Ǘ?ə?˛??Ș?ə??Ғ?ϟ?ə???PPPPPP?̜???????ӓ???˛???͝???̜?ϟ?А??PPPPPP?ϟ???ё???QQQQQQ??RRRRRR?PPPPPP??PPPPPP??SSSSSS???̜??Ș?ϟ?ϟ?QQQQQQ?XXXXXX??ё?????ё?PPPPPP???͝?ə??Ș?ŕ??Ș?????Ó?Ĕ??Ĕ?Ɩ???’?Ș?’?Ó??ə???’??’??Ó?Ó??ߟ?˛??ŕ????’?????Ɩ?Ó?̜??̜?????????????Ó?˛????Ș?????Ó?Ĕ??Ǘ?’??Ó???’???ŕ?ŕ?Ĕ?Ǘ??Ǘ?Ǘ?ə?ə?????QQQQQQ?͝?̜????Ș??˛?Ξ?̜?????PPPPPP?ϟ?XXXXXX?\\\\\\???А?А??Ғ?Ғ???Ԕ??WWWWWW??VVVVVV??Օ?Ғ??RRRRRR?ё?PPPPPP????TTTTTT??Ԕ???Օ??????????Ξ?Ξ?͝?Ξ????˛?˛???˛???˛?ʚ?̜?Ξ??Ξ??͝?ϟ?RRRRRR?QQQQQQ??QQQQQQ?̜??ə??͝??TTTTTT?А?˛?Ξ?͝??ϟ?Ғ?̜?̜???ə???͝?̜?͝?̜?̜?ϟ????Ξ????RRRRRR?̜?˛?RRRRRR?ϟ?А?PPPPPP?Ξ?А???QQQQQQ??SSSSSS???RRRRRR??QQQQQQ?RRRRRR??ϟ???˛?Ǘ??ə??QQQQQQ?RRRRRR?Օ??Ԕ?֖?А?ϟ?˛?͝???Ɩ????Ș??Ǘ??Ó????ŕ??’?????Ɩ?Ɩ?Ó????Ó?Ĕ?Ó???ŕ?Ǘ??ŕ?????????????????’????????????ə???Ĕ?Ĕ?QQQQQQ?????Ó?????ŕ????ə???ŕ???Ǘ???̜???PPPPPP?RRRRRR?͝?˛???ϟ?ə??ʚ?͝???Ξ??͝?QQQQQQ?PPPPPP??????PPPPPP???SSSSSS???Ғ?Ԕ?Ғ?RRRRRR???ZZZZZZ?????TTTTTT?ӓ??ӓ?Ғ???TTTTTT?RRRRRR?UUUUUU??UUUUUU??RRRRRR?PPPPPP?А??ё?QQQQQQ???PPPPPP???А??Ξ?Ξ?Ξ?Ξ?Ξ?Ξ???˛?̜?ʚ?˛?Ξ?ё?PPPPPP?PPPPPP???͝??PPPPPP??˛???Ξ??SSSSSS?UUUUUU??Ξ?Ξ?͝?͝?Ξ?PPPPPP?Ξ?͝???ϟ??ϟ??̜???͝?ϟ??????VVVVVV??ё?Ξ?˛?ϟ?????А??А??Ξ???QQQQQQ?RRRRRR?QQQQQQ????QQQQQQ?PPPPPP?͝?˛???ə?̜???Ғ????ӓ?А???˛?̜?ʚ??˛?ə?ə????ŕ??’???’??Ó????Ó?Ĕ????ŕ?Ĕ??Ș??????ŕ????????ʚ??????ə??ŕ?Ó??’??????????’?̜???ŕ?Ĕ??’??Ó?Ó??˛?????’?Ó????Ĕ?Ɩ??͝??????Ԕ??ʚ??͝???̜??͝??ё?ё??Ξ???ϟ?Ξ????QQQQQQ??Ғ???RRRRRR??ӓ???UUUUUU?ܜ??ӓ????ӓ??ӓ????Ԕ?TTTTTT????ё???ӓ?Ғ??????ё?PPPPPP?А?PPPPPP?PPPPPP?ϟ?А??ϟ?Ξ?ϟ?QQQQQQ?PPPPPP????Ξ??̜????ӓ?????PPPPPP?ϟ?Ξ?͝??QQQQQQ?ё????????̜?TTTTTT?͝?????͝?ё?Ξ????֖??А?PPPPPP?ё????Ԕ?Ξ??ϟ?А?̜?А?ё?Ξ?А?????Ξ??Ғ?ё?QQQQQQ?ё?RRRRRR?ё?ϟ??PPPPPP?ʚ?Ș??͝?????Ԕ?Օ?????Ξ?ʚ?̜???Ɩ??̜?Ɩ???ŕ?Ǘ?ŕ????’??’?’???Ó?Ó??ϟ???А?????ʚ?’?’??Ș??????????????Ĕ?????????????Ș?ə?Ĕ?ə???Ĕ??’???Ó????????’?Ǘ?Ɩ?ʚ?˛?????SSSSSS??ё???PPPPPP??͝????ϟ???ϟ?ϟ?WWWWWW??ϟ?ӓ?˛?Ξ?̜????ё??QQQQQQ??????????PPPPPP?А?TTTTTT??ӓ?SSSSSS?Օ?TTTTTT??ӓ???????QQQQQQ?TTTTTT?А?PPPPPP?ϟ?????Ғ?ё????ϟ?А?А??QQQQQQ?PPPPPP??Ғ???PPPPPP?А???????ё???А?ё?ϟ???PPPPPP?QQQQQQ?ё??QQQQQQ?RRRRRR??ϟ?͝?˛???̜??Ξ?ϟ?̜?Ξ??ё??PPPPPP??XXXXXX?ё?Օ?PPPPPP???ϟ?RRRRRR???Ξ?Ғ?RRRRRR?А????ё?QQQQQQ???????RRRRRR??ё?ё??ϟ?Ξ??????ʚ?̜?QQQQQQ???ё?PPPPPP???̜???Ǘ?Ș??Ș??Ǘ??Ĕ?Ĕ??Ó???????????’??ə?Ș??????’??Ɩ??????????Ĕ?̜?????????’?????????Ǘ???Ĕ?????Ξ???Ĕ?????Ĕ??’?????͝?ə??Ξ??Ғ?Ғ?????QQQQQQ??ϟ??PPPPPP??PPPPPP?Ξ?̜?̜?PPPPPP???PPPPPP???ϟ??QQQQQQ??PPPPPP??PPPPPP???ښ?ӓ?WWWWWW?ӓ???Ғ?SSSSSS???SSSSSS??VVVVVV?????ӓ???Ԕ?Ғ?А?ϟ??????Ғ?TTTTTT?Օ?TTTTTT??Ғ???Ғ??QQQQQQ??ё???RRRRRR???Ԕ?RRRRRR??QQQQQQ??А??ё???RRRRRR??Ғ?ё?QQQQQQ??RRRRRR??RRRRRR?SSSSSS?QQQQQQ??PPPPPP?ё??Ғ?Ξ??͝????̜??А?͝??PPPPPP?ϟ?ϟ??Ԕ???????͝???QQQQQQ??ё??PPPPPP?PPPPPP??А??SSSSSS??????Ғ??RRRRRR?А??PPPPPP??????ϟ?̜?Ξ???????͝?ϟ??Ǘ?????ϟ?Ĕ?Ĕ?ŕ?˛?Ó??Ó????’???Ó?’?’?ŕ??UUUUUU?Ĕ??ŕ??’?????’??Ĕ?Ĕ?????????Ó?Ó??????Ó???????ʚ?????ŕ?Ĕ???Ԕ??Ó?Ó??’????Ĕ????͝?Ξ?VVVVVV?ʚ?ʚ?˛???ӓ????ё?PPPPPP?˛?͝?????RRRRRR??Ξ?Ξ?ϟ??А??Ԕ?Ԕ????А??UUUUUU??QQQQQQ????Ԕ??SSSSSS?SSSSSS?ӓ?RRRRRR???UUUUUU?TTTTTT?Ԕ?ח??TTTTTT??ӓ?SSSSSS?TTTTTT?ӓ?Ξ??Ғ?WWWWWW?ٙ?ё?ё??UUUUUU??VVVVVV????RRRRRR??TTTTTT????RRRRRR?QQQQQQ?ӓ???QQQQQQ?Ғ?ё?ё?Ғ???RRRRRR??SSSSSS???SSSSSS?TTTTTT?RRRRRR?SSSSSS???ё????ϟ????Ғ?͝?̜???ϟ?PPPPPP?͝??QQQQQQ?Ξ?PPPPPP?Ξ????А?PPPPPP????ϟ?ϟ?Ξ?ϟ??????А?ё?А?SSSSSS?Ԕ?SSSSSS?QQQQQQ?А???ё?ё??ё????Ș???˛???͝?͝?PPPPPP?͝?ё??ϟ??PPPPPP?????ʚ?????’?????’?????Ș???Ó??Ǘ??’?ə???????????????Ó?????Ɩ????Ĕ??????????????’??Ó?͝?ŕ??ŕ?’?Ĕ?Ĕ?ŕ??Ĕ?ʚ?Ó???ʚ???̜??͝??ϟ???֖?QQQQQQ?RRRRRR?А??̜?̜?Ξ?̜?Ξ??ϟ???VVVVVV?SSSSSS?QQQQQQ???SSSSSS?????PPPPPP??QQQQQQ??????WWWWWW?SSSSSS?ӓ???Ғ??ٙ?֖?֖??UUUUUU????ӓ?Օ??TTTTTT?SSSSSS?UUUUUU???YYYYYY?XXXXXX??????֖???UUUUUU??֖???Ғ??ё?????????Ғ?Ԕ?????ӓ?Ԕ???ӓ???SSSSSS?QQQQQQ??Օ?Ԕ??QQQQQQ??Ԕ?RRRRRR????А??А?????ϟ??Ξ?PPPPPP????Ξ???PPPPPP???QQQQQQ?А??????RRRRRR???Ғ?А??PPPPPP?RRRRRR?ё?ё?RRRRRR?Ғ??А?Ξ?????˛??͝?QQQQQQ??ё???PPPPPP??А?˛??ə????????Ĕ??Ó????Ó??Ĕ????Ó???Ș??Ĕ??’????????????????ŕ?????Ĕ?????’?????????ʚ?’????Ó?Ĕ??Ɩ?Ĕ?Ó?Ɩ?????˛?Ș?˛??Ғ?RRRRRR?VVVVVV???RRRRRR??????͝???ϟ?Ξ???А?˛?Ξ?Ξ??PPPPPP??ϟ?PPPPPP?TTTTTT????Ԕ?VVVVVV???VVVVVV?TTTTTT?TTTTTT??ח?ٙ?֖??RRRRRR?Ԕ?֖?VVVVVV???ؘ??Ԕ?Ԕ?ӓ??UUUUUU??Օ?[[[[[[?Ԕ?Օ??WWWWWW??ᱱ?qqqqqq????ݝ??????UUUUUU?WWWWWW?Ԕ??Ԕ?SSSSSS?Ғ??TTTTTT?Օ???QQQQQQ?QQQQQQ???TTTTTT??TTTTTT??SSSSSS?ӓ???????SSSSSS?RRRRRR?SSSSSS??Ξ???PPPPPP?QQQQQQ??ϟ??А?А????QQQQQQ??PPPPPP?А?ϟ?А?PPPPPP?ϟ?ё?Ғ?Ξ?̜???QQQQQQ?ё?ё??ё?QQQQQQ?RRRRRR?????QQQQQQ?Ғ?ё?QQQQQQ?QQQQQQ??ё??RRRRRR?QQQQQQ?QQQQQQ????ʚ?Ǘ?͝?͝?ё?Ԕ?RRRRRR???А??А??ə?ə????Ɩ??Ș?Ɩ??Ǘ?????Ó?????’??Ĕ???????????????????Ó?Ó????ʚ???????’???’??Ĕ??????Ó???????’?Ǘ?Ó?А??Ɩ??˛??̜??PPPPPP??QQQQQQ?PPPPPP??QQQQQQ?ё?????͝?Ξ?PPPPPP?ϟ?ё??А??ё?Ξ?ё?PPPPPP????QQQQQQ??ё??Ԕ?֖?ߟ????ښ?VVVVVV???YYYYYY??֖???VVVVVV?XXXXXX???Ԕ???SSSSSS?SSSSSS??ӓ?Օ???ؘ??֖?WWWWWW???pppppp?ZZZZZZ?ZZZZZZ?ۛ?䴴???[[[[[[??????ח?Օ??Ғ??ӓ??UUUUUU????SSSSSS?????Ғ?ח?TTTTTT????Ԕ?Ғ???RRRRRR??Ғ?ӓ?QQQQQQ???̜?ϟ?ӓ?Ғ?А?А?Ғ????RRRRRR???ϟ????А???А?????͝?PPPPPP??UUUUUU?????RRRRRR??PPPPPP??ё?ё?ё?QQQQQQ??Ғ?Ғ?TTTTTT??QQQQQQ??ӓ??̜?Ɩ?Ɩ??ϟ?PPPPPP?TTTTTT??RRRRRR?ё???̜?Ș??Ș??Ș?ə??????’??’??’?Ɩ??????ё???Ĕ?ŕ?Ɩ??????????????PPPPPP???Ó?????Ó??Ĕ?????????????????????Ș?ʚ?ŕ?Ș?ə???ʚ?ʚ???͝??̜??Ξ??ؘ?Օ?А?Ξ?PPPPPP??ё??А?RRRRRR?QQQQQQ??А????RRRRRR???UUUUUU??Ғ?QQQQQQ?Օ?ర??111111???]]]]]]?ۛ?PPPPPP?^^^^^^?[[[[[[???YYYYYY?ZZZZZZ??ח?֖?XXXXXX??֖?????ח??ܜ??֖?WWWWWW????ZZZZZZ?^^^^^^?pppppp?ݝ?ߟ?rrrrrr?555555???????֖??֖?TTTTTT????Ԕ???Օ?????SSSSSS?RRRRRR??ӓ??Ԕ??????RRRRRR????RRRRRR?QQQQQQ?QQQQQQ?А????ӓ??Ғ??ё?ӓ??SSSSSS?А?PPPPPP?А?QQQQQQ?А???А?А?????А?̜???RRRRRR??А?ϟ?͝?PPPPPP??ϟ?А?А??ё???Ғ?ӓ?Ғ?RRRRRR?RRRRRR??А???Ș?̜?ё?ϟ?ё???ӓ?Օ?ё?А?˛??ə???ʚ??????ʚ?ŕ?Ĕ???Ó??Ĕ????’??’??Ɩ??Ĕ???’??????????ŕ???Ó??????ŕ???????’?Ó?????Ɩ???’?ə???’???ə?ŕ??Ș?Ǘ???ʚ?ϟ???͝?Ș??ʚ?̜?PPPPPP??TTTTTT???̜??TTTTTT??QQQQQQ??YYYYYY??ё?UUUUUU??Ԕ?QQQQQQ?RRRRRR?Ԕ??Ғ?SSSSSS??UUUUUU??xxxxxx??RRRRRR?]]]]]]???ᑑ?㳳?ޞ?[[[[[[?pppppp?ᑑ?ޞ???Օ?WWWWWW?YYYYYY?ZZZZZZ?YYYYYY??TTTTTT??ZZZZZZ?ZZZZZZ????ח?ח?Օ?Ԕ????YYYYYY?WWWWWW?PPPPPP?ߟ?000000???ٙ???ٙ????VVVVVV?UUUUUU?Օ?UUUUUU?XXXXXX??UUUUUU???VVVVVV??Ԕ?Ԕ????????Ғ?͝??ё??RRRRRR?ӓ?Ғ?Ғ?RRRRRR?QQQQQQ?SSSSSS??ӓ?RRRRRR?ё??ё???Ғ??ё??RRRRRR???А??А?PPPPPP?ё??А?QQQQQQ?Օ?Ғ??А?ё?QQQQQQ?А?Ξ???Ξ?ϟ???QQQQQQ??RRRRRR?Ғ?RRRRRR?RRRRRR?QQQQQQ?ё??ё????ӓ?QQQQQQ??RRRRRR?QQQQQQ?ӓ?RRRRRR?Ԕ??PPPPPP???А?Ξ???ə?˛??Ɩ?’??Ɩ??Ĕ??’?Ɩ???’????’?????????’?Ó?’???????’????ŕ?????’?Ǘ?PPPPPP?Ĕ?Ó??Ɩ???Ó???????ʚ?Ș????????Ɩ?ə???Ș??֖??˛?ə?ʚ??ə??Ș?ə?ʚ?ə?˛?˛?̜?А?А????RRRRRR??ё?ё?RRRRRR?ё?RRRRRR??RRRRRR??ӓ??ZZZZZZ?㓓?ᑑ?[[[[[[????Ⲳ??ర?XXXXXX??000000????UUUUUU????UUUUUU??ٙ?Օ?ښ??\\\\\\??ښ?YYYYYY?????ٙ?000000?ښ???ؘ??^^^^^^??ޞ?ۛ?ܜ?pppppp?ښ?YYYYYY?XXXXXX?XXXXXX?ח?YYYYYY??֖??֖??WWWWWW???ח?֖??Ԕ??Ԕ????ϟ??˛?ё?ӓ?Ԕ?VVVVVV?Օ??TTTTTT??]]]]]]?ZZZZZZ??QQQQQQ???????XXXXXX?ӓ?Ғ?????Ξ???QQQQQQ?ё?ё???˛????Ғ??ё?ϟ???Ξ??А???ӓ?RRRRRR???QQQQQQ??ӓ?RRRRRR???????Ғ??ӓ?ӓ?Ԕ?TTTTTT?Ξ???А??Ξ?ə?Ǘ???Ɩ?Ǘ?Ó??ŕ?Ó??ŕ??????????ŕ?Ɩ?Ó??????????PPPPPP?’???????ə?????????ʚ?ŕ????Ɩ??Ó?ŕ?’???̜??Ǘ???Ĕ?Ǘ??????Ɩ???Ɩ???Ξ?Ξ??ϟ?͝????˛???А?ϟ???А???????А?ё?????ٙ??ߟ??\\\\\\??YYYYYY????ޞ?ؘ??______??WWWWWW?ؘ?WWWWWW?VVVVVV??XXXXXX??VVVVVV???֖?WWWWWW??ؘ????WWWWWW???ZZZZZZ?______??ܜ???[[[[[[?ٙ??ۛ?ۛ?ݝ??ۛ??ۛ????XXXXXX?ZZZZZZ??ZZZZZZ??XXXXXX??WWWWWW??VVVVVV?Օ????VVVVVV?Օ??QQQQQQ?ё?RRRRRR?SSSSSS?ӓ???UUUUUU?ӓ?UUUUUU?Օ?VVVVVV?SSSSSS?RRRRRR???ښ??UUUUUU?Ԕ??ᱱ?Օ?SSSSSS?RRRRRR?ӓ??ё??TTTTTT?RRRRRR??RRRRRR?А??Ξ?Ș?PPPPPP?֖?ё??QQQQQQ??ϟ??ё?PPPPPP?͝??А??QQQQQQ??Ғ?Ԕ?ӓ?ӓ?RRRRRR??͝???͝?????????͝?PPPPPP?ϟ?̜?̜?ə?Ș??Ɩ?Ǘ?Ɩ?Ɩ?Ó???ŕ?’??’??????Ĕ??Ĕ?????????????Ĕ?’???????Ɩ???ӓ?????ŕ??Ó?????Ó????’?Ǘ??ŕ?Ș??’????????˛?ə?Ș?Ǘ??͝?˛?̜?̜?̜?ʚ??̜??Ξ?Ғ??ϟ??PPPPPP?͝?????ё?QQQQQQ?PPPPPP???ё???TTTTTT??Օ?ZZZZZZ????ZZZZZZ??ޞ????ؘ?YYYYYY?ٙ?????UUUUUU??WWWWWW???TTTTTT???Ԕ????ۛ???ZZZZZZ?YYYYYY?^^^^^^??ޞ???֖?[[[[[[????ZZZZZZ?ZZZZZZ?ۛ?ᱱ?ర?ۛ???UUUUUU?UUUUUU?ח?ٙ?XXXXXX?XXXXXX????Օ?UUUUUU???ח?WWWWWW?VVVVVV??Ԕ?Ғ?TTTTTT??Ԕ?TTTTTT?Ԕ?TTTTTT??ZZZZZZ???WWWWWW????ZZZZZZ??ח?Ԕ?Ԕ???TTTTTT???Ғ??PPPPPP??Ғ??TTTTTT?QQQQQQ?Ξ????Ғ?RRRRRR??ӓ?ё?QQQQQQ??А?PPPPPP?А?????SSSSSS?Ԕ?SSSSSS?RRRRRR?SSSSSS??Ғ?RRRRRR??͝???QQQQQQ?ё??RRRRRR??QQQQQQ?ϟ??ϟ???А???ə?Ș?Ǘ????????Ó??Ĕ????Ó??Ǘ?’??’????????Ó?’???Ɩ???Ó????’??Ó??ʚ?͝????Ó?’?Ɩ??????Ó????Ɩ?ŕ????Ĕ?ŕ?Ș?Ɩ???˛?Ǘ??Ș?????ʚ?QQQQQQ?Ξ??̜?Ξ??QQQQQQ?TTTTTT???А?PPPPPP?ё??̜?͝?А??SSSSSS??YYYYYY??QQQQQQ?RRRRRR???TTTTTT??Ԕ?Ԕ??Ԕ?XXXXXX??]]]]]]??֖?Օ??֖??ٙ?ח???TTTTTT?VVVVVV??Օ?Ԕ?UUUUUU?֖??֖?Ԕ??ؘ??ؘ?????XXXXXX?YYYYYY?\\\\\\?ۛ?ؘ?ؘ???ٙ?XXXXXX??ۛ???YYYYYY???????VVVVVV???ח?WWWWWW?֖???XXXXXX???YYYYYY??ؘ?WWWWWW?Օ?Օ??ӓ?????֖???֖???֖?000000???Ғ??TTTTTT??Ғ???RRRRRR???SSSSSS?Ғ?А???TTTTTT???PPPPPP??SSSSSS?RRRRRR???А?ϟ????ё?RRRRRR?ӓ??SSSSSS??SSSSSS?Ԕ?SSSSSS??ӓ??Ɩ???PPPPPP???А?TTTTTT?RRRRRR???ϟ?ϟ?ё?Ξ?ϟ??QQQQQQ?˛??ʚ????’?Ǘ?ŕ?’???Ó??ŕ?Ĕ??Ĕ?ŕ?????????’??????????Ó?????˛?????]]]]]]?Ԕ??Ĕ??????PPPPPP???’???Ɩ??Ș????’???ə?˛??ʚ?ϟ?ϟ????˛???Ξ??ϟ?RRRRRR?Ξ???PPPPPP??̜?ϟ??̜???ϟ???TTTTTT??TTTTTT?SSSSSS????Ԕ??VVVVVV?SSSSSS??UUUUUU?VVVVVV???VVVVVV???XXXXXX???WWWWWW??Օ???Օ?Օ?UUUUUU??UUUUUU????YYYYYY?XXXXXX?WWWWWW?XXXXXX??ݝ??UUUUUU??YYYYYY??]]]]]]?YYYYYY?ٙ?ښ??ٙ?ח?ZZZZZZ???ؘ??ښ?ZZZZZZ??YYYYYY?WWWWWW?֖??֖??????WWWWWW???ؘ????????Օ??֖?????WWWWWW???Օ??Օ??TTTTTT?TTTTTT?Ԕ?SSSSSS????QQQQQQ?RRRRRR?ё?ӓ??SSSSSS?̜??TTTTTT??˛???ח?ܜ???UUUUUU?Ξ??А?PPPPPP??ё?ё?RRRRRR?SSSSSS?SSSSSS????QQQQQQ??PPPPPP?ʚ?Ǘ?Ǘ?Ɩ?Ɩ???RRRRRR??QQQQQQ?А?ϟ???PPPPPP?Ξ?PPPPPP?͝???Ș???ŕ?Ɩ?????’????ə??Ĕ??Ĕ??????????Ó????ʚ????’?Ɩ????Ǘ???ŕ?˛??Ғ????Ĕ??’?Ɩ?Ξ??Ó?ŕ??ʚ????Ξ??ə???ё?Ș?ʚ?ʚ?QQQQQQ?????͝?PPPPPP?SSSSSS?RRRRRR?RRRRRR?Ғ?ϟ???А?PPPPPP?QQQQQQ?͝?˛??˛??ʚ?ə?͝?ʚ??ӓ??Ԕ?ٙ?????ۛ?WWWWWW?SSSSSS?WWWWWW??TTTTTT?VVVVVV??ח?ؘ??ښ??????XXXXXX?ؘ?ؘ?ח??Օ?ח?VVVVVV???ח?ؘ??֖?ZZZZZZ?XXXXXX?WWWWWW?֖?YYYYYY?????[[[[[[???ח???ٙ??ښ????ښ?ZZZZZZ??ח?ח?WWWWWW?????WWWWWW???ZZZZZZ??ٙ???????ח?VVVVVV???ٙ?000000??WWWWWW?WWWWWW?֖??Ԕ?Ԕ?UUUUUU???Ԕ??TTTTTT??QQQQQQ?QQQQQQ????UUUUUU?????Ξ?ϟ?А????ؘ?UUUUUU?]]]]]]?QQQQQQ?ϟ?PPPPPP??А???ӓ???SSSSSS?ӓ???QQQQQQ?̜???????А??QQQQQQ???PPPPPP?Ξ?QQQQQQ?ϟ??͝?͝?YYYYYY???Ɩ?Ó??’?Ó?Ó?Ó?Ó?’???ŕ?Ξ?Ɩ??Ó?Ĕ??????????Ó?˛?????Ɩ???Ĕ??TTTTTT??ə?ϟ?̜?Ĕ?’?Ɩ?ŕ?Ó??????ŕ??ŕ?Ǘ??Ș???˛?ə?Ǘ?ʚ?˛??ʚ??͝??̜?͝?ӓ????ϟ???ӓ?ӓ?ё????Ξ?͝???̜??PPPPPP?Ξ?Ș????͝??ӓ?VVVVVV?SSSSSS??ؘ?֖??????Ԕ?Օ?֖?Օ??YYYYYY???֖??ؘ??UUUUUU?ח?ݝ?QQQQQQ?UUUUUU??TTTTTT??VVVVVV???Օ??֖????????ZZZZZZ?______?\\\\\\??ٙ?YYYYYY??ٙ????ۛ??ښ?ٙ?ښ?ٙ??ؘ?ח????WWWWWW?XXXXXX?ח??֖?WWWWWW????????VVVVVV??WWWWWW?֖?ח?ٙ?ٙ???VVVVVV????XXXXXX?Ԕ?Ԕ???TTTTTT??Ԕ?Ғ??RRRRRR?Ғ?Ғ??Ғ??Ғ???Ξ?PPPPPP?SSSSSS??QQQQQQ??RRRRRR??Ғ???А?ϟ???RRRRRR?RRRRRR?SSSSSS?Ԕ???ӓ?Ғ??????ʚ????ϟ?QQQQQQ??А??ё?Ԕ??͝??Ξ?˛???ŕ??’??Ó?̜????ŕ?Ó?Ǘ?Ó???????’??’?????????Ó??Ɩ?Ó???ё???’??ŕ?’?????Ș?PPPPPP??Ɩ?Ó??Ǘ??Ǘ??ŕ??ʚ?ə??˛??Ξ?RRRRRR????Ғ?RRRRRR??А???̜?TTTTTT?ח?UUUUUU?PPPPPP????͝?̜?ʚ?̜????QQQQQQ?͝??Ξ?Ξ??RRRRRR?RRRRRR?ё??ӓ??QQQQQQ?\\\\\\??????ח??TTTTTT?YYYYYY?TTTTTT?Օ?֖????Օ?Ԕ???UUUUUU???VVVVVV?RRRRRR????Ԕ??ؘ?\\\\\\?YYYYYY???ؘ????ښ?YYYYYY????YYYYYY??ۛ???ښ?\\\\\\??ۛ?ښ??[[[[[[?ZZZZZZ????????????WWWWWW?ؘ?ؘ?XXXXXX???WWWWWW?ؘ?WWWWWW?WWWWWW?XXXXXX?ؘ?ח?WWWWWW??UUUUUU?VVVVVV?VVVVVV?WWWWWW?֖??UUUUUU?????TTTTTT?Օ?Ԕ?Ғ?ӓ????Ғ???А?А?А??ӓ?Ғ???????PPPPPP???????SSSSSS?TTTTTT?Ғ?SSSSSS?Ғ?ח??RRRRRR??????RRRRRR??QQQQQQ?А??QQQQQQ??А??Ξ?Ξ?̜?˛?Ξ?????Ó??’?Ɩ?ŕ?Ɩ?????’?????’????’???’?’??????Ó?’??Ó?ŕ???Ó?Ǘ???Ó?Ĕ??Ó??ŕ???ŕ?Ș????Ɩ??Ɩ??Ó???ϟ??SSSSSS??Ξ?QQQQQQ??ϟ?Ξ??̜?͝????˛????QQQQQQ????ə???TTTTTT?͝??RRRRRR?ӓ?ӓ?QQQQQQ????ё??VVVVVV??TTTTTT?ח?VVVVVV?VVVVVV?Օ?Ғ??UUUUUU???֖???VVVVVV??Օ??Ԕ?ӓ?TTTTTT??UUUUUU??֖??ё????TTTTTT????ؘ???WWWWWW???]]]]]]?YYYYYY??]]]]]]??????YYYYYY?ܜ?ٙ?ZZZZZZ???ర???ZZZZZZ?YYYYYY??ؘ?YYYYYY?XXXXXX???֖?VVVVVV?֖??֖?֖?ח??VVVVVV?֖??VVVVVV?XXXXXX??ח?ؘ??ח?ח?ח???֖????VVVVVV??SSSSSS??Օ?Ԕ?ӓ??SSSSSS?SSSSSS????ӓ?SSSSSS????PPPPPP???А?Ғ?SSSSSS???А?ϟ?????RRRRRR?SSSSSS?ӓ?Ғ??????ϟ???ʚ??QQQQQQ????QQQQQQ???А?͝?Ξ?͝?͝?͝?PPPPPP??֖??Ɩ?ə?Ǘ????Ó?Ĕ?ŕ?Ĕ???ŕ?˛??ŕ????’?Ș??ϟ?Ș????ŕ??????Ó?Ó?????ŕ?ŕ??Ɩ??ŕ?̜??Ó??ə???Ș?˛??ŕ???Ĕ?Ɩ?ʚ?˛??А???ϟ???͝?Ξ?͝??̜???Ξ????ϟ?͝??˛??͝?̜???ϟ?PPPPPP?Ғ?WWWWWW??QQQQQQ???RRRRRR????ח?SSSSSS???WWWWWW??Ғ?Ғ??SSSSSS?Օ????ۛ??TTTTTT?TTTTTT?ח?SSSSSS??Ԕ???TTTTTT?SSSSSS?Ғ?Ԕ?ښ?ؘ??ZZZZZZ??ؘ?ؘ?YYYYYY?ח????ښ?YYYYYY???ٙ???ٙ?XXXXXX?ٙ?YYYYYY??ۛ???ۛ?______??ݝ??ZZZZZZ?????WWWWWW??֖??VVVVVV???WWWWWW?ח?ؘ?XXXXXX?ؘ??֖?ח?XXXXXX????ؘ?WWWWWW?ח?ח??֖??TTTTTT????Ԕ????RRRRRR?SSSSSS?ӓ??????ӓ?RRRRRR?RRRRRR???PPPPPP??ϟ??SSSSSS?RRRRRR??Ξ???PPPPPP??UUUUUU?SSSSSS?TTTTTT?Ғ???QQQQQQ??????А?Ǘ??֖??Ғ?????А?Ξ??Ξ?PPPPPP?Ξ?Ξ??ŕ?Ĕ??Ĕ??ʚ?Ǘ?????Ó?ŕ???Ó?????’??Ғ?Ó??????Ó?Ĕ????Ĕ??????’???Ɩ??Ĕ?Ĕ?Ĕ???ŕ???ŕ?Ș?ŕ?Ș?Ɩ?Ǘ??̜?Ξ?ʚ??̜??RRRRRR?˛?̜?QQQQQQ?ϟ??????А?͝?ʚ??А?͝??˛???ə?̜??Ԕ??PPPPPP???????ё??RRRRRR?SSSSSS?????֖?WWWWWW?RRRRRR??TTTTTT?Ԕ?UUUUUU?TTTTTT?VVVVVV?Ԕ??WWWWWW?SSSSSS?SSSSSS?????TTTTTT?TTTTTT?RRRRRR??Ғ?????????ؘ???ؘ?ښ????YYYYYY?ښ??ښ?ۛ??ؘ?ٙ???ښ?\\\\\\?\\\\\\?ܜ?????]]]]]]?[[[[[[?ۛ?YYYYYY?XXXXXX?ؘ????ח??XXXXXX???YYYYYY??ח???VVVVVV?WWWWWW?ښ??????WWWWWW?WWWWWW??VVVVVV?Օ?????ӓ?Ԕ??RRRRRR??Ғ?RRRRRR??TTTTTT???SSSSSS???RRRRRR?А?̜??QQQQQQ??UUUUUU?ϟ??ё????ӓ??RRRRRR?SSSSSS?Ғ???VVVVVV??SSSSSS?????ϟ??RRRRRR?Ғ???ё?А???Ξ?Ξ???ə?ə??????????????Ó??????Ó???????Ó?Ĕ???Ó????ŕ?Ș??А?????ё?Ĕ??ŕ?ŕ?Ó?Ɩ?Ó?ŕ?PPPPPP?Ĕ?Ĕ???Ș??̜?????ϟ??Ғ?UUUUUU??RRRRRR?QQQQQQ?А?ӓ???PPPPPP?PPPPPP?ϟ?PPPPPP???͝?PPPPPP?͝?????ʚ??????Ғ?ӓ???ӓ???ё??֖???VVVVVV??XXXXXX??֖?Ԕ?VVVVVV??Օ????UUUUUU?SSSSSS?А?PPPPPP??RRRRRR?ё?Ғ??SSSSSS??ё???WWWWWW?ٙ?ؘ?ח???YYYYYY???YYYYYY?YYYYYY??ؘ??YYYYYY????ۛ?ښ????ٙ?ښ??[[[[[[????ݝ???\\\\\\???ښ??ښ?ZZZZZZ?ؘ?ؘ?֖??ח?ח??ؘ???֖??ח??YYYYYY???ח??WWWWWW?ח???UUUUUU??Օ??UUUUUU?֖??TTTTTT??SSSSSS???Ғ?RRRRRR??RRRRRR??SSSSSS??Ԕ?WWWWWW???Ξ?ӓ??А????͝?ϟ???Ғ?SSSSSS?ӓ?ӓ?TTTTTT????ё?А???ʚ?А?QQQQQQ?PPPPPP?QQQQQQ?PPPPPP?QQQQQQ?А?А?PPPPPP????̜?̜?Ǘ?Ɩ?????Ĕ?ŕ???’?Ĕ??ŕ?Ɩ?ŕ?’?ʚ?Ǘ?Ó??Ó?Ó??Ó?’?Ó????’????Ó??Ĕ?????’?Ó?’??ŕ???Ξ?ŕ?Ǘ?’???Ĕ?Ó??ʚ?ə?ə?????SSSSSS??XXXXXX?ݝ?UUUUUU??̜????SSSSSS?PPPPPP?QQQQQQ?А????͝????˛??Ξ?????ӓ?TTTTTT??Ғ?Օ?ח??TTTTTT?RRRRRR?SSSSSS?SSSSSS?ӓ?UUUUUU?Օ??Ғ?TTTTTT?֖?ښ??WWWWWW?ٙ?XXXXXX?Ԕ????RRRRRR?А??ϟ??????SSSSSS??Ԕ?UUUUUU?Օ?ח?WWWWWW?XXXXXX?ח?ؘ?YYYYYY?ZZZZZZ??XXXXXX?XXXXXX??WWWWWW?YYYYYY?YYYYYY?ZZZZZZ???[[[[[[???[[[[[[?YYYYYY???YYYYYY?[[[[[[???[[[[[[??ۛ?]]]]]]?ۛ????????ٙ?YYYYYY?ؘ?ٙ?YYYYYY????XXXXXX?WWWWWW???ؘ???ٙ????WWWWWW???֖?֖????֖????ӓ?TTTTTT???TTTTTT?????ӓ?Ғ?ӓ?????QQQQQQ?PPPPPP?ϟ???Ș?ϟ???????Ԕ??ӓ?RRRRRR?PPPPPP?˛?˛??ё?ϟ?̜??ё?А?ӓ????Ξ????ϟ?Ɩ?Ɩ???Ǘ???’?’??’????’?????’???’?Ĕ??Ɩ???PPPPPP??’?’???Ș???ʚ??????????ŕ???Ó??Ó?Ĕ??????ё?͝?̜?ʚ????XXXXXX?QQQQQQ?֖?ё??͝?RRRRRR????ё?͝?͝??ח?Օ?̜?͝?ʚ????͝?PPPPPP?Ғ?TTTTTT??Ԕ?RRRRRR?RRRRRR???UUUUUU?TTTTTT??Ғ????ӓ?????ٙ?YYYYYY?ZZZZZZ???Ԕ???ח??ё??ϟ???QQQQQQ??SSSSSS?Ԕ?WWWWWW??VVVVVV?Օ???????ٙ??YYYYYY?ؘ?ښ?ۛ?ٙ?ٙ?ݝ???[[[[[[??[[[[[[??[[[[[[??ZZZZZZ?ZZZZZZ???pppppp?______?ݝ?______????????????\\\\\\????ٙ??ٙ????XXXXXX?XXXXXX?YYYYYY????XXXXXX?XXXXXX?WWWWWW?WWWWWW????֖??ח?WWWWWW?Օ?ӓ?QQQQQQ?TTTTTT??֖?Օ?Օ?TTTTTT??ӓ?TTTTTT?TTTTTT??Ғ??Ξ?ϟ?А?QQQQQQ?͝??ə?̜?˛??Ғ?Ғ?Ғ???TTTTTT?UUUUUU??QQQQQQ?А??ё???ӓ??QQQQQQ???ϟ?SSSSSS??ё???ə??Ǘ?Ǘ?Ș?ŕ?Ɩ??ŕ?Ș?’???????????????Ó?Ó?Ĕ??Ɩ?Ĕ???????????????Ĕ???Ɩ??Ĕ?’???’???Ǘ?????ё?̜?????VVVVVV???Ғ?Ξ?Ғ?ϟ??VVVVVV???͝?Ξ?͝???͝??˛?ʚ??ʚ??ə?͝??WWWWWW?ӓ?RRRRRR???ё?Ғ?ӓ???ӓ???Օ?Ғ?SSSSSS??SSSSSS?UUUUUU?UUUUUU??ח?XXXXXX?VVVVVV?TTTTTT?Ԕ??TTTTTT?ӓ?RRRRRR?QQQQQQ?Ԕ?ח???Ԕ??????ח???YYYYYY??WWWWWW?ZZZZZZ?]]]]]]?ZZZZZZ??XXXXXX?ښ???ٙ??]]]]]]?\\\\\\??ZZZZZZ???ښ????ߟ?Ⲳ?WWWWWW??ߟ??\\\\\\???ܜ?ܜ?ݝ?ݝ??ܜ??^^^^^^??^^^^^^????ZZZZZZ?ٙ???ؘ????XXXXXX?ؘ?YYYYYY?YYYYYY?\\\\\\??ח?ח????֖????RRRRRR?RRRRRR?Ԕ???Օ???UUUUUU?֖???SSSSSS?Ғ??Ғ?PPPPPP?ё??͝?ə??̜?PPPPPP?ё?Ғ?Ғ?Ғ?????RRRRRR?Ғ?ӓ???RRRRRR??֖?ϟ?VVVVVV?PPPPPP?PPPPPP??А??PPPPPP?QQQQQQ?Ξ????ə???Ǘ?Ș?Ǘ????Ǘ????????ʚ???????????Ș??Ó?Ĕ?SSSSSS???????’??’?ʚ??ŕ??ŕ??Ó??????˛??Ș?ə?ə?ʚ??͝?А????QQQQQQ??XXXXXX?ӓ?А?Ԕ??QQQQQQ?ϟ?Ξ???Ξ?QQQQQQ??͝?̜??ʚ????SSSSSS?RRRRRR?ё??QQQQQQ?А??Ғ??ӓ?ӓ??Ғ?ё?Օ?UUUUUU??????А?А?YYYYYY??VVVVVV?Ԕ?Օ??TTTTTT?SSSSSS?TTTTTT?Ԕ??RRRRRR?TTTTTT?Ԕ??֖?WWWWWW?XXXXXX?֖???WWWWWW??XXXXXX?WWWWWW??????______?ۛ??ٙ???ښ?\\\\\\???YYYYYY???ZZZZZZ??ޞ??????000000???ښ?[[[[[[?\\\\\\?ܜ?]]]]]]?______????ݝ?ޞ?______??????ښ?????ښ??ٙ??ۛ?YYYYYY?ۛ?ח???ؘ?ٙ?ؘ?WWWWWW?VVVVVV?֖??QQQQQQ??Օ?UUUUUU??TTTTTT???UUUUUU?TTTTTT??SSSSSS?ё?QQQQQQ???RRRRRR??Ξ?ʚ??͝??RRRRRR?ӓ?????ӓ?QQQQQQ?????SSSSSS?PPPPPP?Ξ???PPPPPP?ϟ?PPPPPP?ё?PPPPPP??А?PPPPPP????͝?ə???Ĕ?ʚ?Ɩ?Ɩ??Ș??Ș????Ĕ?PPPPPP?Ξ?Ǘ?ŕ??Ó???’?Ó???Ș?˛?Ǘ??Ǘ?ŕ??’????’?’?Ĕ?Ɩ???Ǘ?Ĕ?Ó?Ó?Ó??ŕ?????ə?˛?ʚ?ə?̜?????Ғ?rrrrrr?UUUUUU??А??QQQQQQ?ϟ?TTTTTT?TTTTTT?QQQQQQ?PPPPPP?ϟ?Ξ?Ξ?˛?˛?͝??͝?̜?͝?ё?Ξ?ё?ϟ?PPPPPP?ϟ?RRRRRR?Ғ?ё??QQQQQQ??Ғ?ח?RRRRRR?Օ???Ғ?QQQQQQ????QQQQQQ??????TTTTTT??SSSSSS?SSSSSS?Ғ??Ԕ?Ԕ?TTTTTT??VVVVVV??WWWWWW??WWWWWW??ؘ??VVVVVV?WWWWWW??ZZZZZZ?ZZZZZZ?[[[[[[???RRRRRR??ۛ????[[[[[[???????[[[[[[?______?000000?ߟ?ޞ?qqqqqq?????______??ܜ??????111111??ర?______??______?ߟ???ZZZZZZ?ٙ?ښ????ٙ??ٙ?[[[[[[?ۛ?ܜ?[[[[[[????ؘ?ؘ?ۛ???ח??ӓ???UUUUUU?Օ?TTTTTT???UUUUUU?UUUUUU?TTTTTT?TTTTTT??RRRRRR?ӓ??ӓ?SSSSSS??????Ғ?ӓ????SSSSSS?Ԕ?SSSSSS???RRRRRR?֖??ё?Օ????????А??Ξ?Ξ?ʚ??˛?ʚ?Ɩ???Ɩ???Ɩ?Ș?Ĕ?Ó??ŕ????Ó???Ɩ?Ĕ???Ĕ?ŕ?Ĕ?Ĕ??͝?Ĕ??Ĕ?Ɩ????Ĕ?’???’???ŕ??????Ĕ??Ɩ?Ǘ?????ə?͝????ϟ??ё?\\\\\\?WWWWWW?ё?ё?RRRRRR??QQQQQQ??VVVVVV?А?ϟ??͝??˛??А???А?SSSSSS?Ξ????ё?QQQQQQ??????ё?RRRRRR?ח??RRRRRR?ӓ????Ԕ?TTTTTT?SSSSSS?SSSSSS?TTTTTT??TTTTTT??WWWWWW????SSSSSS????ח??Ԕ?????VVVVVV?WWWWWW??ښ??]]]]]]?ؘ???ښ?ޞ???????[[[[[[????֖??YYYYYY???ݝ??[[[[[[??ښ?ۛ?______????QQQQQQ?PPPPPP?ޞ??]]]]]]?ర???000000??ܜ???pppppp??ܜ????ؘ?ٙ?]]]]]]?XXXXXX?ZZZZZZ?ؘ??ZZZZZZ?ۛ?[[[[[[??^^^^^^?]]]]]]???ZZZZZZ?WWWWWW?Օ?????Օ?TTTTTT????֖???WWWWWW??TTTTTT?QQQQQQ??ӓ?SSSSSS????????RRRRRR?ӓ?ӓ?RRRRRR??????RRRRRR?SSSSSS??SSSSSS???TTTTTT???RRRRRR??ӓ????А????ϟ??Ɩ??Ĕ?Ɩ???ŕ??Ó?Ǘ??Ɩ??????’???Ĕ????Ĕ?Ó?Ɩ?Ĕ???ə??Ĕ??Ĕ?’?Ɩ??ŕ?Ĕ??ŕ??Ó?Ó?????ŕ?ʚ?͝?˛?̜?ə??ё???TTTTTT?А?VVVVVV???ӓ?А????QQQQQQ?SSSSSS????̜???̜??QQQQQQ?QQQQQQ?А??̜?Ғ???RRRRRR???UUUUUU?Ғ?ؘ?ϟ?QQQQQQ??Ԕ???UUUUUU?ӓ??ؘ???ӓ???֖?ӓ?ӓ??????QQQQQQ?TTTTTT?UUUUUU?ח?Օ?Օ??֖???XXXXXX?WWWWWW?ؘ?ZZZZZZ?ٙ???\\\\\\?ZZZZZZ???ܜ?ܜ????QQQQQQ????TTTTTT???\\\\\\?ܜ??______????ݝ??^^^^^^?ݝ?ݝ?ޞ??qqqqqq??PPPPPP?______?pppppp???ర??pppppp????111111?^^^^^^?]]]]]]??\\\\\\?ښ??ZZZZZZ???______???ؘ????^^^^^^??000000??ښ?YYYYYY?WWWWWW?VVVVVV??֖???ח?֖??VVVVVV?WWWWWW?VVVVVV?UUUUUU???TTTTTT???Ғ??ё???????Ғ?RRRRRR??????PPPPPP??ӓ?TTTTTT???XXXXXX???VVVVVV?VVVVVV?Ғ???pppppp?UUUUUU????ӓ??ϟ??ʚ?Ǘ??Ǘ????ŕ??Ó??Ș???Ĕ?ŕ??TTTTTT?ϟ?PPPPPP?Ĕ???’???Ó?Ĕ?Ĕ??Ԕ??Ó????ŕ??Ɩ??Ĕ?Ó??Ó????ŕ?Ǘ?Ɩ?ʚ???ϟ???Ғ?TTTTTT?______?WWWWWW??????RRRRRR??͝??ϟ?PPPPPP??Ԕ?UUUUUU?ϟ?͝?RRRRRR?QQQQQQ?˛?А?PPPPPP?????QQQQQQ????????RRRRRR?SSSSSS?Ԕ?YYYYYY????Օ??Ԕ?VVVVVV?Օ??????RRRRRR?QQQQQQ??А?RRRRRR??RRRRRR?UUUUUU?Օ????Օ??ٙ????UUUUUU?ܜ?______??XXXXXX??WWWWWW??????ۛ?ۛ??[[[[[[?ښ?ח??????pppppp?rrrrrr??VVVVVV?????ۛ?\\\\\\?]]]]]]?????ᑑ?QQQQQQ?ᑑ??pppppp?ర??qqqqqq?QQQQQQ?111111??ᑑ????ۛ?ۛ??pppppp?SSSSSS?㓓??ؘ?YYYYYY???ۛ?ޞ?111111?000000???ښ?YYYYYY???Օ??TTTTTT?????UUUUUU?UUUUUU??Օ????RRRRRR??Ғ?RRRRRR?SSSSSS??PPPPPP?????RRRRRR???Ғ?ӓ?UUUUUU???ϟ?RRRRRR??VVVVVV?WWWWWW?Ԕ??VVVVVV?Օ?ӓ?RRRRRR?А??ϟ?????ϟ??RRRRRR??̜?͝?Ғ??ə??Ĕ????Ĕ???ə?????Ș??’?ŕ????ŕ?????ŕ??’??????Ǘ?????Ĕ?’?Ó?ŕ???ə?Ș??Ξ??PPPPPP????qqqqqq???RRRRRR??????͝?͝?̜?ϟ??VVVVVV?TTTTTT??Ғ?ё?Ԕ???PPPPPP??А??ӓ?????TTTTTT???UUUUUU?????TTTTTT??ח?Ғ?Ғ?Ғ?Ғ?Ԕ?Ԕ??Ԕ?ӓ??PPPPPP???RRRRRR?RRRRRR?TTTTTT???SSSSSS??TTTTTT??֖?Օ??֖?WWWWWW??֖???ۛ?ٙ???ٙ?VVVVVV?WWWWWW??ۛ?ZZZZZZ?\\\\\\?\\\\\\?ښ?????ޞ?^^^^^^????啕?444444?RRRRRR?000000?pppppp??pppppp????Ⲳ??⒒??ᑑ??000000??ᑑ??PPPPPP???SSSSSS?000000?ޞ??[[[[[[??ܜ?]]]]]]?ޞ???????[[[[[[??\\\\\\?\\\\\\??]]]]]]?ܜ??XXXXXX????ח?Ғ?SSSSSS??WWWWWW?֖???VVVVVV???Ԕ?Ғ???TTTTTT?WWWWWW???TTTTTT?SSSSSS?????ח??SSSSSS?А???ʚ????WWWWWW??֖????SSSSSS?QQQQQQ???QQQQQQ?֖??SSSSSS??ϟ??̜?ʚ?Ξ?Ș?Ǘ?Ɩ?Ĕ?Ș?Ș??Ɩ???Ó??Ɩ??Ǘ??YYYYYY??ə?Ǘ???ŕ???Ĕ????Ș?Ĕ?Ĕ???ŕ?˛?Ԕ?Ș???Ó?Ó?Ó?ŕ?Ó?ŕ???˛?Ξ???Ξ?ZZZZZZ?ח?111111???WWWWWW?UUUUUU??Ғ?А??Ξ????˛?Ξ????Ғ?WWWWWW?^^^^^^????QQQQQQ?Ғ?ӓ?????TTTTTT?UUUUUU????ٙ?Ғ??ӓ?Օ?Ԕ??Ғ??RRRRRR?Ԕ?SSSSSS?ח?ӓ?Ғ???ϟ??QQQQQQ?Ғ?Ғ?Ғ?֖?Ғ???Օ?WWWWWW?ח??VVVVVV???ח??ח?ٙ??WWWWWW??ٙ??????[[[[[[?ݝ?______?______?^^^^^^?ޞ?000000?^^^^^^??ߟ?ݝ???ᑑ??QQQQQQ???ర?ssssss?ᑑ?qqqqqq??㳳?vvvvvv?333333?222222??pppppp??ర?ߟ?pppppp?pppppp???pppppp?qqqqqq??^^^^^^????\\\\\\?ޞ???ܜ?ZZZZZZ????\\\\\\??]]]]]]??ۛ??ۛ?\\\\\\?ٙ?ٙ?WWWWWW??????ח???VVVVVV?ח?ח??????[[[[[[?????[[[[[[??RRRRRR??Ғ?TTTTTT??QQQQQQ??ϟ??Ԕ?]]]]]]??Ԕ?UUUUUU????SSSSSS???А?ё?Ξ?ё?ӓ?VVVVVV????ə?ə????̜?????ŕ??Ó?Ĕ???Ɩ?Ǘ??͝?Ξ??ŕ?Ó?Ĕ?Ɩ?ӓ?ё??Ó????’?Ó????ʚ?ŕ???Ĕ???’??Ó?Ǘ??˛??ϟ??ё?WWWWWW?[[[[[[?ٙ???痗?ᱱ??TTTTTT??ϟ???????˛?QQQQQQ?А??XXXXXX?^^^^^^?000000?pppppp??ݝ??Օ?UUUUUU?WWWWWW?YYYYYY?֖??WWWWWW???\\\\\\??TTTTTT??Օ?XXXXXX?XXXXXX?Ԕ?UUUUUU???SSSSSS?????А???ϟ?????ӓ?TTTTTT??Օ?UUUUUU?WWWWWW?ٙ??ח?XXXXXX???XXXXXX?ח??ZZZZZZ?WWWWWW??ښ??ZZZZZZ???[[[[[[??ZZZZZZ?????QQQQQQ???ర?pppppp?ߟ?????333333?TTTTTT?ᱱ??⒒??Ⲳ???wwwwww?䴴??⒒?111111?ޞ??qqqqqq?111111?ర?????]]]]]]?????ޞ?]]]]]]?ޞ????\\\\\\???ښ?ۛ?\\\\\\?______?ܜ??\\\\\\?ర??[[[[[[?????PPPPPP????֖??VVVVVV?֖??Ԕ?ӓ?TTTTTT???ۛ???????ё?QQQQQQ?QQQQQQ?Ғ???Ԕ??Ԕ?YYYYYY??Օ??????ӓ??RRRRRR?????????̜??Ξ????Ș?Ɩ???Ɩ?ŕ??Ĕ??ŕ??Ǘ?Ș?Ș??ʚ???Ĕ?Ǘ?Ɩ????Ó?ŕ????Ɩ???Ɩ?Ĕ???Ș?Ɩ??Ó?Ó??ŕ??PPPPPP??UUUUUU??ښ???ޞ?ښ?pppppp?嵵??111111?UUUUUU??ё????Ξ????????PPPPPP?ߟ?qqqqqq???^^^^^^?ٙ?ؘ?????XXXXXX?XXXXXX??????Օ?Ԕ?Ғ??ӓ????Ғ????͝?А?QQQQQQ??RRRRRR?Ғ???UUUUUU??VVVVVV?WWWWWW?XXXXXX?YYYYYY?ٙ??ח???XXXXXX?ؘ??]]]]]]?ٙ?ZZZZZZ????ݝ?ܜ???YYYYYY?[[[[[[???ݝ????ߟ?ᑑ?PPPPPP??222222?⒒?222222?222222?TTTTTT?緷?TTTTTT????ssssss??RRRRRR?tttttt?䔔?嵵?SSSSSS?RRRRRR??ర??rrrrrr?rrrrrr??Ⲳ?444444?ݝ????pppppp?000000?000000??ޞ????ޞ???ۛ?\\\\\\????\\\\\\?????[[[[[[??????RRRRRR?TTTTTT??WWWWWW???????Օ?ؘ?ᱱ???ӓ??TTTTTT?SSSSSS??͝????QQQQQQ??TTTTTT?TTTTTT??XXXXXX??Ԕ?QQQQQQ??Ғ????SSSSSS?Ғ?RRRRRR?Ғ????͝???̜?PPPPPP???ʚ????ŕ?Ɩ??Ĕ??Ǘ?Ɩ?????Ɩ???ё???ə???Ó?Ĕ??Ó??Ɩ?????Ǘ?ə???Ó?Ĕ??Ó?Ǘ??ʚ?ӓ?Ғ?????ZZZZZZ?ؘ?VVVVVV?ښ?SSSSSS?䴴??XXXXXX???QQQQQQ?А?А??SSSSSS?̜?̜??А?TTTTTT?ޞ?㳳??䔔?VVVVVV?VVVVVV?ᑑ?ݝ??ޞ?ۛ??ۛ?ܜ??ߟ?ؘ?VVVVVV?֖????????ӓ?Ғ???ӓ?͝?Ξ?ё?Ғ???SSSSSS????UUUUUU?ח??ZZZZZZ?YYYYYY??ח??ښ?WWWWWW???ర?[[[[[[?]]]]]]?ܜ??]]]]]]??ޞ?ߟ??^^^^^^?\\\\\\?ܜ?ܜ??^^^^^^??ޞ?]]]]]]?ߟ?111111?222222???000000?ߟ?111111?㳳?涶???????333333?tttttt???ssssss????555555????????\\\\\\??ޞ??______??ߟ????^^^^^^????ܜ?ޞ?^^^^^^?ޞ?ܜ??ܜ??⒒???ۛ????Ԕ?UUUUUU???ؘ??UUUUUU???QQQQQQ??֖??UUUUUU???Ғ??ϟ?ё??RRRRRR??RRRRRR?RRRRRR??SSSSSS???WWWWWW??SSSSSS???̜?QQQQQQ??Ғ?ӓ?TTTTTT??SSSSSS??PPPPPP??˛?RRRRRR??̜??̜?˛??Ș??Ɩ?Ɩ?Ɩ?Ɩ???Ǘ??Ó?Ɩ??Ș???Ɩ?????ؘ??Ĕ?ŕ??Ș?’??̜??Ǘ?Ǘ???Ĕ?ŕ?Ó?Ó?Ǘ?Ș?ŕ????PPPPPP???ۛ????ZZZZZZ?[[[[[[?PPPPPP????TTTTTT????ϟ?Օ?????ϟ?ӓ???斖???777777??222222?Ⲳ?RRRRRR?RRRRRR??pppppp???ؘ??ח?ח?????SSSSSS???SSSSSS?SSSSSS????֖?RRRRRR?SSSSSS?Ғ??ӓ?ӓ?Ԕ?Ԕ?Օ??XXXXXX???YYYYYY?YYYYYY?XXXXXX?ؘ??ښ?ښ?ZZZZZZ??????ߟ???000000?000000???^^^^^^?______??ర?ᑑ??333333?嵵?㳳?RRRRRR??qqqqqq?QQQQQQ??RRRRRR??⒒?^^^^^^??ښ?SSSSSS?啕??SSSSSS??vvvvvv?TTTTTT?㓓?222222??rrrrrr??444444??333333??111111???ۛ??]]]]]]?ޞ??????ޞ?ޞ?000000???ۛ??ޞ?PPPPPP?]]]]]]?ܜ?ޞ?^^^^^^??]]]]]]????Ԕ??Օ???֖?WWWWWW?WWWWWW??Ԕ?Ԕ?QQQQQQ??VVVVVV?^^^^^^??UUUUUU?SSSSSS??ё??SSSSSS??RRRRRR??RRRRRR?WWWWWW?Օ?UUUUUU?ZZZZZZ?UUUUUU?UUUUUU????Ɩ?ϟ??TTTTTT?UUUUUU?UUUUUU???Ғ???PPPPPP?ϟ?Ғ?????ʚ??Ǘ?ŕ??ŕ?Ǘ??ə????Ǘ??PPPPPP?Ș?????Ɩ?Ĕ?Ɩ?ə???Ó???Ɩ?ŕ?Ǘ??ʚ?Ó???Ɩ?Ĕ?ŕ????Ĕ?????ӓ??YYYYYY??[[[[[[?ٙ????ٙ?ӓ?Ғ?YYYYYY?SSSSSS?TTTTTT?PPPPPP?Ξ?PPPPPP?RRRRRR??А?RRRRRR?ӓ?????緷??777777?涶?uuuuuu?嵵??tttttt???pppppp??WWWWWW??ח?Ԕ?SSSSSS???TTTTTT??ӓ?SSSSSS?Ԕ??YYYYYY?]]]]]]??Օ??SSSSSS?Ғ?ӓ?SSSSSS?ӓ?SSSSSS????????ZZZZZZ?ۛ?ݝ??[[[[[[?[[[[[[?ݝ???ߟ?pppppp?ޞ?ర?踸???ssssss?啕???111111??????????⒒??Ⲳ????????㓓?????䴴?䔔??333333?ߟ??ᱱ?ᑑ?RRRRRR?111111???ᱱ?]]]]]]?ښ?ݝ?000000?ߟ?????ᑑ??qqqqqq?111111?^^^^^^???????ܜ??ޞ??ۛ???YYYYYY??ח?ח?֖??֖?UUUUUU?UUUUUU?TTTTTT?ӓ??????TTTTTT?SSSSSS?RRRRRR?SSSSSS?ё??ё?RRRRRR???Ԕ??Օ?????ӓ?VVVVVV?ZZZZZZ??ӓ??֖?ӓ?RRRRRR?ё?RRRRRR?ё??TTTTTT?PPPPPP??ߟ???ə???Ǘ??ŕ?Ǘ????ŕ?????ZZZZZZ??ə?̜??Ĕ??Ĕ?Ɩ??ə?ŕ??ə?ŕ?Ɩ??ŕ?????ŕ?Ɩ??Ǘ??Ɩ?Ș?ə??Ԕ???VVVVVV???]]]]]]?ښ?XXXXXX?QQQQQQ??ё??????ё?ё?А?А?Ξ?ϟ??Ғ????______?ssssss?999999?yyyyyy??xxxxxx?踸????陙?333333?ޞ??ښ??WWWWWW?Օ???SSSSSS?SSSSSS?SSSSSS?RRRRRR?Ԕ?????PPPPPP??А?ё?RRRRRR????Ԕ?XXXXXX????WWWWWW??YYYYYY????pppppp?^^^^^^?ߟ??000000??ޞ?ర?\\\\\\?pppppp?666666?tttttt?⒒?111111?tttttt???㳳?⒒?222222?㳳?㓓???444444?㳳?㓓?222222??222222?⒒?qqqqqq?ᑑ??ᱱ???QQQQQQ?qqqqqq?ర?ర?ssssss?㓓?tttttt?SSSSSS?⒒?000000???ᑑ?ᱱ?ర??000000?ర?RRRRRR?ߟ?]]]]]]?ߟ?????PPPPPP?⒒?PPPPPP??㳳??^^^^^^??QQQQQQ?111111?㓓?^^^^^^??]]]]]]????ޞ?pppppp??ח??UUUUUU??Ԕ?UUUUUU???SSSSSS?????ӓ?VVVVVV?ӓ??QQQQQQ?А?Ξ??PPPPPP?А??????ח?WWWWWW?֖????ۛ?XXXXXX?Ԕ?Ԕ?TTTTTT??RRRRRR?Ԕ??ё???PPPPPP?͝??ё?ə??Ș???PPPPPP?̜?Ș?Ĕ???Ĕ??Ǘ???QQQQQQ?ϟ?PPPPPP????ʚ??ə??͝?ə?ʚ??ʚ?ʚ?ə??Ș???ə?Ɩ?Ɩ?Ǘ???А????ё????QQQQQQ?ښ??Ғ?QQQQQQ?ё??Ғ?А?ё??ӓ?Ғ?А??А?Ξ?ϟ???QQQQQQ?ӓ??ٙ?^^^^^^??嵵?[[[[[[?;;;;;;?[[[[[[?뻻?[[[[[[?[[[[[[??777777??QQQQQQ??ۛ??WWWWWW???ӓ??TTTTTT?RRRRRR?QQQQQQ?ӓ???ݝ??RRRRRR??SSSSSS???TTTTTT???֖?????ؘ?YYYYYY??ZZZZZZ??\\\\\\????ᱱ?______?ݝ??ݝ??PPPPPP?RRRRRR?RRRRRR?SSSSSS?SSSSSS?RRRRRR?䔔??ssssss?333333??䴴?啕?xxxxxx???ssssss???111111?ᱱ?ᱱ??pppppp?ᱱ?222222?rrrrrr??QQQQQQ?ᑑ?111111?______?Ⲳ?rrrrrr???RRRRRR?qqqqqq?ᱱ?????^^^^^^?PPPPPP??Ⲳ??ర?ߟ?ᑑ??111111?000000?000000?QQQQQQ?qqqqqq?ᑑ??PPPPPP?ߟ?ర?ߟ?^^^^^^?^^^^^^??ۛ?ۛ?[[[[[[???]]]]]]??\\\\\\???Ԕ??WWWWWW?WWWWWW????Օ????ӓ?????͝?Ξ?͝??А?ё?SSSSSS???YYYYYY?WWWWWW?֖??UUUUUU?WWWWWW?YYYYYY??UUUUUU?SSSSSS?ӓ??ӓ?RRRRRR?ё??А?Ғ?ϟ????Ξ???Ș?Ș??QQQQQQ????ŕ?ŕ?Ɩ?Ǘ???QQQQQQ?ё?PPPPPP??Ɩ??’?Ș?ё?̜???Ș???????Ɩ?????Ǘ?Ǘ?????А??ё?ӓ??Ғ???Ғ??PPPPPP?RRRRRR?????UUUUUU?SSSSSS???Ξ???ϟ?PPPPPP????WWWWWW?ZZZZZZ???888888?::::::?}}}}}}??}}}}}}???;;;;;;?888888?555555??PPPPPP????Ԕ?Ԕ?ӓ?SSSSSS?RRRRRR??ё?Ғ?WWWWWW?ח?ё??XXXXXX?Ԕ??TTTTTT??UUUUUU???????YYYYYY???ٙ????ߟ?ర?pppppp??ܜ???^^^^^^?ߟ??ᱱ?RRRRRR????ssssss???555555?䴴?tttttt???888888?㳳???qqqqqq?ర?ర?rrrrrr????pppppp?______?______??ᑑ?qqqqqq?pppppp????222222?RRRRRR?rrrrrr??pppppp??㳳?㳳?\\\\\\?Ⲳ?QQQQQQ?111111??pppppp?______?RRRRRR?qqqqqq?PPPPPP???ᱱ??SSSSSS?ᱱ?QQQQQQ?ర?000000??ݝ?]]]]]]??]]]]]]??]]]]]]??ݝ??ۛ?ZZZZZZ???ח?WWWWWW????֖?TTTTTT?UUUUUU??Ξ??VVVVVV?????ϟ?Ξ??ϟ???Ғ???WWWWWW?֖??Օ??ٙ???RRRRRR????Ԕ??PPPPPP??QQQQQQ?ё?А?А??̜?̜?Ξ????????ə?Ĕ??Ǘ?Ɩ?ʚ?͝??QQQQQQ??ښ???Ĕ??WWWWWW?ʚ?Ǘ??Ș?Ș?Ǘ?Ș??ə??ŕ??Ș?ə?ŕ?ŕ?ŕ??ϟ????˛?QQQQQQ??ё?QQQQQQ?PPPPPP?ё????PPPPPP?ӓ???Ԕ?UUUUUU?\\\\\\????֖??Ξ?????֖?ؘ?ޞ?ssssss?蘘?<<<<<>>>>>????]]]]]]????Ⲳ?pppppp?ۛ??֖??Ԕ?Ғ?PPPPPP??А?ϟ???VVVVVV???Օ?ؘ?֖?WWWWWW????ZZZZZZ????ٙ?ٙ??ښ???[[[[[[??ܜ????ᑑ?RRRRRR??QQQQQQ??pppppp??QQQQQQ?QQQQQQ?222222???㓓?⒒???rrrrrr?ᑑ??PPPPPP?QQQQQQ?ߟ?000000??______????^^^^^^?[[[[[[????______?ܜ?000000?PPPPPP?000000??SSSSSS?333333?rrrrrr??PPPPPP?ᑑ?ర?ޞ?qqqqqq??ర??pppppp?222222?⒒?Ⲳ?rrrrrr?111111?000000??000000?ᑑ??QQQQQQ?000000?pppppp???pppppp???ޞ???ښ?ܜ?ߟ????YYYYYY?WWWWWW???ח??֖??Օ?ח?Ԕ??ח?VVVVVV?????????ё?RRRRRR?Ғ?SSSSSS??VVVVVV???ٙ???XXXXXX??[[[[[[?ٙ?SSSSSS?RRRRRR???PPPPPP???Օ??ϟ??????ʚ??˛?ϟ???˛??Ș??ʚ?Ξ??̜?RRRRRR?XXXXXX??Ș?’?Ɩ?ŕ?????Ĕ?Ș?’?Ĕ???Ș??ŕ??ŕ?Ǘ??Ɩ??ʚ??Ɩ?̜??RRRRRR?ё???Ξ???QQQQQQ???Ғ?UUUUUU?QQQQQQ??Ξ?SSSSSS??˛???̜?͝?А??Ғ????111111???<<<<<>>>>>??Ꚛ?꺺?uuuuuu?⒒?????SSSSSS??Ғ?TTTTTT?Ԕ?????Օ?VVVVVV?֖?ח????ۛ?ర??ۛ?ؘ?YYYYYY?______?rrrrrr??ర?PPPPPP?000000?ݝ???ݝ??ߟ?111111?????QQQQQQ???⒒?Ⲳ?RRRRRR???ؘ?????ޞ??ޞ??^^^^^^?pppppp?ర????PPPPPP?ర?PPPPPP????222222?QQQQQQ?ᑑ?qqqqqq????111111??ᑑ???222222?QQQQQQ??ᱱ?ᱱ???\\\\\\???QQQQQQ???ర??ۛ?ܜ???QQQQQQ??嵵?嵵?444444?QQQQQQ???ߟ?ర????PPPPPP????ښ??֖?֖?ח?XXXXXX??\\\\\\?ח??ח?WWWWWW??VVVVVV???UUUUUU?WWWWWW??ӓ??Ғ??SSSSSS??Ԕ??֖??XXXXXX?]]]]]]??ZZZZZZ????Ș?̜?͝?Ξ?QQQQQQ????SSSSSS????ё?А?А?ϟ?ə?ə?Ǘ?ʚ??ʚ?Ș?ə?̜??Ξ?????Ǘ?Ɩ??А?RRRRRR?RRRRRR??˛?PPPPPP?PPPPPP??’?????’?Ó?Ó??ŕ??Ɩ??ŕ???Ξ????А?RRRRRR?Ԕ?????Ș?ʚ??Ș?PPPPPP?Ș?ŕ?Ɩ?Ǘ?͝??˛?????????ݝ??rrrrrr?777777??::::::??鹹???^^^^^^?[[[[[[??WWWWWW???TTTTTT???UUUUUU???TTTTTT?Ԕ?VVVVVV?Օ?ח?ݝ????ޞ?ܜ?ݝ?]]]]]]?pppppp???pppppp?ర?ߟ?ޞ?qqqqqq?]]]]]]?]]]]]]??ߟ???㳳?⒒??ssssss??⒒??qqqqqq???ర??000000?ޞ?^^^^^^??\\\\\\?^^^^^^??ޞ?______?ߟ??pppppp?ᱱ?ᱱ??rrrrrr?QQQQQQ??111111??QQQQQQ??qqqqqq??ᱱ?RRRRRR?RRRRRR?rrrrrr???111111?QQQQQQ?ర???qqqqqq?ᱱ?333333?䴴?111111????ssssss?ᱱ??PPPPPP?ᱱ?]]]]]]?ZZZZZZ???000000?ᑑ??666666?陙???]]]]]]????ᑑ?______?^^^^^^?______?ݝ?\\\\\\?ٙ?XXXXXX??ߟ??ZZZZZZ?ח??????WWWWWW?ח??VVVVVV????????RRRRRR?ӓ??????\\\\\\?ZZZZZZ?[[[[[[????????QQQQQQ??????TTTTTT?RRRRRR????͝??ʚ?ə??ə????????Ǘ???̜?????????Ș??????????Ó???Ǘ?Ș??Ș?ə?̜???˛?ə??Ξ?͝??˛?ə?ʚ???ŕ??ə?ə?ə??Ǘ??ϟ??̜?????Օ?????Ⲳ?斖??斖?777777?嵵???RRRRRR?]]]]]]???TTTTTT???SSSSSS?Օ???Ԕ??֖?YYYYYY??ښ?ܜ??嵵?RRRRRR????000000????PPPPPP?111111?rrrrrr?Ⲳ?????pppppp?ᑑ???RRRRRR?SSSSSS???RRRRRR?ᱱ?pppppp?ᱱ???ᱱ?000000??______?______?000000?qqqqqq?QQQQQQ?ర???ᑑ???????pppppp?ర???ᱱ?qqqqqq?QQQQQQ?222222?⒒?rrrrrr?⒒?222222?rrrrrr?ᑑ?qqqqqq???rrrrrr?Ⲳ??RRRRRR?㓓???RRRRRR?pppppp?rrrrrr?RRRRRR?ర?ᱱ?㳳???ܜ??ښ?qqqqqq??????]]]]]]?ߟ??qqqqqq??ݝ?ޞ?^^^^^^???????ర?VVVVVV?YYYYYY??ٙ??????Օ?Օ??UUUUUU?Օ?RRRRRR???VVVVVV??ӓ?ӓ?UUUUUU??Օ?????YYYYYY??ߟ?^^^^^^?000000??PPPPPP?PPPPPP???ϟ??ё??А??QQQQQQ?̜??̜?̜??Ɩ??Ɩ???Ș??Ǘ?͝?????TTTTTT?А?SSSSSS????ϟ????ח???Ó???Ĕ?’?Ó?Ĕ??Ș?Ǘ????PPPPPP??͝???˛?QQQQQQ?QQQQQQ??ə?ə???Ɩ???????˛?˛????˛??А?WWWWWW????QQQQQQ???______????PPPPPP?qqqqqq?RRRRRR?333333?111111?\\\\\\?ח??TTTTTT??????ښ?ښ???\\\\\\?YYYYYY?\\\\\\?______?⒒?ߟ?ݝ?ݝ??000000???^^^^^^???ߟ?000000??\\\\\\???ۛ?ܜ????RRRRRR?RRRRRR???111111??QQQQQQ???㳳?^^^^^^??ᑑ??000000???ᑑ???qqqqqq?????pppppp??pppppp??????ᱱ???ᑑ?⒒?222222?⒒?⒒?Ⲳ??㳳???333333????ᑑ??ߟ?000000?RRRRRR?222222?111111?RRRRRR?㓓?tttttt??????qqqqqq??222222?pppppp?______???ޞ??\\\\\\??ۛ????ښ??ؘ?TTTTTT?Օ???[[[[[[?Օ?TTTTTT??֖???WWWWWW???RRRRRR??????Ԕ??Ғ????ۛ?????[[[[[[?????PPPPPP??˛?????А????А???ʚ?ʚ?’???̜?ʚ?Ș???͝??ݝ???RRRRRR???TTTTTT?ϟ?ə?Ș?Ɩ?Ș????????Ó??????ŕ?ŕ??ə?ʚ?͝??Ξ?̜?Ξ?ʚ?ʚ?˛?ʚ??Ș?ʚ?ϟ?UUUUUU?˛?Ș?????͝?ʚ??˛??????RRRRRR???VVVVVV?ؘ?\\\\\\??ZZZZZZ?ؘ?WWWWWW??]]]]]]???Օ??Ғ?QQQQQQ?RRRRRR?SSSSSS??XXXXXX?嵵??YYYYYY?YYYYYY??\\\\\\??\\\\\\???^^^^^^??ߟ????______???????ݝ?ߟ?PPPPPP?PPPPPP??qqqqqq?QQQQQQ?ᑑ??qqqqqq?QQQQQQ?111111??????ߟ??\\\\\\???ᱱ??111111?QQQQQQ??222222?RRRRRR????ర?111111??ᑑ?QQQQQQ??000000??111111??PPPPPP?ᱱ??RRRRRR?222222???䴴??SSSSSS?333333?⒒?rrrrrr??ర??RRRRRR???pppppp?ᱱ?ᑑ?______?qqqqqq?RRRRRR????[[[[[[??????PPPPPP?ޞ???______??^^^^^^?ܜ?______???ZZZZZZ?YYYYYY??SSSSSS?ח?ٙ???YYYYYY?YYYYYY?Օ???????VVVVVV?Ғ?̜?Ξ???TTTTTT??ӓ?RRRRRR??WWWWWW???]]]]]]?ٙ???ߟ??Ԕ??˛?PPPPPP?Ξ???QQQQQQ?А?ښ?ё??PPPPPP??RRRRRR?????Ș?ə????ə??????RRRRRR?ݝ?PPPPPP????˛??ʚ???’??Ó?ʚ?Ǘ????ŕ?Ɩ??Ǘ???Ɩ??˛?˛??̜?͝?͝?ё?̜?ə?Ș??Ǘ??Ș?ʚ?Ș??????͝?ʚ?ʚ???ٙ??А?ϟ???SSSSSS???֖?֖?Օ?VVVVVV?VVVVVV???֖??XXXXXX?RRRRRR??ё?ח?Օ???[[[[[[??ٙ??ח?ZZZZZZ??]]]]]]????PPPPPP??PPPPPP??000000?ۛ???????^^^^^^???QQQQQQ?rrrrrr???pppppp?ర??111111?QQQQQQ??ݝ???111111??ݝ?______??QQQQQQ?QQQQQQ?111111?qqqqqq?rrrrrr??ᑑ?222222?111111??111111?QQQQQQ?ᱱ?111111??QQQQQQ??ర??111111??RRRRRR??⒒?⒒?RRRRRR???ssssss???333333???⒒?ᑑ?QQQQQQ??ߟ?]]]]]]?^^^^^^????ᱱ?222222?ర????䔔?RRRRRR?QQQQQQ?222222???ZZZZZZ????[[[[[[??\\\\\\??PPPPPP?ݝ??YYYYYY???ZZZZZZ??ۛ?ܜ??WWWWWW??ؘ?\\\\\\??XXXXXX???SSSSSS?TTTTTT????Ԕ?UUUUUU?UUUUUU????֖??ۛ?ٙ???ٙ?YYYYYY????ϟ?Ξ?????̜?ё????͝??͝?ə?ʚ?ʚ??Ǘ??ə??˛??Օ??Օ????^^^^^^?Ⲳ?UUUUUU?Ξ?Ǘ?ə?ə??????Ó?Ǘ?Ó?ŕ???Ɩ??Ɩ??Ξ?ʚ???ʚ??͝???ə?͝???ə??ə?Ɩ?????ə?̜???˛???VVVVVV??Ξ?ϟ?Ғ??QQQQQQ?Ғ??Ғ????ח?YYYYYY?YYYYYY?????Օ??VVVVVV??VVVVVV?YYYYYY?ZZZZZZ?ܜ??YYYYYY??ؘ?[[[[[[??]]]]]]??000000?ޞ?ݝ??ݝ?ܜ?\\\\\\?ܜ??ښ?ܜ???ޞ?^^^^^^??ర????QQQQQQ???pppppp????ర??ߟ???ޞ?qqqqqq?qqqqqq?ర??ᑑ???????111111??111111?pppppp?PPPPPP??QQQQQQ?ᱱ?RRRRRR??ᱱ?RRRRRR???SSSSSS??⒒??333333?333333?SSSSSS????ssssss??333333?Ⲳ?ᑑ????pppppp?111111?222222?ᱱ??QQQQQQ??XXXXXX??䔔?⒒?ᑑ???pppppp???ۛ??ݝ???????ٙ??????????XXXXXX?֖?XXXXXX??WWWWWW?UUUUUU?SSSSSS????[[[[[[?RRRRRR???RRRRRR???ؘ???ښ????TTTTTT?YYYYYY?Ғ?Ξ???QQQQQQ?Ξ?ϟ?Ξ?̜?ϟ???PPPPPP??͝?˛?ʚ??Ș?ə???͝?ʚ?̜??QQQQQQ??000000?111111?QQQQQQ????Օ?А??ϟ?ϟ???’??Ó??Ó??Ĕ?ŕ?’?Ó?????˛?Ξ?ʚ?ə???ϟ?PPPPPP??˛??̜?Ǘ??ŕ?ŕ?Ǘ??Ɩ?Ɩ?Ș?Ș?Ǘ?ə???TTTTTT??Ξ???QQQQQQ??RRRRRR?Ғ?Ғ??????ٙ???[[[[[[??ؘ??ܜ?ZZZZZZ??ח??ښ??ߟ??ݝ?[[[[[[?ܜ??ޞ??ߟ???ܜ?ޞ?ۛ??WWWWWW??WWWWWW?ښ?[[[[[[?ۛ??PPPPPP?ᑑ?ߟ?______?ర?qqqqqq????ߟ?pppppp?PPPPPP?rrrrrr?PPPPPP?RRRRRR??????ᱱ?QQQQQQ?ᱱ????ర???000000?㓓??QQQQQQ??qqqqqq?ర?ᱱ?⒒?⒒??SSSSSS??ssssss?㳳???SSSSSS?㓓?SSSSSS?㓓?333333?333333?㓓??444444??㓓?⒒?ᱱ??pppppp?000000??PPPPPP??ᑑ?111111?????????qqqqqq?QQQQQQ?333333??ర??ܜ??ݝ??\\\\\\??ۛ???XXXXXX???????ٙ?????֖?Օ??TTTTTT??ח??]]]]]]?RRRRRR??????000000??????ښ?SSSSSS?Ғ?RRRRRR?А?PPPPPP?RRRRRR??PPPPPP???Ξ?Ғ?ϟ?Ξ?ϟ?ϟ??Ș?ʚ??˛?ŕ?ə?Ԕ?˛???А???ᑑ???SSSSSS??TTTTTT?QQQQQQ??ܜ?А???????Ó??Ɩ?????VVVVVV?QQQQQQ????˛??ə?????Ș???Ǘ?ŕ??????Ɩ????ə??Ғ?̜??̜?ё?А???͝?А?UUUUUU?WWWWWW?VVVVVV?Օ?ח??000000?ݝ?ޞ?pppppp??YYYYYY??______???[[[[[[??ܜ??111111??????______?????ܜ?pppppp?ٙ??֖???\\\\\\?ۛ??222222?PPPPPP?ర?ర?000000?pppppp?QQQQQQ?PPPPPP???ܜ?????????ᱱ?pppppp????PPPPPP?PPPPPP?PPPPPP????ߟ?????222222?⒒?222222?⒒?SSSSSS????444444?䔔?tttttt?tttttt?444444???tttttt??㓓?ssssss??SSSSSS?SSSSSS?SSSSSS?Ⲳ??ᱱ??ߟ?ᱱ?111111??qqqqqq?qqqqqq?qqqqqq?000000???qqqqqq?rrrrrr???⒒?ᱱ??______?ݝ??PPPPPP?pppppp?]]]]]]??\\\\\\?ߟ??YYYYYY?ۛ?ٙ?XXXXXX?ZZZZZZ??\\\\\\?YYYYYY?ښ?ZZZZZZ?ۛ?YYYYYY?YYYYYY??WWWWWW?֖???֖?ۛ??ߟ??ؘ?SSSSSS?Ԕ?VVVVVV?ؘ??ZZZZZZ???????SSSSSS?TTTTTT??PPPPPP??Ξ???˛???Ξ??PPPPPP?ӓ?ə???Ǘ?Ǘ??͝??˛????Օ??UUUUUU??̜?͝???RRRRRR??Օ?PPPPPP?Ș?Ɩ?????Ĕ?’???’?Ș?Ș??˛?QQQQQQ????Ș??Ǘ?ə??ϟ?Ș???ʚ????????Ǘ?ʚ????ʚ???ϟ?˛?͝??ʚ???֖?WWWWWW??VVVVVV?VVVVVV?֖?ܜ?ZZZZZZ??ޞ????[[[[[[????ర??222222?uuuuuu??ᑑ??ݝ??]]]]]]?______?ߟ?ݝ?[[[[[[?\\\\\\?????ర????000000?????PPPPPP??000000?______???^^^^^^???444444?Ⲳ?______??ర??ᱱ???ᑑ?[[[[[[?[[[[[[???ߟ?ᑑ?QQQQQQ???ᱱ?qqqqqq?ᑑ?ᱱ?RRRRRR?222222????TTTTTT?TTTTTT???555555??䴴??????333333?㳳?SSSSSS?333333?rrrrrr?RRRRRR??Ⲳ????QQQQQQ?pppppp????????RRRRRR?ᱱ???Ⲳ?ߟ??ZZZZZZ?ݝ?ర?000000?\\\\\\??ܜ??YYYYYY???\\\\\\?ٙ????ؘ?ZZZZZZ?ٙ???UUUUUU??YYYYYY?ٙ???????VVVVVV??UUUUUU??Օ?ח??ܜ?YYYYYY??VVVVVV???WWWWWW?Օ?Ԕ?TTTTTT?ё?А?А??͝???͝???Ξ??ʚ?ə??˛??͝?ʚ?Ǘ????ӓ?XXXXXX???Ǘ???Ξ??ё?Ξ?А?QQQQQQ?ʚ??ŕ??????????Ǘ???TTTTTT????˛?͝?˛?˛?Ξ??Ξ??Ɩ?ŕ????Ó????ə?ə?ё?PPPPPP?ə??˛?PPPPPP??ə???Ξ??Ԕ??ח??????YYYYYY??YYYYYY?ߟ?ޞ????SSSSSS??555555??嵵?斖???????ޞ?]]]]]]??\\\\\\?000000????pppppp?ర?????pppppp?ర?ర??222222?111111?ߟ?ޞ??]]]]]]?^^^^^^???qqqqqq??ᱱ?ర?______??PPPPPP?ۛ??????ߟ?ర?QQQQQQ?ᑑ????qqqqqq?RRRRRR?ᱱ??qqqqqq?RRRRRR?333333?tttttt?䔔??UUUUUU?uuuuuu?UUUUUU?555555???TTTTTT?䔔?tttttt?tttttt???555555?444444?rrrrrr??RRRRRR?RRRRRR?rrrrrr?QQQQQQ?PPPPPP??ర?ݝ?______???ᑑ??QQQQQQ?ᱱ?ᱱ?222222????????pppppp???XXXXXX??ؘ??ܜ??ۛ?ٙ?????ܜ??WWWWWW??UUUUUU?֖?VVVVVV???^^^^^^?000000?]]]]]]???ё???ӓ????ZZZZZZ??֖?ə?RRRRRR?ZZZZZZ?ؘ???QQQQQQ?QQQQQQ???ʚ?̜?͝???PPPPPP???ə?????˛??Ǘ?̜?????̜?ŕ?Ǘ??ʚ??̜?ϟ??Ξ?WWWWWW?А??????’??Ó?Ғ??RRRRRR?ʚ?RRRRRR?TTTTTT??ϟ???А?PPPPPP?ə??ə?ə?????Ɩ??ŕ????Ǘ?Ǘ???ʚ?ʚ?ə??ʚ?ə?ʚ?̜??PPPPPP??Օ?Օ?XXXXXX??[[[[[[??㳳??[[[[[[?????ۛ?^^^^^^??RRRRRR?????PPPPPP????[[[[[[?ޞ??[[[[[[?YYYYYY??????ర???ᱱ?ޞ??]]]]]]??______??000000?PPPPPP????PPPPPP??______?ۛ?ݝ?000000?QQQQQQ?RRRRRR???ర??ߟ?PPPPPP???qqqqqq??pppppp?pppppp????PPPPPP?qqqqqq?????ᱱ?㓓?????555555?UUUUUU?uuuuuu?啕?uuuuuu?555555???䴴?䔔?tttttt?444444???????RRRRRR???111111????????ᱱ??ᱱ?111111?222222?000000???ښ?ZZZZZZ?ۛ?ݝ??ٙ??YYYYYY?ZZZZZZ?\\\\\\?111111?\\\\\\??????^^^^^^????ؘ??WWWWWW?XXXXXX?Օ?Ԕ??YYYYYY?PPPPPP?ٙ??RRRRRR?Ξ?˛?PPPPPP??UUUUUU???ZZZZZZ?ё?PPPPPP?ӓ??ӓ???ё?ё???̜?Ξ?Ξ?̜??͝?ʚ?̜??Ș??Ξ?А???ə???SSSSSS??͝?Ԕ?Օ???͝?ə?Ǘ???Ș???Ĕ????’?ŕ???UUUUUU?WWWWWW???WWWWWW?PPPPPP?̜??PPPPPP?ϟ?͝???Ș?Ș?ʚ??Ǘ??ŕ?Ș??Ĕ??Ĕ???ʚ?Ǘ??ŕ?ʚ??ə???͝?PPPPPP???QQQQQQ?????XXXXXX??XXXXXX?wwwwww?[[[[[[?ؘ??ښ???????????[[[[[[??[[[[[[?\\\\\\??]]]]]]?ޞ?]]]]]]?]]]]]]??UUUUUU?XXXXXX????ޞ?______????ZZZZZZ?pppppp?pppppp??ర?㳳?111111?ߟ??ߟ?pppppp?______?qqqqqq??ᑑ???ߟ?^^^^^^?ర??pppppp?????111111?qqqqqq?______??QQQQQQ??RRRRRR?????㳳?444444?䔔??UUUUUU?uuuuuu?UUUUUU?啕?嵵???啕?UUUUUU?UUUUUU???䴴?444444?444444??333333?⒒?qqqqqq?qqqqqq?RRRRRR?ᱱ??qqqqqq?000000?______?ޞ?pppppp?000000?ᑑ?pppppp?111111?????111111?ర?????ۛ?ZZZZZZ?ۛ?ۛ??ܜ??ߟ???ٙ?ߟ???ޞ??ח?[[[[[[?ח?XXXXXX??VVVVVV?Օ??Ԕ?֖??????͝??RRRRRR??TTTTTT?WWWWWW?Օ?RRRRRR?ӓ?ӓ?ё?ё??Ғ?А?А??͝?Ξ?Ξ?͝?̜?˛??˛?˛?˛?ʚ?͝?̜??ϟ???SSSSSS?PPPPPP????̜????Ș???????ŕ????Ĕ?’?Ș???̜??QQQQQQ??????А??А????ə??ŕ?ə???Ĕ?Ɩ?Ǘ?ŕ?ŕ??̜??Ɩ?Ɩ??ϟ??ə??˛?Ξ??̜?SSSSSS???TTTTTT??XXXXXX??ߟ???ח?VVVVVV?ٙ??XXXXXX?XXXXXX????ܜ??______?ښ???______?ޞ??\\\\\\?ZZZZZZ???QQQQQQ???333333??______?]]]]]]?^^^^^^?PPPPPP?000000?ߟ??ٙ??rrrrrr??rrrrrr?111111??ర???^^^^^^?ߟ??ర?qqqqqq??000000?ߟ?ߟ???000000??qqqqqq?qqqqqq?ᑑ?ర??ర??QQQQQQ??RRRRRR??SSSSSS???444444?䔔?䴴?555555?uuuuuu?啕?????666666?666666????uuuuuu??tttttt??TTTTTT?㳳??⒒???ᑑ?⒒?ᱱ????ݝ???pppppp?111111?ᑑ?111111?QQQQQQ?111111?qqqqqq????ZZZZZZ?ZZZZZZ??\\\\\\??PPPPPP???ܜ?\\\\\\?]]]]]]?????pppppp??ޞ?\\\\\\????UUUUUU?Ԕ????ח?Օ??А?ə??͝??А????UUUUUU?UUUUUU?ؘ???QQQQQQ??RRRRRR???̜????˛?͝?͝?͝?̜??PPPPPP?˛?͝?Ғ??А??QQQQQQ?А?ё??UUUUUU?ח??Ɩ?Ǘ??Ɩ?????ŕ?Ǘ?ŕ?Ξ???ə??ŕ??ə?͝????͝??А??TTTTTT?͝?͝?͝?А??Ș?Ș?ŕ??ŕ?????Ĕ?Ș?̜????????Ǘ??????ϟ?ϟ?QQQQQQ?????[[[[[[?ܜ?֖????XXXXXX?YYYYYY??ۛ??\\\\\\?????[[[[[[?ܜ??000000???RRRRRR?XXXXXX????RRRRRR?RRRRRR??ݝ?ݝ?ݝ?______?ᑑ??ޞ?ۛ??______?222222?ᑑ??[[[[[[?ۛ???ٙ??Ⲳ??000000?????PPPPPP?ߟ???RRRRRR?222222?qqqqqq??rrrrrr?222222?ర?ᑑ?⒒?Ⲳ?333333?333333??䔔???uuuuuu?嵵?嵵??666666?VVVVVV?VVVVVV?vvvvvv?斖?斖?VVVVVV?VVVVVV?666666??啕??䔔?444444??333333?⒒?qqqqqq?qqqqqq??RRRRRR?222222???PPPPPP????pppppp?111111?????222222??______?ݝ??ٙ???pppppp???000000?]]]]]]?^^^^^^????⒒?qqqqqq?????ٙ?ח?ؘ?֖?ښ??ۛ??ӓ?Ș?ʚ????ə??ϟ???VVVVVV??TTTTTT??RRRRRR?̜?͝??Ǘ?͝??Ξ?ϟ?͝???̜?А?ϟ??????SSSSSS?˛???ZZZZZZ?RRRRRR??Ԕ?TTTTTT??Ǘ??ϟ??????Ĕ?Ĕ???ŕ?????Ĕ?Ɩ?ʚ?ʚ?̜??Ș?˛?????̜???ϟ???ə?Ș?Ș?ŕ???ŕ?ŕ?ʚ???????ŕ?ə?????????ϟ??TTTTTT?RRRRRR???ח?֖??TTTTTT???????ޞ??ZZZZZZ??YYYYYY??ߟ??????ӓ??YYYYYY???ᑑ????ݝ?______??ᑑ????ښ??000000?]]]]]]?????[[[[[[???ۛ??______?000000??______?ߟ?PPPPPP?000000?ర?QQQQQQ?SSSSSS?ssssss??222222?SSSSSS?qqqqqq?222222?222222??SSSSSS?ssssss??䔔?䴴??555555??啕?嵵?666666?vvvvvv?涶?????涶?涶?斖?666666??555555??TTTTTT??㓓???SSSSSS??222222?rrrrrr?ssssss??ޞ??????ర???ޞ??]]]]]]??ܜ???^^^^^^???ޞ??000000??[[[[[[?ۛ??ښ??ݝ?????ښ??WWWWWW?֖?WWWWWW?ٙ?UUUUUU?RRRRRR??ё?Ξ??̜?ə??PPPPPP?RRRRRR??UUUUUU?Օ?Ԕ??֖??͝???????А?ё??Ξ???PPPPPP?ϟ??Ξ?ϟ??Ɩ?Ș???ؘ??͝?ϟ??˛??Ș?ə???Ɩ?Ǘ?Ó?’??ŕ?Ĕ?Ó?͝?’?˛??ə????Ɩ???Ș?̜??̜??????͝?ə????Ș?Ș???ŕ?ʚ?ŕ?Ɩ??Ɩ??Ǘ?????Ș?Ș??TTTTTT??QQQQQQ???ё????ח?XXXXXX?______?֖?ܜ?111111?[[[[[[?ܜ??ޞ???YYYYYY?XXXXXX??????WWWWWW?ܜ??ۛ??YYYYYY???^^^^^^??ܜ?^^^^^^?ޞ?PPPPPP?ߟ?ర?ޞ?ݝ?\\\\\\?ۛ??ߟ??????ݝ???ۛ??pppppp?^^^^^^?]]]]]]?______?PPPPPP?pppppp?000000??ᑑ??⒒??ssssss?⒒?rrrrrr??SSSSSS?SSSSSS??TTTTTT?tttttt??555555?UUUUUU?嵵???VVVVVV?涶???777777?777777?????涶?斖??啕?555555??TTTTTT??SSSSSS?Ⲳ?㓓??222222?222222??PPPPPP?ޞ?ߟ?ܜ?______???ర?ర??PPPPPP??^^^^^^????ܜ??______???]]]]]]?]]]]]]??\\\\\\??ZZZZZZ???ܜ??ښ?ZZZZZZ??ZZZZZZ???WWWWWW????Ғ??QQQQQQ?Ғ?PPPPPP?PPPPPP?QQQQQQ???RRRRRR??UUUUUU???UUUUUU?Ԕ?RRRRRR??˛?RRRRRR??PPPPPP????̜??Ξ?͝??ϟ????̜?????QQQQQQ?Ғ?QQQQQQ?˛??Ԕ??Ɩ??Ș?Ĕ??Ĕ???Ó??????ʚ??˛?Ɩ??Ɩ?˛?Ǘ???˛?Ș?ʚ?̜???ర?ё?Ξ?ϟ??А?Ș?ə???Ș??ŕ??ŕ?ŕ?Ǘ?Ș???Ș?Ș?Ș???˛?А???ӓ???Ғ?VVVVVV??XXXXXX?ZZZZZZ?????ర?ޞ?ߟ??^^^^^^?\\\\\\?ZZZZZZ??XXXXXX?ٙ??]]]]]]??ٙ???______??ZZZZZZ???ޞ?]]]]]]???000000???????\\\\\\?[[[[[[???\\\\\\?ܜ??\\\\\\?ݝ??^^^^^^?ݝ??ߟ?????000000???111111?PPPPPP??RRRRRR?Ⲳ??RRRRRR???㳳?㳳?TTTTTT?䴴??UUUUUU?啕?嵵??666666?VVVVVV???WWWWWW?WWWWWW?wwwwww?緷?痗?WWWWWW?777777????VVVVVV??啕????ssssss?SSSSSS??rrrrrr?⒒?ᱱ?ᑑ??PPPPPP?______?^^^^^^?ర?rrrrrr?ᑑ????ర???\\\\\\?XXXXXX?\\\\\\?PPPPPP?______??ZZZZZZ??^^^^^^?]]]]]]?ۛ?????______??????YYYYYY?ٙ????֖?ח????????Ԕ?Ԕ?Ԕ??Ԕ?VVVVVV??TTTTTT??ϟ?А???А???QQQQQQ?ϟ??PPPPPP?PPPPPP??Ξ?RRRRRR?QQQQQQ???А?Ξ??RRRRRR???А????˛??Ɩ??ə???Ĕ?Ɩ??А?Ĕ?????ӓ???Ó???ʚ?˛?Ǘ???Ξ?ё??˛??֖?Ξ?̜?ϟ?Ξ?Ғ????Ǘ?ʚ????Ĕ??Ξ??ŕ???ŕ?Ǘ?Ξ???PPPPPP???ӓ??ӓ?ӓ?YYYYYY????????222222?????YYYYYY?ٙ???XXXXXX??ؘ?ٙ?XXXXXX?????]]]]]]??]]]]]]?______?ޞ?pppppp?ܜ??]]]]]]???[[[[[[?\\\\\\??ZZZZZZ??YYYYYY?XXXXXX??ZZZZZZ?ݝ??????]]]]]]?ݝ??ܜ??ర??pppppp??PPPPPP?ޞ?ݝ??qqqqqq?RRRRRR?RRRRRR?????tttttt?TTTTTT?UUUUUU?UUUUUU?嵵???666666??777777?痗?緷?緷?緷???緷?wwwwww??777777??涶??嵵?UUUUUU??䔔??333333?Ⲳ?222222??QQQQQQ?qqqqqq??ర???111111?qqqqqq?111111?PPPPPP?ݝ?000000??PPPPPP??ݝ?YYYYYY?ݝ?ZZZZZZ???ښ??ݝ???ٙ????ۛ?[[[[[[?ޞ?????YYYYYY??UUUUUU???֖?UUUUUU??QQQQQQ?А?ё??ӓ???Ԕ?֖???VVVVVV?QQQQQQ???RRRRRR?Ғ????RRRRRR?SSSSSS??ϟ???ϟ??Ғ??ӓ?ϟ?֖?Ξ???SSSSSS??ZZZZZZ???Ξ?ʚ?̜?Ɩ???Ɩ??ŕ?Ó??Ĕ?Ǘ?’?’???Ǘ?SSSSSS????Ș?ʚ???????Ғ???ח??Ξ??ϟ?UUUUUU?PPPPPP?Ɩ????Ó?Ó?Ɩ?ŕ?Ĕ?ŕ??Ó??ŕ???PPPPPP?А??Ξ?ӓ?Ғ?Ғ??SSSSSS????XXXXXX?ؘ?ח??????ܜ?ۛ?ښ?ZZZZZZ??ٙ?ח????WWWWWW?[[[[[[?\\\\\\??\\\\\\?䴴?444444?ߟ?ۛ?ܜ?[[[[[[?pppppp?\\\\\\??ܜ????\\\\\\?ZZZZZZ?ZZZZZZ?????ݝ?????______??ZZZZZZ???^^^^^^?000000??㓓????ޞ??QQQQQQ??RRRRRR???㓓?444444?䔔?䴴??啕???666666??WWWWWW?緷?緷?????888888?888888??緷?wwwwww?777777?斖?涶?vvvvvv??啕??䴴??SSSSSS???RRRRRR?QQQQQQ?ᱱ?ᱱ?ర?000000??000000?]]]]]]?______?pppppp??ݝ??000000??ޞ?ZZZZZZ??YYYYYY?XXXXXX???ޞ??ݝ?ݝ?ښ?ZZZZZZ??ٙ?ZZZZZZ?^^^^^^??ޞ?000000??XXXXXX?XXXXXX?ח?Օ??Օ?Ԕ??QQQQQQ?PPPPPP??Ғ????????ٙ????ϟ?Ԕ?ё?ё???????ϟ?ё??ښ??????Ғ?ϟ?????????˛????ϟ??Ɩ?Ó?Ó??’???Ĕ??ŕ?ə?RRRRRR?????Ǘ?ə???????Ξ??ϟ?̜?PPPPPP?ϟ??ʚ??Ș?Ș?ŕ?Ó?ŕ??Ĕ?ŕ?ŕ?Ĕ?Ɩ??Ǘ??͝?̜??QQQQQQ??ё?ӓ?Ғ?Ғ?TTTTTT?UUUUUU???????Օ???ZZZZZZ?]]]]]]?ښ????WWWWWW??Օ?ؘ?֖??ؘ???ٙ?ᱱ?ߟ?ݝ????\\\\\\???\\\\\\?\\\\\\?\\\\\\??ښ????\\\\\\??ݝ?______??ర??ޞ??ర??]]]]]]?ݝ??pppppp??ర?pppppp??ޞ???ᑑ?222222?Ⲳ?ssssss??TTTTTT?TTTTTT?䔔?555555???vvvvvv?vvvvvv?WWWWWW???XXXXXX?蘘?踸?蘘?蘘?蘘?蘘?xxxxxx?xxxxxx?XXXXXX??痗?777777??斖?666666?嵵????ssssss?333333??⒒??qqqqqq??QQQQQQ??______??000000?QQQQQQ???ZZZZZZ????ݝ?______?^^^^^^?^^^^^^??ޞ?ݝ?????ݝ???ZZZZZZ?ZZZZZZ???Ⲳ?ݝ???Օ???Ԕ?Ԕ???PPPPPP??А?TTTTTT??SSSSSS??Օ?UUUUUU?ӓ?֖?^^^^^^?VVVVVV?ӓ?ё?PPPPPP??ё??Ғ????̜?͝?А??TTTTTT?ۛ???SSSSSS?Ғ??PPPPPP?А??UUUUUU?PPPPPP????ʚ?Ǘ????ʚ???Ó?Ĕ?Ɩ??Ș?’?ŕ??Ó?Ɩ??ϟ?А?˛?ŕ?Ɩ???ə?Ǘ?˛?А?PPPPPP?RRRRRR??ϟ??Օ???˛??Ș?Ǘ?Ǘ?Ș????Ĕ??Ɩ???ə???ё??QQQQQQ???ӓ??TTTTTT?TTTTTT??TTTTTT??UUUUUU??SSSSSS????ٙ??[[[[[[??ۛ???֖????WWWWWW?ח??ښ????ٙ?pppppp??[[[[[[?[[[[[[?^^^^^^?ݝ?ۛ?ߟ???[[[[[[????ښ???ܜ?????pppppp??]]]]]]?333333??ߟ?ߟ????000000?^^^^^^??ݝ?000000??QQQQQQ??rrrrrr?SSSSSS?TTTTTT?TTTTTT???啕?VVVVVV?vvvvvv??痗?888888?xxxxxx???999999?999999?999999?????踸?蘘?XXXXXX??緷?WWWWWW??vvvvvv??555555?䴴??333333???222222??qqqqqq?ᑑ???______????ߟ?ݝ?ۛ??ۛ??ޞ?ߟ???ߟ?000000?ర?PPPPPP??ܜ??ߟ?ٙ??ܜ?\\\\\\?????ZZZZZZ?^^^^^^????ё??͝?Ξ??QQQQQQ?Ξ?PPPPPP?QQQQQQ???ӓ?Ԕ?Ԕ?Օ?UUUUUU?UUUUUU??QQQQQQ?̜?ё????TTTTTT????PPPPPP?RRRRRR?А?ܜ??Ԕ?Ғ??QQQQQQ?QQQQQQ?А?̜???А??PPPPPP?̜?˛??Ɩ?QQQQQQ?Ǘ??Ĕ??Ó??’??????’????̜?ʚ??Ǘ??Ǘ?˛??Ș????ϟ?ё???QQQQQQ?̜?ə?QQQQQQ???Ɩ?Ĕ?ŕ??ə?????͝??Ξ?PPPPPP?Ԕ?Ғ???SSSSSS?ӓ?Ԕ?TTTTTT?UUUUUU???Ԕ?Ғ?VVVVVV??Ғ?UUUUUU??????XXXXXX??ח?Օ?WWWWWW??ؘ?ח????ח??ښ???[[[[[[?ZZZZZZ?ۛ??ݝ??[[[[[[?WWWWWW?֖?WWWWWW??YYYYYY?[[[[[[?\\\\\\??ᱱ?PPPPPP??PPPPPP??pppppp???ߟ?ߟ???PPPPPP??pppppp?______?pppppp????000000?ᑑ?222222?⒒?Ⲳ?㓓?444444?䴴??嵵??VVVVVV??緷?XXXXXX?蘘???YYYYYY?陙?鹹?鹹?鹹?鹹?陙?999999???蘘?XXXXXX??緷??涶?666666?嵵???㳳?333333?Ⲳ???ᑑ?111111?qqqqqq????______?000000??ݝ?ߟ?______?^^^^^^????ޞ??PPPPPP?ᑑ??111111?????^^^^^^?ߟ???\\\\\\?\\\\\\?^^^^^^??\\\\\\?ۛ??????̜?̜?PPPPPP??А?QQQQQQ??RRRRRR??RRRRRR??RRRRRR?Ғ?Ғ?ӓ?TTTTTT?ё???????RRRRRR??͝?RRRRRR??VVVVVV?????SSSSSS????ϟ????ё?ʚ?Ғ?А?˛?ə????’?Ó?Ó?’???Ĕ???Ó????Ĕ?????Ɩ?ʚ??ӓ?ʚ??͝????RRRRRR?\\\\\\?ؘ?Ξ???Ș??ŕ?Ɩ?ŕ?Ș?Ș?ə?ʚ?ʚ?ϟ??QQQQQQ?TTTTTT???ё?????TTTTTT??????UUUUUU?WWWWWW?111111???ۛ?????YYYYYY?ZZZZZZ????ٙ??ښ??ZZZZZZ?YYYYYY?ٙ?ZZZZZZ??ZZZZZZ????ZZZZZZ?ZZZZZZ?ܜ?\\\\\\??ZZZZZZ??YYYYYY???\\\\\\??]]]]]]?ߟ?ݝ?^^^^^^?000000?333333??^^^^^^?ܜ?ޞ?]]]]]]??^^^^^^???pppppp??PPPPPP??\\\\\\?^^^^^^??222222?⒒?SSSSSS?ssssss??TTTTTT??啕??666666?涶??XXXXXX???yyyyyy?鹹??::::::?::::::?::::::????陙?YYYYYY?999999??蘘?888888??777777?涶?vvvvvv?uuuuuu??tttttt?䴴???222222?ᑑ?ᑑ??ᑑ?⒒?333333?pppppp?ߟ??ޞ??000000?______?PPPPPP?ߟ??????tttttt??qqqqqq?111111?ޞ???ߟ???ޞ?\\\\\\?ܜ?]]]]]]??\\\\\\??ؘ???????̜??PPPPPP?SSSSSS????А???SSSSSS?Ғ??ё??Ó?͝??VVVVVV???ӓ?ё??RRRRRR??YYYYYY?SSSSSS?ё??А?QQQQQQ?ё?А???QQQQQQ??UUUUUU?˛???˛?͝?А???Ɩ?ŕ??Ĕ?’???’???????Ĕ??ʚ?ё???PPPPPP??UUUUUU?͝?ё??ϟ??PPPPPP?WWWWWW?̜?͝??QQQQQQ?????ŕ??Ș?????ё?ӓ?ӓ??PPPPPP?ӓ????Ғ?ӓ???VVVVVV??VVVVVV?֖?UUUUUU??]]]]]]??ݝ?????]]]]]]??XXXXXX????ښ???[[[[[[??000000?[[[[[[??[[[[[[??YYYYYY?ؘ???ܜ?ۛ?ۛ?[[[[[[??YYYYYY?YYYYYY????[[[[[[???ܜ?______???PPPPPP?ݝ?]]]]]]?[[[[[[??ޞ????ߟ??^^^^^^?ۛ?]]]]]]??ᱱ?RRRRRR?Ⲳ?㳳??tttttt??uuuuuu?666666?VVVVVV?666666?涶?xxxxxx??999999?陙?鹹?::::::?ZZZZZZ?Ꚛ?Ꚛ?Ꚛ?꺺?Ꚛ?zzzzzz??鹹?YYYYYY???xxxxxx??wwwwww??vvvvvv???䴴?444444?ssssss?SSSSSS????RRRRRR?ᑑ???ర?^^^^^^??111111?pppppp??ߟ??PPPPPP???^^^^^^?PPPPPP??333333?333333?QQQQQQ??ޞ?ޞ??????????ݝ?]]]]]]?WWWWWW?Ԕ?SSSSSS?ӓ?TTTTTT??PPPPPP?А?ё????RRRRRR?PPPPPP?ё??TTTTTT?Ғ?RRRRRR??ϟ??̜??????Ғ??RRRRRR?QQQQQQ????А?SSSSSS??RRRRRR?͝???QQQQQQ?ё?TTTTTT????Ғ?????Ǘ??ʚ??’??ŕ?Ó????ŕ?’?????Ɩ??ӓ?̜??ϟ????А????PPPPPP??͝?QQQQQQ?˛???Ɩ?ŕ?ŕ???ʚ??VVVVVV???ϟ?ё?PPPPPP???ӓ??Ԕ??SSSSSS???VVVVVV???WWWWWW???[[[[[[?ܜ??000000?^^^^^^?000000?YYYYYY???ؘ?ח??[[[[[[??ZZZZZZ??ZZZZZZ??RRRRRR??ZZZZZZ?ۛ????ܜ?______??\\\\\\?ۛ????\\\\\\?\\\\\\??ۛ??ݝ?______???ర???______??\\\\\\???ర?PPPPPP?PPPPPP??000000??ݝ??qqqqqq?RRRRRR?Ⲳ?㓓??TTTTTT?UUUUUU?啕??斖??WWWWWW???999999?鹹??::::::?꺺???;;;;;;?;;;;;;???꺺?zzzzzz?ZZZZZZ??yyyyyy?999999?蘘??痗??斖?嵵?嵵?uuuuuu??333333??SSSSSS?RRRRRR???qqqqqq?ᱱ?111111?pppppp??QQQQQQ???^^^^^^?pppppp?000000?ޞ?ܜ?]]]]]]?ޞ??qqqqqq?000000?rrrrrr??啕?pppppp??qqqqqq?]]]]]]??[[[[[[??ܜ?PPPPPP?ޞ????VVVVVV?Օ?SSSSSS?TTTTTT????ϟ?А?QQQQQQ?ё?PPPPPP?PPPPPP????SSSSSS??????ӓ??Օ?TTTTTT?UUUUUU????ё??SSSSSS???ϟ??TTTTTT?А?ϟ?PPPPPP???ؘ????͝?Ș????Ɩ???Ɩ?Ɩ??Ó?’??Ó????????ŕ????Օ?Ғ???ؘ?ٙ???̜?ϟ??Ξ?˛?ə?Ș?͝?ё??Ɩ?Ɩ????UUUUUU?֖???PPPPPP?А?А??SSSSSS?ӓ??ӓ?RRRRRR?????YYYYYY?XXXXXX???????????ܜ??????ٙ?YYYYYY?ښ???]]]]]]?ښ?????ۛ????]]]]]]??????ZZZZZZ?[[[[[[?ښ???PPPPPP??ᱱ?ᱱ?⒒?ޞ??ݝ?]]]]]]?]]]]]]?^^^^^^??ర???RRRRRR?ᑑ?pppppp???RRRRRR??㓓??䔔?UUUUUU??VVVVVV??777777??蘘??鹹??zzzzzz?꺺??;;;;;;?{{{{{{?뛛?뛛?뛛?[[[[[[?;;;;;;??Ꚛ?ZZZZZZ??YYYYYY??xxxxxx??777777?涶???嵵?444444?㓓?㳳?⒒???qqqqqq?111111?111111????QQQQQQ????????ݝ?]]]]]]???RRRRRR?ssssss?222222?pppppp???ۛ??ۛ??\\\\\\????\\\\\\???֖??ӓ???Ғ?Ғ?Ξ?PPPPPP????????ӓ?TTTTTT?Ԕ??SSSSSS??TTTTTT?UUUUUU?????ϟ????˛??̜??ϟ?ϟ?PPPPPP??QQQQQQ?????QQQQQQ??Ξ?Ɩ????Ó?Ĕ??ŕ?Ɩ?ʚ?Ó?’?Ĕ?’??’?Ɩ????Ó??ʚ??ə??]]]]]]?QQQQQQ?RRRRRR???Ғ???PPPPPP?̜?Ξ??ə?Ǘ?ʚ?Ǘ??Ɩ?ŕ?????ϟ?Ξ??PPPPPP??QQQQQQ?PPPPPP???Ԕ?Ԕ??WWWWWW?VVVVVV??ٙ???Ғ?ZZZZZZ?????ܜ??XXXXXX???????VVVVVV?ؘ???XXXXXX?ܜ?YYYYYY????\\\\\\????\\\\\\?\\\\\\??ZZZZZZ?ܜ???ۛ??ښ?YYYYYY??ޞ??QQQQQQ?wwwwww???ޞ?______?PPPPPP?ర??????ᱱ?Ⲳ???RRRRRR?⒒?RRRRRR??ssssss??䔔?uuuuuu??vvvvvv??痗?XXXXXX??YYYYYY??zzzzzz???[[[[[[?뛛?????뻻?{{{{{{???Ꚛ??陙??蘘??wwwwww??VVVVVV?啕??tttttt?㳳??Ⲳ?RRRRRR?RRRRRR??ᱱ?111111??PPPPPP???ర???000000??ݝ?ۛ?ۛ?ۛ??rrrrrr??Ⲳ?qqqqqq?qqqqqq?______?ZZZZZZ??[[[[[[?ۛ????????ؘ??SSSSSS?Ғ????ϟ?ϟ????А?SSSSSS??WWWWWW?TTTTTT??????????ח?Օ?Ԕ?ϟ??ϟ?А??ʚ?Ǘ?ʚ?͝?PPPPPP???ZZZZZZ?TTTTTT?Ғ??Ԕ???А?Ǘ???Ғ?ŕ?Ɩ?ə????Ó?’?ŕ?ŕ?????’?ŕ???̜?А?Ș??????RRRRRR?QQQQQQ?ٙ?ӓ?QQQQQQ?Ξ??ə????ŕ?????Ĕ???Ξ?͝?͝?А?QQQQQQ?ϟ??TTTTTT??Ԕ?UUUUUU?֖???[[[[[[?]]]]]]?ۛ?ח?\\\\\\??^^^^^^??000000?]]]]]]???ח??????WWWWWW?ח??WWWWWW?ח???YYYYYY??YYYYYY??ZZZZZZ??ܜ?\\\\\\???\\\\\\??ܜ?ZZZZZZ?ٙ?ZZZZZZ?ܜ?ۛ??????000000???PPPPPP????????⒒?qqqqqq?ᑑ????⒒??333333?ssssss?444444?䴴???vvvvvv??緷?xxxxxx?YYYYYY??ZZZZZZ??;;;;;;?뛛??<<<<<>>>>>??~~~~~~?^^^^^^??}}}}}}??||||||??[[[[[[??ZZZZZZ?陙??蘘???斖??555555?TTTTTT??333333?⒒?222222?RRRRRR??ᱱ?pppppp?PPPPPP?000000???ర??ܜ??ܜ?pppppp?]]]]]]??^^^^^^?PPPPPP??PPPPPP?ޞ?TTTTTT??ݝ???ZZZZZZ??ߟ?000000?[[[[[[???ٙ?????ח?UUUUUU?SSSSSS?SSSSSS?SSSSSS?????̜???????????ӓ???SSSSSS?UUUUUU??QQQQQQ?А?ϟ?ϟ?PPPPPP?SSSSSS?????ӓ????ӓ????ϟ?ϟ?ŕ??Ǘ?ʚ???????’??????QQQQQQ?Ɩ?ϟ??ə??ϟ???????͝??QQQQQQ?Ξ?˛?ə??ŕ?Ĕ?Ó?’?Ó???ŕ??ʚ?ə??ʚ???RRRRRR????SSSSSS?VVVVVV??UUUUUU???Ғ?WWWWWW???VVVVVV?ӓ?????ٙ?ؘ???WWWWWW?^^^^^^???WWWWWW?ٙ?YYYYYY??ښ?[[[[[[??YYYYYY?YYYYYY??ٙ????ٙ??PPPPPP?ssssss?ᱱ???ٙ?ݝ??]]]]]]??????\\\\\\?ܜ?ޞ?ܜ?ݝ???pppppp??ۛ????ర?pppppp??QQQQQQ??rrrrrr???ssssss?䴴?UUUUUU??666666??緷?XXXXXX??yyyyyy?::::::?꺺?;;;;;;?뻻?||||||??흝?~~~~~~?______???>>>>>>?흝??||||||??{{{{{{??ZZZZZZ?陙??XXXXXX???vvvvvv?嵵?555555?tttttt???⒒?RRRRRR?222222?qqqqqq?qqqqqq??000000????????????ޞ?PPPPPP??ߟ?pppppp??QQQQQQ??ޞ?ۛ?ښ??????ZZZZZZ?XXXXXX??PPPPPP?]]]]]]?ח?WWWWWW??SSSSSS??ё??QQQQQQ?А????̜?PPPPPP??SSSSSS?ӓ?QQQQQQ?Ԕ????Ԕ????SSSSSS??QQQQQQ??͝?͝??YYYYYY??SSSSSS?XXXXXX?XXXXXX??ϟ???Ғ???̜?ə???˛????????ŕ???????Ǘ?ϟ???QQQQQQ??XXXXXX??Ғ?????Ғ??А?̜??Ǘ?Ĕ?????ŕ?ŕ??Ĕ??ʚ?ё??͝?????SSSSSS?SSSSSS?RRRRRR?SSSSSS????ӓ?ؘ?]]]]]]?______?TTTTTT???ؘ?ؘ?ٙ???XXXXXX?WWWWWW?ٙ??ؘ?????XXXXXX?ؘ?\\\\\\????[[[[[[??ښ??ZZZZZZ????ర??YYYYYY?ё??YYYYYY?\\\\\\??ۛ????ర?PPPPPP???]]]]]]??ߟ???[[[[[[?pppppp?\\\\\\?______?RRRRRR????ᑑ??⒒?????uuuuuu?嵵?VVVVVV?777777??xxxxxx??鹹?ZZZZZZ??[[[[[[??||||||??}}}}}}?>>>>>>????>>>>>>?흝??||||||??{{{{{{??::::::?陙??XXXXXX?緷??VVVVVV?啕?UUUUUU?䔔?㳳??Ⲳ?222222?ᱱ?ᑑ???PPPPPP??ర??ߟ?ݝ?ܜ?ܜ??^^^^^^?]]]]]]??ߟ?ޞ????ssssss???ܜ?]]]]]]??]]]]]]?QQQQQQ?ݝ?[[[[[[???ٙ????Օ??UUUUUU?ё??PPPPPP?RRRRRR?Ξ?Ξ??Ξ???ё?Ғ???RRRRRR??ϟ?TTTTTT???ח?TTTTTT???SSSSSS???А?ё?QQQQQQ?UUUUUU?SSSSSS?ё?ZZZZZZ?______?PPPPPP?ϟ?ё??Ξ??̜?????ə????Ó?’?????????Ó???̜??ϟ???Ғ?XXXXXX?А?˛?̜????А???????Ó???Ĕ?Ɩ?Ǘ?????͝???????ё??rrrrrr?ܜ?ٙ??֖?????YYYYYY?ؘ??YYYYYY?ZZZZZZ?ZZZZZZ??YYYYYY???ܜ??YYYYYY?ח????ښ?ښ?ٙ???ۛ?______??\\\\\\?^^^^^^??Ⲳ???ZZZZZZ??ؘ???ۛ??ZZZZZZ?]]]]]]?ߟ?ݝ??ۛ?ۛ???ޞ????111111????qqqqqq?000000?000000?ᑑ?ᱱ?Ⲳ?㓓?㓓???啕?????蘘?999999?鹹?ZZZZZZ??{{{{{{??\\\\\\??}}}}}}??????]]]]]]??<<<<<>>>>>??]]]]]]??윜??뛛??Ꚛ??YYYYYY?蘘??WWWWWW???555555??TTTTTT?ssssss?rrrrrr?RRRRRR?rrrrrr???pppppp?ర??PPPPPP?ర??ޞ??ݝ??ݝ?______?______?]]]]]]??QQQQQQ?]]]]]]??⒒???rrrrrr?RRRRRR?]]]]]]?\\\\\\?^^^^^^???000000???XXXXXX?VVVVVV??UUUUUU???QQQQQQ?QQQQQQ?ё????̜??QQQQQQ???А??ё??˛??RRRRRR?Օ??]]]]]]?ӓ?Ғ?Ғ?ӓ?Ғ?SSSSSS????Ԕ???????????ӓ?ʚ??ŕ??Ɩ??Ĕ????Ĕ?’??????????Ǘ?ۛ??ర???ח?RRRRRR??͝??????˛?ϟ?ʚ?̜?QQQQQQ??Ɩ??ŕ?Ǘ?͝???А?Ξ?SSSSSS??͝?RRRRRR?ښ?UUUUUU?QQQQQQ??VVVVVV?WWWWWW?ۛ??ښ??ޞ???VVVVVV?Օ???ۛ?ZZZZZZ?]]]]]]?ZZZZZZ?֖??222222??ښ??֖?ӓ???XXXXXX????ZZZZZZ?ۛ??000000??ۛ?ݝ?PPPPPP?^^^^^^?ݝ?ۛ???UUUUUU??\\\\\\?\\\\\\?ۛ?ۛ?]]]]]]?^^^^^^??ߟ?ٙ??[[[[[[??000000?ۛ?______?PPPPPP?000000?PPPPPP????ޞ??ᱱ?rrrrrr???㓓??䔔?uuuuuu??vvvvvv???蘘???ZZZZZZ?꺺?;;;;;;?뻻??||||||?켼??}}}}}}?흝?]]]]]]??윜?||||||??{{{{{{??::::::?鹹??xxxxxx??777777?斖??uuuuuu?䴴??333333?222222?RRRRRR?RRRRRR??ర?PPPPPP??pppppp?ర?ర?ߟ?]]]]]]?ۛ?]]]]]]?______??]]]]]]?\\\\\\?ޞ?111111???ర??ర?ssssss??rrrrrr??\\\\\\???ۛ???ח??ח?VVVVVV?UUUUUU?Օ??ё?ё?RRRRRR??PPPPPP?ϟ?͝??ϟ??PPPPPP?А???YYYYYY??ӓ?UUUUUU????TTTTTT??Օ???UUUUUU?ё??QQQQQQ???SSSSSS?ӓ????VVVVVV?Օ??ё?Ғ????ŕ?Ǘ???????????????Ɩ????ߟ?000000??PPPPPP?ϟ?????Ș???̜?Ɩ??͝?Ɩ?ʚ?Ɩ?Ĕ?ŕ?Ǘ???SSSSSS?Ξ?QQQQQQ????Ԕ?Ԕ??SSSSSS?SSSSSS????ؘ??ۛ??啕?蘘??XXXXXX?ؘ?ZZZZZZ???ܜ??Ԕ???ܜ?ޞ?\\\\\\?ޞ?WWWWWW?Ԕ?VVVVVV?UUUUUU??ښ?ZZZZZZ??YYYYYY???PPPPPP???qqqqqq?222222???\\\\\\?ޞ??ח?[[[[[[?ܜ???ݝ??]]]]]]?ޞ?\\\\\\?ؘ??ޞ??ޞ?000000?PPPPPP?ర???ర????QQQQQQ??rrrrrr???ssssss??TTTTTT??嵵?斖???888888??鹹?ZZZZZZ?꺺??{{{{{{??<<<<<yeswqxq|hkȁ`uctVj}āǁ]{zvxyzl=dmŁ^z|q^āҁ|rf_qnŁn|~|txhwyv~k~xkف\s􁢁Ɓ܁r}{с[q{Áx|ցƁzz{zɁzi~bn]{ǁՁ}ʁ\poTxx}ju~g{ukkv|[\|zxׁz}lp|{xj`sX~|q~܁mm~Ɓ{|xЁzāS^oǁxp~xszʁc^tz]ӁugyvṕzruibzvЁRӁz|dq}y~hhu{hye၌}{pmӁptrKks}ȁt́s~΁~xbKlx~abut{݁rReQȁqցoā{lxv^_zƁ{nqˁijzkqpˁW}āwb^Zl[bjwɁhvs{z{rnm|fywākm}EX\ҁyd~iw΁Ýneiysnvrynvtvāqiсpm~Á{\by||Ɓ~́axivll|{i}rzƁˁȁƁuycq}}z|v|فˁwsrԁ}^jhr||lj]jvЁk}yz|}jtjԁp~ʁ~tŁȁ~nsRTʁuzte{d́}ú{}sdkԁvSсy~q́Łw|{ˁnt́ÁŁjd|b؁p{jut}ḱāk灵pujuvwǁہƁŁ|w|q~{gnˁʁŁqw|{tuhq|lɁlف~}ρ(ւ"ʁet\Ё~^|΁ʁPnwŚs߁tÁ\x\p|}{jk|Ă$G J,P끞\zxnaVFǁji^ʁ.Ҏț+_ꉵK{􁚁ākNyb|j~Ё~}}_ׄxɍS/́ljh}Ásā݁kwzuN!σB݁΁u~n|~fṕimρB00ڂ5ف́oSLyqwƁw~ȁɁʁЁŁtrjxw|r|{qŁ聼́́t|oɁzxxtādhvh{luށásp]}d~rՁՁЁׁǁˁʁ]ok`MʁhŁށ{āy~ĺ|сcesha~LoŁvfǁmtmفˁvρǁ{сzH|e{ˁ|́xցunxʁzӁRz~cf~pjÁkҁkpuˁrlrwt[z{w[xw~Á́hʁo~zqZf~䁧uk{qȁ}]΁dk~tvfeсzŁ}[isxYg|kyrxv|ˁpāx}v~|Ło|bo~|\ofpdl}ҁi~ǁwāvƁpmvllȁeˁYs;a򁤁qā}xa|ufat|rcȁ{}ρuK{Ձ́py|݁wsx|ejFƁ~mź́s~|[}{pGÁq|wÁӁwvƁ}~jqŹrrwk}āہyÁ}eɁcb|΁{Łtρ`mہslr{jVyʁЁ[}]kv}}gWvxoɁ{ȁzƁ|{ravāPˁrx}giźȁ́qt~qw|v́~ybp{y{MցՁ~z}Ákzvq~|]ZzrYPY[ҁuxWiẃŁyeb|]gwǁkjpҁˁpÁct{g \ No newline at end of file diff --git a/data/fits/STAR_FOCUS_11.fits b/data/fits/STAR_FOCUS_11.fits deleted file mode 100644 index 935196f76..000000000 --- a/data/fits/STAR_FOCUS_11.fits +++ /dev/null @@ -1 +0,0 @@ -SIMPLE = T / Created by ImageJ FITS_Writer BITPIX = 16 / number of bits per data pixel NAXIS = 2 / number of data axes NAXIS1 = 65 / length of data axis 1 NAXIS2 = 85 / length of data axis 2 BZERO = 32768 / data range offset BSCALE = 1 / default scaling factor DATAMIN = 0.000000 DATAMAX = 65535.000000 INSTRUME= 'ATIK-383L: fw rev 3.27' FILTER = 'Position 3' EXPTIME = 3.000 DATE-OBS= '2014-01-17T20:33:32' XPIXSZ = 5.400 YPIXSZ = 5.400 XBINNING= 1 YBINNING= 1 XORGSUBF= 1127 YORGSUBF= 915 XPOSSUBF= 1127 YPOSSUBF= 915 CBLACK = 311 CWHITE = 15701 CCD-TEMP= -10.0 SWCREATE= 'Artemis Capture' END uwmg݁torzY~mipxRtgU{ydTzvVy{uc}rt`|jf|mibq}F^wqv}otyrxd|km`\oЁiogryvouux~~zTqgHlycfggdQWjky\t|cjpz`zrnwhpZv́{~Ol{^|zzpwfvrRopmbtxszpx|szāx;oppr\bsUnolg`sd{r䁱fsw|Y}oqqxmk^rg~ztgp{gzy}\q?~f|{rsorao[}hy|joixQxwo}yh|Xs}tZ|fyuyr`{g}{~sh{d]Sxkrzkiollpcyj{ρt~jmex]oOkIytlu~|ātrzy{lRgalbkxmyvxwx́wq;dxqz]~}|v{~nyx|}vujjzrz][^ws~kz[jc[|[Nj{^{q}s{u}؁{pbKV^MˁUx|ewse}]ejnMtPy{~xYkqzl|_qcYnzz~miuq}Ulu|or\d~\svOjy}́zd}k{tpt6Chsry{g[d`ssmpz|ŁyJe`l~dvukŁ}l[}kryrjl]vSbs{ncc}bxIvā}Lxd_^mlY䁆rx]΁uy~yegkȁ{}|́wwno|Du^kw{T^hӁZgxmwtsvlbyYLnyXo{ymzyzoin~~y\uwdz~{tVyup}esq}yȁmrxv|istq}nW:oyuuslʁ}]b|u{erldj}wpjexvj}iY}hTgp|ց}iKuoi|e|\rx`Ӂs|āqnk\fcdWvhoj|ywjyrb|fri\FM{{vgzt|Ázi~yx}ny}Oxx|{Rov]@hkhhttwzn||{΁cցw{nt\us~ndquywk}zwkz{[eo|mritlrnrkk^yzjȁuxf_el`i|~tρ^dskɁs؁}sjjmzopH`lirltāx܁Ձ݂||cqVz\tLp~j́asmȁ,x5끧r~txzm\y|bkxdsWhjj0Pp!فҁ́z[c|y[x{fJׁutta|bɁłփC߄|H"ɁVsxuebvTЁ\jvkI{fZ|h́eτdފ#ԃvN΁xoYmrsptzl}vƃYn󋅇-G,܁ہso{e}iwW|rˁ~wy~́Ă_pL*_te؄~$恐ԁ}r|{pknW~aje{uXā~J~BU:Z_Uxā}zw}|}`kw}aȁsށ@GͰ::m5Ą悕.߁}z_swg}\Ӂktxtysjvqn{pẃoKՌ]N+W[u āÁj}pku{tNU}drŁcÁÁ̂yIϓX~5{^nslap}lv}Z]gvzف͈H1b΃5~gYm}h~iuyXvhVt}yzɂÄI E䈥yԂźԁfg؁fwpr:yxlkywe9\_ၘwȁvx{lvl|qq|zlxiˁ@.esxffxV|yMslq^sRizށAف{~nyifjttCovs{|kkeӁjȁЁ߁Ɓāl~nvxj\vx[r~nb|tqZu`lḿށnrw}mYx^|fgbpt|x|x1pwywzyouuabŁgxiyx{sdy~|;ljd`VxXtl]hu}i^taXslbwiym|Łsonnsg~||zrwoWk}^j}jv}LaŁ~u~kszɁUywY{nh~skc|cm]j>iVtl[|wǁ}{ρwphzfbmā|n_}pghԁc^}ev`w`i{~f|lpdxS}Jtwzuf~|nx{n^`ˁ{v}~n}yWerZy{phjdb^y|ȁZrmgbtzgk#ց^ludɁs^}qw}unƁ}ydrosOB]vwg{lX|wrXvodco|jRtrx||jxry]bibgi{vȁr|i{xxtZtViycdlāebluEwQlr}}u^n[zxg^~~g_~tdHpyʁ~NgVy{prymt|sCemzlxbivyunFs~Ár{yn~hxtynuzd7epЁvuvjv~]x[RsxXslky~bcwx}|kuzNrvy~hslg\m~́kplǁsyumlp}nfafrfkml{tu`XuztwutybplpYncklt_tu~vdtkqwt^bvkd~onmnlaamqyeZl{veeTŁj2Zd\txȁ{rk|Ɂh`ckWJ`h[]QsTryjh|vyVpux{xu}pmhjc_{roȁp[ryb[qwgq`pdcvu^}l=ve\y~z^d|~pn`wtqughingTyyƁml{IdepzzeIptdh߁s{eegsw}~k~apYptxn~|z`Kq́wwmnknO \ No newline at end of file diff --git a/data/fits/STAR_FOCUS_12.fits b/data/fits/STAR_FOCUS_12.fits deleted file mode 100644 index 43e429cee..000000000 Binary files a/data/fits/STAR_FOCUS_12.fits and /dev/null differ diff --git a/data/fits/STAR_FOCUS_13.fits b/data/fits/STAR_FOCUS_13.fits deleted file mode 100644 index 165c31b7c..000000000 --- a/data/fits/STAR_FOCUS_13.fits +++ /dev/null @@ -1 +0,0 @@ -SIMPLE = T / Created by ImageJ FITS_Writer BITPIX = 16 / number of bits per data pixel NAXIS = 2 / number of data axes NAXIS1 = 65 / length of data axis 1 NAXIS2 = 85 / length of data axis 2 BZERO = 32768 / data range offset BSCALE = 1 / default scaling factor DATAMIN = 0.000000 DATAMAX = 65535.000000 INSTRUME= 'ATIK-383L: fw rev 3.27' FILTER = 'Position 3' EXPTIME = 3.000 DATE-OBS= '2014-01-17T20:34:09' XPIXSZ = 5.400 YPIXSZ = 5.400 XBINNING= 1 YBINNING= 1 XORGSUBF= 1127 YORGSUBF= 915 XPOSSUBF= 1127 YPOSSUBF= 915 CBLACK = 326 CWHITE = 13119 CCD-TEMP= -10.0 SWCREATE= 'Artemis Capture' END o|xˁ{݁^nexnv|yLd~z~deyhbs}}TЁvyKmlsrwYL}ʁ^yrԁyсŁp`xyuxmenY^wex~|~lbāׁlzofe{{]qɁkkvȁznɁxs~ԁxxv}bm}teu|~yj|~ȁu}atLkaсɁ|pjxtsiyzrbbǁeypvks_bzhy{e}crkہ\iˁNwlVсpozၛa{zsmX\seo|wuρ~vkn؁Ł|сu΁zlw~n}āqḱj{DsxzhrȁxZŁgdnzubρājvywMwuv́kqxo|zÁ~[jt`vxҁMkxjMlXkārqzhk܁ʁuy{΁k؁juflǁЁZdlgƁtYppŁwсi~lyuЁԁuҁ{eÁ{plˁl{Ձd~|kuńƁ~ɁvzyutŁpŁˁˁ|ukaȁyźha΁{sh^y{nVrbmdn]ws~eie΁{qxfȁsyts~||h́V^xtxpˁh{x́uxq́onykk{|ȁtr{xcӁwxszvǁLˁy~t⁔K~ƁiЁvɁt>v聤zx{nxzcylŁS~恐pā|pvytNml}~oρ~{vہyɁrx~Ál||}Qmvҁ}xсhԁ{bp쁋ŁǁsvjoyhnefvdЁhxik~m}}x`nՁЁ}hbsǁxwvfT|ilY_ˁkÁЁxyρuā~ҁwy`ҁrxrbn2Ɂ~Ɂ́ЁՁӁubtbqwlu{hˁҁρၳŁǁsāimirz{΁q˂܁ցȁYzt{xwonxƁہǁс쁼D]@)ȂЁ}{́t܁yqxЁۂv0؃؂؁ЁÁftxeryc}{\ŁhxŁ ;䃽1 N ԁŁrw{zorw{xrŁ~{Ł؁&DŽ\B􁸁ށ~zgāOPzāvlˁ_MvƩHރ2 ؁΁yЁ{wk;^{zˁD΅ʌ›-cH܂ ʁ恗x|Ɓ|rx{6X:y0se~eāÁeځlq^sՁρʂ.1RqO?dh>Rxupflmȁax|}wWzӁ3< ׁȁÁwrǁc_d\ ւ(遇vԁ|nyXrɁqaut Gh9e򁵁Ձˁsq~䁈udqtcƁxÁ߁x8<&ԁzȁb|lr}ҁd_Ɓ߁тӁЁtԁqxh|bsl恋t}f}ЁׁсՁnāfkāqK}{~vŁÁÁځíf|ρсÁЁԁց{́́wgvykh́h|tȁāājpwρd{wxpjvsańÁɁwxkҁxdptxwԁЁ{ˁ{Ł~vsicȁXP~~FvyrjiÁF]΁spr~{DRxˁZqzt\x}pxtW}v_yɁqƁ}zdtdn{^~ՁouyiŁpitr~Whglv~fɁ{qځ恾yfhlQw`[^||v}v<cr|xpg|}wuqqU~|n΁~vboxynd݁|yvzhpVfy偋။xw_TupxynǁOxpzˁ}rqxqoānwsupgl[zwqāف{ḱrŁuicUŁj{Ёupmsсljdisd`[~i|`\tv䁲}yˁmՁr~lzzpxvk|Sczx݁ځpxÁ{Łk~z||~xgfln~f}oxƁsuyn}izwjzz|Á΁h{vƁāށzm_pq|]nlz~x{ttz \ No newline at end of file diff --git a/data/fits/STAR_FOCUS_14.fits b/data/fits/STAR_FOCUS_14.fits deleted file mode 100644 index 8e91733fa..000000000 Binary files a/data/fits/STAR_FOCUS_14.fits and /dev/null differ diff --git a/data/fits/STAR_FOCUS_15.fits b/data/fits/STAR_FOCUS_15.fits deleted file mode 100644 index 16b5b6440..000000000 --- a/data/fits/STAR_FOCUS_15.fits +++ /dev/null @@ -1,4 +0,0 @@ -SIMPLE = T / Created by ImageJ FITS_Writer BITPIX = 16 / number of bits per data pixel NAXIS = 2 / number of data axes NAXIS1 = 65 / length of data axis 1 NAXIS2 = 85 / length of data axis 2 BZERO = 32768 / data range offset BSCALE = 1 / default scaling factor DATAMIN = 0.000000 DATAMAX = 65535.000000 INSTRUME= 'ATIK-383L: fw rev 3.27' FILTER = 'Position 3' EXPTIME = 3.000 DATE-OBS= '2014-01-17T20:35:09' XPIXSZ = 5.400 YPIXSZ = 5.400 XBINNING= 1 YBINNING= 1 XORGSUBF= 1127 YORGSUBF= 915 XPOSSUBF= 1127 YPOSSUBF= 915 CBLACK = 321 CWHITE = 3866 CCD-TEMP= -10.0 SWCREATE= 'Artemis Capture' END ~itll||}wQaelL^_ujTu{~cǁviqqm}z_s~fl~twZ{nhv|S{lx|y^~j~tÁcupuwyÁemkiuZwrub^fd~zhpphmqtyw[}Vdrt}xρw{Yhtp\}yaprhk|p^`~|tf`khzq\~rx|Jr{vri|qy\}~Heo~|uueN~\~l}m[|]|t{MvSqpnyu~vx||ulɁX~}x~ki}Xaps\[zwʁwf{uxgVwq}c|hdp}zEZxnn\|zxgtz]Ӂ{v|wnP~|powoltgNn~zvz~yuiuwvuwsrcjxtsR~r=msO{zu^m|bqewpЁɁȁtthmnw}ej}|spwwjy[|P\ryv~v`reqpdVlh`v{Moe[y}k~mhlx}SbHjj{b~с|zmkpƁsx|kȁsl|[WfmznTdw]vltiq}Fiph~|xrxwvVrj~g_btI\k~~hk}g|uŁxpbgeu{N]bl}ryos|ntktju|ziblpxeʁlvry`gtv~xix~|]fgp}b~xtZi|x_r]fmƁtpÁwp|iqzh|ldxwa~{nu|edxznxV}jfqr}un~^}vgnrxdYqV`q~K|kp{spt}{B}ZƁ~\~~doekfdnmtYao`yXord~{z|~j́v]s}xepkbe|ipe{eecstkr~U{zvƁʁz{mUrfX]zl{}Łqv~|x|tjρb}etlzxp`twkuaȁnvf^`kpyvpvVoik`izfyr{~yriy΁zeh}~Zn^}f{ρS~~tbxxfvh\|jɁbhmzȁ~́xyolpj~ZskcbuakdpT}Okxā؁Ӂ灲uǁ⁾tLpxxL={sǁK~|Ɂ遴΁%zl|glew؁ye{ˁȁԁ΁ˁӁV#R͂pف}_zj}qwXʁzȁƁ4(4ȁerGxsk\fpтK5 -ЉU o'шp"9uspсx{xVjr9y~~zqp#JI[}ĂԂK:!{Áv́wwM~w9yS~Xrkj},݌-ʼnك傌eł -_Hd؁hoy|[PiQ|xpg$sɂ܂΂I sÁ{merzdxrm`z~vڊK40Nކi0؃ցЁtgR^p|UĺynyhX،WۅuVy􅄈\+\Շuۊ K - ~Xszlkttwj\uおЁ84+؍f*ۉ{hWӁɁi^~duq~o`T~nw{vȁ8ΐN2U끠ǁu\trc{p^}|遞􂱃 S~%mق7ӁPŁq||irxLkwggepǁ˂9<ڃ^灳|Ł}buk\Ё{Ábpd~y~pxЁMρT^lC*큹\np~\j{zx6ZbՁȁӁ΁Ӂolynsv|g~sh}ȁǁˁ{AhRu|ztjl~t~xu~dǁ}u}mtoutZ[vā|i`kuu|fryl]ǁ`ɁUr=U|zYhq}gɁၠcḰz}óv{|MPԁځ{|phs_w[V|rwp}jxVrqoqbnvLh}m|xekmYx⁈r|^nJv{W|kslNqrkzojvUxlpVpe|nẂwv܁ׁyjpl}zo[vww|us}fo~sinzw{|~\ryqia}Po^Rwmturjm}ivVhzoX}dj|zdρxfmphjgsilxu[|vwq}r^kzÁo[x~UjwbaVwTphk~^[tsyk{kllZkہuzka|{gt\VgʁIUtdyrpwŁSaqqsyyiStPXs][Pe`ryRv|hrk"ysKknqwgl \ No newline at end of file diff --git a/data/fits/STAR_FOCUS_16.fits b/data/fits/STAR_FOCUS_16.fits deleted file mode 100644 index 407bcc4a5..000000000 --- a/data/fits/STAR_FOCUS_16.fits +++ /dev/null @@ -1,4 +0,0 @@ -SIMPLE = T / Created by ImageJ FITS_Writer BITPIX = 16 / number of bits per data pixel NAXIS = 2 / number of data axes NAXIS1 = 65 / length of data axis 1 NAXIS2 = 85 / length of data axis 2 BZERO = 32768 / data range offset BSCALE = 1 / default scaling factor DATAMIN = 0.000000 DATAMAX = 65535.000000 INSTRUME= 'ATIK-383L: fw rev 3.27' FILTER = 'Position 3' EXPTIME = 3.000 DATE-OBS= '2014-01-17T20:35:54' XPIXSZ = 5.400 YPIXSZ = 5.400 XBINNING= 1 YBINNING= 1 XORGSUBF= 1127 YORGSUBF= 915 XPOSSUBF= 1127 YPOSSUBF= 915 CBLACK = 324 CWHITE = 2489 CCD-TEMP= -10.0 SWCREATE= 'Artemis Capture' END mtkhoRЁt`kƁrh灸ցÁρ}Ё{uxˁii|v́d[xz||с́t{nvuut}inmxd~{āX}~ypxOz|ztz^ǁg}gV~{X́{~~nxQ́ʁtqvnx[~ds|fځezpj]|ouqkJ}myzʁV|~knrǁU|wÁxsŁz{ysyafszwvufoce}qnwsgyllijgmyyjn{vt~thWwsvrsms}Nn΁z܁Ё|Ɂ{||}^}ρ؁v{zypq|ń|}ptsbzu}zŁXonSNqƁs{rȁdvȁlgpx|ˁ}lvρvurx~āDj{bp|||zksyuqɁ\}k|KɁqae`zknv{~|_|XmkցZzwk|ckm`RpЁtxxÁ~vwqkr|ezoLӁzsՁpsρuhuqSUVg`}xńv{uvvҁt|inubā||hd}lXenz^uióȁ^Ӂˁś́hācjЁЁāo~ur~rlzfՁlYZjqwʁpxzȁ΁vhӁul΁r{s||sivŁŁ}ȁosʁgq||]ȁʁyz쁄~ՁŁrƁāgf|xՁźԁ́jށm쁼ԁvĺtw}g{`xmyفˁ聱遞ӁɁсY}v`[izjŁЁŁ遱-ށ҂5Jԁ{؁elznɁrǁww끭 =_qƂt"S -ǁ၆n{LZ}yMt݁́Łց|􃃃݄.-MHׂӂȂTցŁuvkRvnہ~Ȃ -.̈́] yv&rՁpсjml~遈Ă:ᄬ煽cRFK>V{;%܁Łātiz\my؂iCr؆%!僊#K.炂ށށx́r=Ձف܁܂{ۃ]z`烲)@$ہrÁvŁcpt~N|{ԁyŁxā(To|~iOȁŁz~~ȁtxM{yʁЁ>%EƃS<ς+ׄw.ʂ}rp|}сā ؅RӅ_ނ|#uSZk.XX]āցyn^}|uȁā;'h'1xփo>H0"肈ԁÁہƁ[{ko񁚁؂""11lMVC ҁ́ҁ?˃)i煫%с́dCɁҁ9ˇ;QЅ=3(ׁ́ւBGS`5遪ɁƁuh́upƁ!<077؃ɁԁہKЇɅ ćāriŁ>ŁaقVuℙZ]т EăUن醤l݁Ɂā~y{ox8K{ eւĂȂ -сق1IO*僥ǁ}fwсw_H}΁́󁪁!/jG<ȁ+L?rۅotru<ȁ[́́~zтJ9|JNĂ 0΂h(+ֆŃ܁ȁwā~Łzr{΁sg͂~pćxÆcM6i8& bx ք~@Äm_C{x~wsrro5V/9"m򂎂z͂o,7\ nȁ~|r\bv^id́ՁLt{Kd^ -ˆM{ouf{M`hzÁЁ͂c='DV\B օRтρfer܁szpɁyڂXۆ݊t܈drׇ҆V׈=g 䁍Ł}yZqrvoG̈e ;lbŁсspnx܁ǁ݁Zy$넮(rtso݁}eӁ|zwԁzRȁ{ā؁́~́jX|tRasvɁiҁ\xRʁfmlnǁcsomсŁRЁjŁcԁ́v{ҁ}\h3sՁɁ|}yʁȁցmsn}[Ł~uzi䁎}[|huib|YŁfyrY}{sn|ˁŁstpa}f́q}p聵}܁{Ձ_kEm݁́vxvSyyuk聰ρÁguȁhŁzhˁ܁Ɂg؁gieρāЁpzc}pjoxpVgs~ցu{rɁ||māVぞqgrśفၫwju^xykҁx|uҁ~v|zr=}ʁ}ȁ~lptYwzρu~ShzwÁjnԁʁ΁{oāāЁ|d偊}j}ms`^vāxӁÁففɁ񁬁΁ρ߁jweucxӁwʁځiŁqf܁Áǁс_ȁy|voĺeuӁ}{́~w؁ÁÁցjksЁ}b|~ށeJf܁ǁɁƂʁkknс́m[Ёvvz{فǂ؂_,rρ|uY\́~ʁjׂ44m'=aȂ6 opvdzonśl{xj<σ(y(xu}c|~woс݁Ё 5Ƀ}nAԄbЂeƁ{}~ÁcāɁ}unkŁmāyh҂#Ђb|BSX*̆tʄ@63́Áԁz}elÁn}ʁӁׂ"ŃȆVU* wslńnʁ|၎jȁ݁ل.zc⁡灸́y~x|efāubshxq^́m΁iHŁցOǁjchw|ہ{syúx|Ái|pp|~e~~pāӁցsy|slv{qe|~kˁЁ{|]~pt΁`\`Zāiszm[tetB]}Vǁow~y{wMŁ\_|Ɓpl|dcQxz_΁y{\~nyxyf}}[xbuǁ{uta~en|ɁLmqjwnyqqiÁ_m~||n݁|ف[s}xzoсnl΁mf~b{mhź|p|l{lzb~mxoviyZgȁw~~tbb`ysZyff􁱁xzywyulyǁ]zyfCg{́Ffyirmtx[yevhzHvy]rЁKr~sTt^fʁ|qsre}pā\kybf́u~}ցi|tÁ{wszlxŁey|vmx́nuyTz|r~tptՁz{āTɁj}zqq΁hzxxc|{eUejāmzʁp[a݁|o_nǁ}ʁ|qluρz}xgQāՁ}lŁdz~nȁo{VguovkykdƁ~lyleaҁz{ǵԁyuayeln~k{ÁXs|~QSlXy]ickejmw{xuevlkvցd[zdu~xo~L|\ \ No newline at end of file diff --git a/data/fits/STAR_FOCUS_6.fits b/data/fits/STAR_FOCUS_6.fits deleted file mode 100644 index 259ba3754..000000000 Binary files a/data/fits/STAR_FOCUS_6.fits and /dev/null differ diff --git a/data/fits/STAR_FOCUS_7.fits b/data/fits/STAR_FOCUS_7.fits deleted file mode 100644 index 69164e4c7..000000000 --- a/data/fits/STAR_FOCUS_7.fits +++ /dev/null @@ -1,3 +0,0 @@ -SIMPLE = T / Created by ImageJ FITS_Writer BITPIX = 16 / number of bits per data pixel NAXIS = 2 / number of data axes NAXIS1 = 65 / length of data axis 1 NAXIS2 = 85 / length of data axis 2 BZERO = 32768 / data range offset BSCALE = 1 / default scaling factor DATAMIN = 0.000000 DATAMAX = 65535.000000 INSTRUME= 'ATIK-383L: fw rev 3.27' FILTER = 'Position 3' EXPTIME = 3.000 DATE-OBS= '2014-01-17T20:33:06' XPIXSZ = 5.400 YPIXSZ = 5.400 XBINNING= 1 YBINNING= 1 XORGSUBF= 1127 YORGSUBF= 915 XPOSSUBF= 1127 YPOSSUBF= 915 CBLACK = 317 CWHITE = 10155 CCD-TEMP= -10.0 SWCREATE= 'Artemis Capture' END khskہn{y|i{r~|ypsrCy~~qwyUف~{X^Sptxaǁ~q|}{_nppTYvkMt~tokeokgEiwxus}wG|bn{k{{yR~ceJg{P|o\rw[tz[|zvELFw}ywhlpXo}fzl\mf]kzivstcf~t΁́zkXRx|ZRuY|pnvx_{bvxvm}[qúirr6t{plmuzȁŁ~{b}dbzQmÁds<^n}ks[l~}p[z؁so|guq\{]biyrQkie\ovlwفgttj_nvaJyswl~~d]g~{tol`}V^{pok}lr{}u`pŁigsyurbczrlzkyrqwo`nsr؁U|Mrn}`tKbioljvrldgu`dMe|lsXkvwrstVtɁh\sd^^Ws{lib{mhcY{|źqotiw~n}kg~Vs|vpj}yerwfmq{qoVxfnmvuthsr~hct`SnVudhZwV|kVuYza{hɁepn{djT{pjnhpaimknrzz^vn|Łlr^xy`Ynpes{{}skiĺ|jtrc~~qtp_ul΁_{}bρyx|UntyŁwqKfl~NpmyS[yx~[plliuāvM|ssop{bfl[z~ipv]yiЁq΁|vpnwyp~e}zZZelPq}|szÁy}tx}qxbtjxpŁUlb|pQuz}[pmn2nkJuyyqqYWfuTwld{_~~dzpXr_Hjvzwrr~wevqnrNeuMjW؁zm}}u|zlсhgnŕr`ƁvtkCmqb|pgI~uS^Ɂzzstzmh~nāinxlnm~t_qxƁu}r{z[~N|uɁjnہ߁ȁou}yeww\ytrhdd~}íu؁ہځԁuj}mxفoZz}[gyj˂`Ctҁ҂ˁÁɁ}ցnu\jfp}oe|@$B=끾ցuuhqrxfysK}ZntЂ=-1nނ˂}yzsl|xxmgw{Ál{儙8tKρrumth[yemR}pɁ:E'] ˂WzjrǁypӁnbh;Ƀ;\CBƂفƁҁOanrS{^wctr}f0儖Ng:'MɆ@炁Łbuqx|gKho~X|d~~płx>ˉUʐВ׎78 \lǁځgrz}mc~ls45ܜޜŔځrokyepFtaPāc`wŬLEE%~Ȃd -؁ԁȁwhnZSk}tÁс=DŽWaϬrԈp؁^~rTqpmtú~Ӂ肬k Un֛wp΄ڃ%,災m~y~bY`ni|{ < jNPSqmG넋/ぎrhȁv{vy>}}Łwޅ('̉Pہs^zpe`~woxocy[!̅M`Q<灔p||tk~gf]]oyoyhwu{{ˁނHltx́yszeyV`w~{bށÁtЁЂ -W9Lewwwq9bphātyz|āry~}`{%3\u)ׁād΁zZoF|zrЁށ ^cn}q|uu|b~ { - return this.openFile({ ...data, filters: [{ name: 'FITS files', extensions: ['fits', 'fit'] }] }) + return this.openFile({ + ...data, filters: [ + { name: 'All', extensions: ['fits', 'fit', 'xisf'] }, + { name: 'FITS', extensions: ['fits', 'fit'] }, + { name: 'XISF', extensions: ['xisf'] }, + ] + }) } saveFits(data?: OpenFile) { return this.saveFile({ ...data, filters: [ - { name: 'FITS files', extensions: ['fits', 'fit'] }, - { name: 'Image files', extensions: ['png', 'jpe?g'] }, + { name: 'All', extensions: ['fits', 'fit', 'xisf', 'png', 'jpe?g'] }, + { name: 'FITS', extensions: ['fits', 'fit'] }, + { name: 'XISF', extensions: ['xisf'] }, + { name: 'Image', extensions: ['png', 'jpe?g'] }, ] }) } diff --git a/desktop/src/shared/types/camera.types.ts b/desktop/src/shared/types/camera.types.ts index 75e188f5d..2400c2e09 100644 --- a/desktop/src/shared/types/camera.types.ts +++ b/desktop/src/shared/types/camera.types.ts @@ -1,6 +1,6 @@ import { MessageEvent } from './api.types' import { Thermometer } from './auxiliary.types' -import { PropertyState } from './device.types' +import { CompanionDevice, Device, PropertyState } from './device.types' import { GuideOutput } from './guider.types' export type CameraDialogMode = 'CAPTURE' | 'SEQUENCER' | 'FLAT_WIZARD' | 'TPPA' | 'DARV' @@ -62,10 +62,15 @@ export interface Camera extends GuideOutput, Thermometer { offset: number offsetMin: number offsetMax: number - hasGuiderHead: boolean + hasGuideHead: boolean pixelSizeX: number pixelSizeY: number capturesPath: string + guideHead?: Device +} + +export interface GuideHead extends Camera, CompanionDevice { + } export const EMPTY_CAMERA: Camera = { @@ -112,7 +117,7 @@ export const EMPTY_CAMERA: Camera = { offset: 0, offsetMin: 0, offsetMax: 0, - hasGuiderHead: false, + hasGuideHead: false, pixelSizeX: 0, pixelSizeY: 0, capturesPath: '', diff --git a/desktop/src/shared/types/device.types.ts b/desktop/src/shared/types/device.types.ts index 53b60d1a7..934a9509f 100644 --- a/desktop/src/shared/types/device.types.ts +++ b/desktop/src/shared/types/device.types.ts @@ -15,6 +15,10 @@ export interface Device { connected: boolean } +export interface CompanionDevice extends Device { + main: D +} + export interface INDIMessageEvent extends DeviceMessageEvent { property?: INDIProperty message?: string diff --git a/nebulosa-alignment/src/main/kotlin/nebulosa/alignment/polar/point/three/ThreePointPolarAlignment.kt b/nebulosa-alignment/src/main/kotlin/nebulosa/alignment/polar/point/three/ThreePointPolarAlignment.kt index 5b7772fc8..91e8a5bb3 100644 --- a/nebulosa-alignment/src/main/kotlin/nebulosa/alignment/polar/point/three/ThreePointPolarAlignment.kt +++ b/nebulosa-alignment/src/main/kotlin/nebulosa/alignment/polar/point/three/ThreePointPolarAlignment.kt @@ -2,15 +2,10 @@ package nebulosa.alignment.polar.point.three import nebulosa.common.concurrency.cancel.CancellationToken import nebulosa.constants.DEG2RAD -import nebulosa.fits.declination -import nebulosa.fits.observationDate -import nebulosa.fits.rightAscension -import nebulosa.imaging.Image import nebulosa.math.Angle import nebulosa.plate.solving.PlateSolution import nebulosa.plate.solving.PlateSolver import nebulosa.plate.solving.PlateSolvingException -import nebulosa.time.TimeYMDHMS import nebulosa.time.UTC import java.nio.file.Path import kotlin.math.min @@ -34,15 +29,13 @@ data class ThreePointPolarAlignment( private set fun align( - path: Path, image: Image, - rightAscension: Angle = image.header.rightAscension, - declination: Angle = image.header.declination, - radius: Angle = DEFAULT_RADIUS, + path: Path, + rightAscension: Angle, declination: Angle, radius: Angle = DEFAULT_RADIUS, compensateRefraction: Boolean = false, cancellationToken: CancellationToken = CancellationToken.NONE, ): ThreePointPolarAlignmentResult { val solution = try { - solver.solve(path, image, rightAscension, declination, radius, cancellationToken = cancellationToken) + solver.solve(path, null, rightAscension, declination, radius, cancellationToken = cancellationToken) } catch (e: PlateSolvingException) { return ThreePointPolarAlignmentResult.NoPlateSolution(e) } @@ -50,7 +43,7 @@ data class ThreePointPolarAlignment( if (!solution.solved || cancellationToken.isCancelled) { return ThreePointPolarAlignmentResult.NoPlateSolution(null) } else { - val time = image.header.observationDate?.let { UTC(TimeYMDHMS(it)) } ?: UTC.now() + val time = UTC.now() positions[min(state, 2)] = solution.position(time, compensateRefraction) diff --git a/nebulosa-alpaca-indi/src/main/kotlin/nebulosa/alpaca/indi/device/ASCOMDevice.kt b/nebulosa-alpaca-indi/src/main/kotlin/nebulosa/alpaca/indi/device/ASCOMDevice.kt index e3af0574c..4c4111955 100644 --- a/nebulosa-alpaca-indi/src/main/kotlin/nebulosa/alpaca/indi/device/ASCOMDevice.kt +++ b/nebulosa-alpaca-indi/src/main/kotlin/nebulosa/alpaca/indi/device/ASCOMDevice.kt @@ -18,9 +18,6 @@ abstract class ASCOMDevice : Device { protected abstract val service: AlpacaDeviceService abstract override val sender: AlpacaClient - @Suppress("PropertyName") - @JvmField protected val LOG = loggerFor(javaClass) - override val name get() = device.name @@ -153,4 +150,9 @@ abstract class ASCOMDevice : Device { } } } + + companion object { + + @JvmStatic private val LOG = loggerFor() + } } diff --git a/nebulosa-alpaca-indi/src/main/kotlin/nebulosa/alpaca/indi/device/cameras/ASCOMCamera.kt b/nebulosa-alpaca-indi/src/main/kotlin/nebulosa/alpaca/indi/device/cameras/ASCOMCamera.kt index f6929f99d..a8a4df2d1 100644 --- a/nebulosa-alpaca-indi/src/main/kotlin/nebulosa/alpaca/indi/device/cameras/ASCOMCamera.kt +++ b/nebulosa-alpaca-indi/src/main/kotlin/nebulosa/alpaca/indi/device/cameras/ASCOMCamera.kt @@ -7,17 +7,24 @@ import nebulosa.alpaca.api.PulseGuideDirection import nebulosa.alpaca.indi.client.AlpacaClient import nebulosa.alpaca.indi.device.ASCOMDevice import nebulosa.common.concurrency.latch.CountUpDownLatch -import nebulosa.fits.* -import nebulosa.imaging.algorithms.transformation.CfaPattern +import nebulosa.fits.Bitpix +import nebulosa.fits.Fits +import nebulosa.fits.FitsHeader +import nebulosa.fits.FitsKeyword +import nebulosa.image.algorithms.transformation.CfaPattern +import nebulosa.image.format.BasicImageHdu +import nebulosa.image.format.FloatImageData +import nebulosa.image.format.HeaderCard import nebulosa.indi.device.Device import nebulosa.indi.device.camera.* -import nebulosa.indi.device.camera.Camera.Companion.NANO_SECONDS +import nebulosa.indi.device.camera.Camera.Companion.NANO_TO_SECONDS import nebulosa.indi.device.guide.GuideOutputPulsingChanged import nebulosa.indi.device.mount.Mount import nebulosa.indi.protocol.INDIProtocol import nebulosa.indi.protocol.PropertyState import nebulosa.io.readDoubleLe import nebulosa.io.readFloatLe +import nebulosa.log.loggerFor import nebulosa.math.formatHMS import nebulosa.math.formatSignedDMS import nebulosa.math.normalized @@ -34,117 +41,73 @@ import java.time.format.DateTimeFormatter import kotlin.math.max import kotlin.math.min +@Suppress("RedundantModalityModifier") data class ASCOMCamera( override val device: ConfiguredDevice, override val service: AlpacaCameraService, override val sender: AlpacaClient, ) : ASCOMDevice(), Camera { - @Volatile override var exposuring = false - private set - @Volatile override var hasCoolerControl = false - private set - @Volatile override var coolerPower = 0.0 - private set - @Volatile override var cooler = false - private set - @Volatile override var hasDewHeater = false - private set - @Volatile override var dewHeater = false - private set - @Volatile override var frameFormats = emptyList() - private set - @Volatile override var canAbort = false - private set - @Volatile override var cfaOffsetX = 0 - private set - @Volatile override var cfaOffsetY = 0 - private set - @Volatile override var cfaType = CfaPattern.RGGB - private set - @Volatile override var exposureMin: Duration = Duration.ZERO - private set - @Volatile override var exposureMax: Duration = Duration.ZERO - private set - @Volatile override var exposureState = PropertyState.IDLE - private set - @Volatile override var exposureTime: Duration = Duration.ZERO - private set - @Volatile override var hasCooler = false - private set - @Volatile override var canSetTemperature = false - private set - @Volatile override var canSubFrame = true - private set - @Volatile override var x = 0 - private set - @Volatile override var minX = 0 - private set - @Volatile override var maxX = 0 - private set - @Volatile override var y = 0 - private set - @Volatile override var minY = 0 - private set - @Volatile override var maxY = 0 - private set - @Volatile override var width = 0 - private set - @Volatile override var minWidth = 0 - private set - @Volatile override var maxWidth = 0 - private set - @Volatile override var height = 0 - private set - @Volatile override var minHeight = 0 - private set - @Volatile override var maxHeight = 0 - private set - @Volatile override var canBin = true - private set - @Volatile override var maxBinX = 1 - private set - @Volatile override var maxBinY = 1 - private set - @Volatile override var binX = 1 - private set - @Volatile override var binY = 1 - private set - @Volatile override var gain = 0 - private set - @Volatile override var gainMin = 0 - private set - @Volatile override var gainMax = 0 - private set - @Volatile override var offset = 0 - private set - @Volatile override var offsetMin = 0 - private set - @Volatile override var offsetMax = 0 - private set - @Volatile override var hasGuiderHead = false // TODO: ASCOM has guider head? - private set - @Volatile override var pixelSizeX = 0.0 - private set - @Volatile override var pixelSizeY = 0.0 - private set - - @Volatile override var hasThermometer = false - private set - @Volatile override var temperature = 0.0 - private set - - @Volatile override var canPulseGuide = false - private set - @Volatile override var pulseGuiding = false - private set + @Volatile final override var exposuring = false + @Volatile final override var hasCoolerControl = false + @Volatile final override var coolerPower = 0.0 + @Volatile final override var cooler = false + @Volatile final override var hasDewHeater = false + @Volatile final override var dewHeater = false + @Volatile final override var frameFormats = emptyList() + @Volatile final override var canAbort = false + @Volatile final override var cfaOffsetX = 0 + @Volatile final override var cfaOffsetY = 0 + @Volatile final override var cfaType = CfaPattern.RGGB + @Volatile final override var exposureMin: Duration = Duration.ZERO + @Volatile final override var exposureMax: Duration = Duration.ZERO + @Volatile final override var exposureState = PropertyState.IDLE + @Volatile final override var exposureTime: Duration = Duration.ZERO + @Volatile final override var hasCooler = false + @Volatile final override var canSetTemperature = false + @Volatile final override var canSubFrame = true + @Volatile final override var x = 0 + @Volatile final override var minX = 0 + @Volatile final override var maxX = 0 + @Volatile final override var y = 0 + @Volatile final override var minY = 0 + @Volatile final override var maxY = 0 + @Volatile final override var width = 0 + @Volatile final override var minWidth = 0 + @Volatile final override var maxWidth = 0 + @Volatile final override var height = 0 + @Volatile final override var minHeight = 0 + @Volatile final override var maxHeight = 0 + @Volatile final override var canBin = true + @Volatile final override var maxBinX = 1 + @Volatile final override var maxBinY = 1 + @Volatile final override var binX = 1 + @Volatile final override var binY = 1 + @Volatile final override var gain = 0 + @Volatile final override var gainMin = 0 + @Volatile final override var gainMax = 0 + @Volatile final override var offset = 0 + @Volatile final override var offsetMin = 0 + @Volatile final override var offsetMax = 0 + @Volatile final override var pixelSizeX = 0.0 + @Volatile final override var pixelSizeY = 0.0 + + @Volatile final override var hasThermometer = false + @Volatile final override var temperature = 0.0 + + @Volatile final override var canPulseGuide = false + @Volatile final override var pulseGuiding = false + + final override val guideHead = null // TODO: ASCOM has guide head? @Volatile private var cameraState = CameraState.IDLE @Volatile private var frameType = FrameType.LIGHT - @Volatile private var mount: Mount? = null + @Volatile private var fitsKeywords: Array = emptyArray() private val imageReadyWaiter = ImageReadyWaiter() + override val snoopedDevices = ArrayList(4) + init { refresh(0L) imageReadyWaiter.start() @@ -197,7 +160,7 @@ data class ASCOMCamera( override fun startCapture(exposureTime: Duration) { this.exposureTime = exposureTime - service.startExposure(device.number, exposureTime.toNanos() / NANO_SECONDS, frameType == FrameType.DARK).doRequest { + service.startExposure(device.number, exposureTime.toNanos() / NANO_TO_SECONDS, frameType == FrameType.DARK).doRequest { imageReadyWaiter.captureStarted() } } @@ -238,13 +201,16 @@ data class ASCOMCamera( override fun snoop(devices: Iterable) { for (device in devices) { - if (device is Mount) mount = device + device?.also(snoopedDevices::add) } } - override fun handleMessage(message: INDIProtocol) { + override fun fitsKeywords(vararg cards: HeaderCard) { + fitsKeywords = cards } + override fun handleMessage(message: INDIProtocol) = Unit + override fun onConnected() { processExposureMinMax() processFrameMinMax() @@ -256,8 +222,7 @@ data class ASCOMCamera( processReadoutModes() } - override fun onDisconnected() { - } + override fun onDisconnected() = Unit override fun reset() { super.reset() @@ -303,7 +268,6 @@ data class ASCOMCamera( offset = 0 offsetMin = 0 offsetMax = 0 - hasGuiderHead = false pixelSizeX = 0.0 pixelSizeY = 0.0 hasThermometer = false @@ -560,8 +524,8 @@ data class ASCOMCamera( private fun processExposureMinMax() { service.exposureMin(device.number).doRequest { min -> service.exposureMax(device.number).doRequest { max -> - exposureMin = Duration.ofNanos((min.value * NANO_SECONDS).toLong()) - exposureMax = Duration.ofNanos((max.value * NANO_SECONDS).toLong()) + exposureMin = Duration.ofNanos((min.value * NANO_TO_SECONDS).toLong()) + exposureMax = Duration.ofNanos((max.value * NANO_TO_SECONDS).toLong()) sender.fireOnEventReceived(CameraExposureMinMaxChanged(this)) } @@ -614,96 +578,98 @@ data class ASCOMCamera( val width = metadata.dimension1 val height = metadata.dimension2 - val planes = max(1, metadata.dimension3) + val numberOfChannels = max(1, metadata.dimension3) val source = stream.source().buffer() - val data = Array(planes) { FloatImageData(width, height) } + val data = FloatImageData(width, height, numberOfChannels) + val channels = arrayOf(data.red, data.green, data.blue) for (x in 0 until width) { for (y in 0 until height) { val idx = y * width + x - for (p in 0 until planes) { - val pixel = when (metadata.imageElementType.bitpix) { + for (p in 0 until numberOfChannels) { + channels[p][idx] = when (metadata.imageElementType.bitpix) { Bitpix.BYTE -> (source.readByte().toInt() and 0xFF) / 255f Bitpix.SHORT -> (source.readShortLe().toInt() + 32768) / 65535f - Bitpix.INTEGER -> ((source.readIntLe().toLong() + 2147483648) / 4294967295.0).toFloat() + Bitpix.INTEGER -> ((source.readIntLe().toLong() + 2147483648L) / 4294967295.0).toFloat() Bitpix.FLOAT -> source.readFloatLe() Bitpix.DOUBLE -> source.readDoubleLe().toFloat() Bitpix.LONG -> return } - - data[p].data[idx] = pixel } } } source.close() - val header = Header() - header.add(Standard.SIMPLE, true) - header.add(Standard.BITPIX, -32) - header.add(Standard.NAXIS, if (planes == 3) 3 else 2) - header.add(Standard.NAXIS1, width) - header.add(Standard.NAXIS2, height) - if (planes == 3) header.add(Standard.NAXIS3, planes) - header.add(Standard.EXTEND, true) - header.add(Standard.INSTRUME, name) - header.add(Standard.EXPTIME, 0.0) // TODO - header.add(SBFitsExt.CCD_TEMP, temperature) - header.add(NOAOExt.PIXSIZEn.n(1), pixelSizeX) - header.add(NOAOExt.PIXSIZEn.n(2), pixelSizeY) - header.add(SBFitsExt.XBINNING, binX) - header.add(SBFitsExt.YBINNING, binY) - header.add(SBFitsExt.XPIXSZ, pixelSizeX * binX) - header.add(SBFitsExt.YPIXSZ, pixelSizeY * binY) + val header = FitsHeader() + header.add(FitsKeyword.SIMPLE, true) + header.add(FitsKeyword.BITPIX, -32) + header.add(FitsKeyword.NAXIS, if (numberOfChannels == 3) 3 else 2) + header.add(FitsKeyword.NAXIS1, width) + header.add(FitsKeyword.NAXIS2, height) + if (numberOfChannels == 3) header.add(FitsKeyword.NAXIS3, numberOfChannels) + header.add(FitsKeyword.EXTEND, true) + header.add(FitsKeyword.INSTRUME, name) + header.add(FitsKeyword.EXPTIME, 0.0) // TODO + header.add(FitsKeyword.CCD_TEMP, temperature) + header.add(FitsKeyword.PIXSIZEn.n(1), pixelSizeX) + header.add(FitsKeyword.PIXSIZEn.n(2), pixelSizeY) + header.add(FitsKeyword.XBINNING, binX) + header.add(FitsKeyword.YBINNING, binY) + header.add(FitsKeyword.XPIXSZ, pixelSizeX * binX) + header.add(FitsKeyword.YPIXSZ, pixelSizeY * binY) header.add("FRAME", frameType.description, "Frame Type") - header.add(SBFitsExt.IMAGETYP, "${frameType.description} Frame") + header.add(FitsKeyword.IMAGETYP, "${frameType.description} Frame") + + val mount = snoopedDevices.firstOrNull { it is Mount } as? Mount mount?.also { - header.add(Standard.TELESCOP, it.name) - header.add(SBFitsExt.SITELAT, it.latitude.toDegrees) - header.add(SBFitsExt.SITELONG, it.longitude.toDegrees) + header.add(FitsKeyword.TELESCOP, it.name) + header.add(FitsKeyword.SITELAT, it.latitude.toDegrees) + header.add(FitsKeyword.SITELONG, it.longitude.toDegrees) val center = Geoid.IERS2010.lonLat(it.longitude, it.latitude, it.elevation) val icrf = ICRF.equatorial(it.rightAscension, it.declination, epoch = CurrentTime, center = center) val raDec = icrf.equatorial() - header.add(SBFitsExt.OBJCTRA, raDec.longitude.normalized.formatHMS()) - header.add(SBFitsExt.OBJCTDEC, raDec.longitude.formatSignedDMS()) - header.add(Standard.RA, raDec.longitude.normalized.toDegrees) - header.add(Standard.DEC, raDec.longitude.toDegrees) - header.add(MaxImDLExt.PIERSIDE, it.pierSide.name) - header.add(Standard.EQUINOX, 2000) - header.add(Standard.DATE_OBS, LocalDate.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)) - header.add(Standard.COMMENT, "Generated by Nebulosa via ASCOM") - header.add(NOAOExt.GAIN, gain) + header.add(FitsKeyword.OBJCTRA, raDec.longitude.normalized.formatHMS()) + header.add(FitsKeyword.OBJCTDEC, raDec.longitude.formatSignedDMS()) + header.add(FitsKeyword.RA, raDec.longitude.normalized.toDegrees) + header.add(FitsKeyword.DEC, raDec.longitude.toDegrees) + header.add(FitsKeyword.PIERSIDE, it.pierSide.name) + header.add(FitsKeyword.EQUINOX, 2000) + header.add(FitsKeyword.DATE_OBS, LocalDate.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)) + header.add(FitsKeyword.COMMENT, "Generated by Nebulosa via ASCOM") + header.add(FitsKeyword.GAIN, gain) header.add("OFFSET", offset, "Offset") } - val hdu = ImageHdu(header, data) + fitsKeywords.forEach(header::add) - val fits = Fits() - fits.add(hdu) + val hdu = BasicImageHdu(width, height, numberOfChannels, header, data) - sender.fireOnEventReceived(CameraFrameCaptured(this, null, fits, false)) + val image = Fits() + image.add(hdu) + + sender.fireOnEventReceived(CameraFrameCaptured(this, image = image)) } ?: LOG.error("image body is null. device={}", name) } override fun toString() = "Camera(name=$name, connected=$connected, exposuring=$exposuring," + - " hasCoolerControl=$hasCoolerControl, cooler=$cooler," + - " hasDewHeater=$hasDewHeater, dewHeater=$dewHeater," + - " frameFormats=$frameFormats, canAbort=$canAbort," + - " cfaOffsetX=$cfaOffsetX, cfaOffsetY=$cfaOffsetY, cfaType=$cfaType," + - " exposureMin=$exposureMin, exposureMax=$exposureMax," + - " exposureState=$exposureState, exposureTime=$exposureTime," + - " hasCooler=$hasCooler, hasThermometer=$hasThermometer, canSetTemperature=$canSetTemperature," + - " temperature=$temperature, canSubFrame=$canSubFrame," + - " x=$x, minX=$minX, maxX=$maxX, y=$y, minY=$minY, maxY=$maxY," + - " width=$width, minWidth=$minWidth, maxWidth=$maxWidth, height=$height," + - " minHeight=$minHeight, maxHeight=$maxHeight," + - " canBin=$canBin, maxBinX=$maxBinX, maxBinY=$maxBinY," + - " binX=$binX, binY=$binY, gain=$gain, gainMin=$gainMin," + - " gainMax=$gainMax, offset=$offset, offsetMin=$offsetMin," + - " offsetMax=$offsetMax, hasGuiderHead=$hasGuiderHead," + - " canPulseGuide=$canPulseGuide, pulseGuiding=$pulseGuiding)" + " hasCoolerControl=$hasCoolerControl, cooler=$cooler," + + " hasDewHeater=$hasDewHeater, dewHeater=$dewHeater," + + " frameFormats=$frameFormats, canAbort=$canAbort," + + " cfaOffsetX=$cfaOffsetX, cfaOffsetY=$cfaOffsetY, cfaType=$cfaType," + + " exposureMin=$exposureMin, exposureMax=$exposureMax," + + " exposureState=$exposureState, exposureTime=$exposureTime," + + " hasCooler=$hasCooler, hasThermometer=$hasThermometer, canSetTemperature=$canSetTemperature," + + " temperature=$temperature, canSubFrame=$canSubFrame," + + " x=$x, minX=$minX, maxX=$maxX, y=$y, minY=$minY, maxY=$maxY," + + " width=$width, minWidth=$minWidth, maxWidth=$maxWidth, height=$height," + + " minHeight=$minHeight, maxHeight=$maxHeight," + + " canBin=$canBin, maxBinX=$maxBinX, maxBinY=$maxBinY," + + " binX=$binX, binY=$binY, gain=$gain, gainMin=$gainMin," + + " gainMax=$gainMax, offset=$offset, offsetMin=$offsetMin," + + " offsetMax=$offsetMax, canPulseGuide=$canPulseGuide, pulseGuiding=$pulseGuiding)" data class ImageMetadata( @JvmField val metadataVersion: Int, // Bytes 0..3 - Metadata version = 1 @@ -775,4 +741,9 @@ data class ASCOMCamera( } } } + + companion object { + + @JvmStatic private val LOG = loggerFor() + } } diff --git a/nebulosa-alpaca-indi/src/main/kotlin/nebulosa/alpaca/indi/device/focusers/ASCOMFocuser.kt b/nebulosa-alpaca-indi/src/main/kotlin/nebulosa/alpaca/indi/device/focusers/ASCOMFocuser.kt index 70247550c..e3b44fcd5 100644 --- a/nebulosa-alpaca-indi/src/main/kotlin/nebulosa/alpaca/indi/device/focusers/ASCOMFocuser.kt +++ b/nebulosa-alpaca-indi/src/main/kotlin/nebulosa/alpaca/indi/device/focusers/ASCOMFocuser.kt @@ -14,37 +14,28 @@ import nebulosa.indi.device.thermometer.ThermometerDetached import nebulosa.indi.device.thermometer.ThermometerTemperatureChanged import nebulosa.indi.protocol.INDIProtocol +@Suppress("RedundantModalityModifier") data class ASCOMFocuser( override val device: ConfiguredDevice, override val service: AlpacaFocuserService, override val sender: AlpacaClient, ) : ASCOMDevice(), Focuser { - @Volatile override var moving = false - private set - @Volatile override var position = 0 - private set - @Volatile override var canAbsoluteMove = false - private set - @Volatile override var canRelativeMove = false - private set - @Volatile override var canAbort = false - private set - @Volatile override var canReverse = false - private set - @Volatile override var reversed = false - private set - @Volatile override var canSync = false - private set - @Volatile override var hasBacklash = false - private set - @Volatile override var maxPosition = 0 - private set - - @Volatile override var hasThermometer = false - private set - @Volatile override var temperature = 0.0 - private set + @Volatile final override var moving = false + @Volatile final override var position = 0 + @Volatile final override var canAbsoluteMove = false + @Volatile final override var canRelativeMove = false + @Volatile final override var canAbort = false + @Volatile final override var canReverse = false + @Volatile final override var reversed = false + @Volatile final override var canSync = false + @Volatile final override var hasBacklash = false + @Volatile final override var maxPosition = 0 + + @Volatile final override var hasThermometer = false + @Volatile final override var temperature = 0.0 + + override val snoopedDevices = emptyList() override fun moveFocusIn(steps: Int) { if (canAbsoluteMove) { diff --git a/nebulosa-alpaca-indi/src/main/kotlin/nebulosa/alpaca/indi/device/mounts/ASCOMMount.kt b/nebulosa-alpaca-indi/src/main/kotlin/nebulosa/alpaca/indi/device/mounts/ASCOMMount.kt index d87ded2f8..02947cb0a 100644 --- a/nebulosa-alpaca-indi/src/main/kotlin/nebulosa/alpaca/indi/device/mounts/ASCOMMount.kt +++ b/nebulosa-alpaca-indi/src/main/kotlin/nebulosa/alpaca/indi/device/mounts/ASCOMMount.kt @@ -8,6 +8,7 @@ import nebulosa.indi.device.guide.GuideOutputPulsingChanged import nebulosa.indi.device.mount.* import nebulosa.indi.device.mount.PierSide import nebulosa.indi.protocol.INDIProtocol +import nebulosa.log.loggerFor import nebulosa.math.* import nebulosa.nova.position.ICRF import nebulosa.time.CurrentTime @@ -15,66 +16,43 @@ import java.time.Duration import java.time.OffsetDateTime import java.time.ZoneOffset +@Suppress("RedundantModalityModifier") data class ASCOMMount( override val device: ConfiguredDevice, override val service: AlpacaTelescopeService, override val sender: AlpacaClient, ) : ASCOMDevice(), Mount { - @Volatile override var slewing = false - private set - @Volatile override var tracking = false - private set - @Volatile override var parking = false - private set - @Volatile override var parked = false - private set - @Volatile override var canAbort = true - private set - @Volatile override var canSync = false - private set - @Volatile override var canGoTo = false - private set - @Volatile override var canPark = false - private set - @Volatile override var canHome = false - private set - @Volatile override var slewRates = emptyList() - private set - @Volatile override var slewRate: SlewRate? = null - private set - @Volatile override var mountType = MountType.EQ_GEM - private set - @Volatile override var trackModes = emptyList() - private set - @Volatile override var trackMode = TrackMode.SIDEREAL - private set - @Volatile override var pierSide = PierSide.NEITHER - private set - @Volatile override var guideRateWE = 0.0 - private set - @Volatile override var guideRateNS = 0.0 - private set - @Volatile override var rightAscension = 0.0 - private set - @Volatile override var declination = 0.0 - private set - - @Volatile override var canPulseGuide = false - private set - @Volatile override var pulseGuiding = false - private set - - @Volatile override var hasGPS = false - private set - @Volatile override var longitude = 0.0 - private set - @Volatile override var latitude = 0.0 - private set - @Volatile override var elevation = 0.0 - private set - @Volatile override var dateTime = OffsetDateTime.now()!! - private set + @Volatile final override var slewing = false + @Volatile final override var tracking = false + @Volatile final override var parking = false + @Volatile final override var parked = false + @Volatile final override var canAbort = true + @Volatile final override var canSync = false + @Volatile final override var canGoTo = false + @Volatile final override var canPark = false + @Volatile final override var canHome = false + @Volatile final override var slewRates = emptyList() + @Volatile final override var slewRate: SlewRate? = null + @Volatile final override var mountType = MountType.EQ_GEM + @Volatile final override var trackModes = emptyList() + @Volatile final override var trackMode = TrackMode.SIDEREAL + @Volatile final override var pierSide = PierSide.NEITHER + @Volatile final override var guideRateWE = 0.0 + @Volatile final override var guideRateNS = 0.0 + @Volatile final override var rightAscension = 0.0 + @Volatile final override var declination = 0.0 + + @Volatile final override var canPulseGuide = false + @Volatile final override var pulseGuiding = false + + @Volatile final override var hasGPS = false + @Volatile final override var longitude = 0.0 + @Volatile final override var latitude = 0.0 + @Volatile final override var elevation = 0.0 + @Volatile final override var dateTime = OffsetDateTime.now()!! + + override val snoopedDevices = emptyList() private val axisRates = HashMap(4) @Volatile private var axisRate: AxisRate? = null @@ -236,8 +214,8 @@ data class ASCOMMount( override fun coordinates(longitude: Angle, latitude: Angle, elevation: Distance) { service.siteLongitude(device.number, longitude.toDegrees).doRequest {} && - service.siteLatitude(device.number, latitude.toDegrees).doRequest {} && - service.siteElevation(device.number, elevation.toMeters).doRequest {} + service.siteLatitude(device.number, latitude.toDegrees).doRequest {} && + service.siteElevation(device.number, elevation.toMeters).doRequest {} } override fun dateTime(dateTime: OffsetDateTime) { @@ -255,8 +233,6 @@ data class ASCOMMount( processDateTime() equatorialSystem = service.equatorialSystem(device.number).doRequest()?.value ?: equatorialSystem - - LOG.info("The mount {} uses {} equatorial system", name, equatorialSystem) } override fun onDisconnected() {} @@ -475,4 +451,9 @@ data class ASCOMMount( } } } + + companion object { + + @JvmStatic private val LOG = loggerFor() + } } diff --git a/nebulosa-alpaca-indi/src/main/kotlin/nebulosa/alpaca/indi/device/wheels/ASCOMFilterWheel.kt b/nebulosa-alpaca-indi/src/main/kotlin/nebulosa/alpaca/indi/device/wheels/ASCOMFilterWheel.kt index 846b76726..b790fc497 100644 --- a/nebulosa-alpaca-indi/src/main/kotlin/nebulosa/alpaca/indi/device/wheels/ASCOMFilterWheel.kt +++ b/nebulosa-alpaca-indi/src/main/kotlin/nebulosa/alpaca/indi/device/wheels/ASCOMFilterWheel.kt @@ -10,20 +10,19 @@ import nebulosa.indi.device.filterwheel.FilterWheelNamesChanged import nebulosa.indi.device.filterwheel.FilterWheelPositionChanged import nebulosa.indi.protocol.INDIProtocol +@Suppress("RedundantModalityModifier") data class ASCOMFilterWheel( override val device: ConfiguredDevice, override val service: AlpacaFilterWheelService, override val sender: AlpacaClient, ) : ASCOMDevice(), FilterWheel { - @Volatile override var count = 0 - private set - @Volatile override var position = 0 - private set - @Volatile override var moving = false - private set - @Volatile override var names: List = emptyList() - private set + @Volatile final override var count = 0 + @Volatile final override var position = 0 + @Volatile final override var moving = false + @Volatile final override var names = emptyList() + + override val snoopedDevices = emptyList() override fun onConnected() { processPosition() diff --git a/nebulosa-astap/src/main/kotlin/nebulosa/astap/plate/solving/AstapPlateSolver.kt b/nebulosa-astap/src/main/kotlin/nebulosa/astap/plate/solving/AstapPlateSolver.kt index cd10570a5..4edb44f8a 100644 --- a/nebulosa-astap/src/main/kotlin/nebulosa/astap/plate/solving/AstapPlateSolver.kt +++ b/nebulosa-astap/src/main/kotlin/nebulosa/astap/plate/solving/AstapPlateSolver.kt @@ -2,10 +2,9 @@ package nebulosa.astap.plate.solving import nebulosa.common.concurrency.cancel.CancellationToken import nebulosa.common.process.ProcessExecutor -import nebulosa.fits.Header -import nebulosa.fits.NOAOExt -import nebulosa.fits.Standard -import nebulosa.imaging.Image +import nebulosa.fits.FitsHeader +import nebulosa.fits.FitsKeyword +import nebulosa.image.Image import nebulosa.log.loggerFor import nebulosa.math.Angle import nebulosa.math.deg @@ -94,21 +93,21 @@ class AstapPlateSolver(path: Path) : PlateSolver { val width = cdelt1 * dimensions[0].trim().toDouble() val height = cdelt2 * dimensions[1].trim().toDouble() - val header = Header() - header.add(Standard.CTYPE1, ctype1) - header.add(Standard.CTYPE2, ctype2) - header.add(Standard.CRPIX1, crpix1) - header.add(Standard.CRPIX2, crpix2) - header.add(Standard.CRVAL1, crval1) - header.add(Standard.CRVAL2, crval2) - header.add(Standard.CDELT1, cdelt1) - header.add(Standard.CDELT2, cdelt2) - header.add(Standard.CROTA1, crota1) - header.add(Standard.CROTA2, crota2) - header.add(NOAOExt.CD1_1, cd11) - header.add(NOAOExt.CD1_2, cd12) - header.add(NOAOExt.CD2_1, cd21) - header.add(NOAOExt.CD2_2, cd22) + val header = FitsHeader() + header.add(FitsKeyword.CTYPE1, ctype1) + header.add(FitsKeyword.CTYPE2, ctype2) + header.add(FitsKeyword.CRPIX1, crpix1) + header.add(FitsKeyword.CRPIX2, crpix2) + header.add(FitsKeyword.CRVAL1, crval1) + header.add(FitsKeyword.CRVAL2, crval2) + header.add(FitsKeyword.CDELT1, cdelt1) + header.add(FitsKeyword.CDELT2, cdelt2) + header.add(FitsKeyword.CROTA1, crota1) + header.add(FitsKeyword.CROTA2, crota2) + header.add(FitsKeyword.CD1_1, cd11) + header.add(FitsKeyword.CD1_2, cd12) + header.add(FitsKeyword.CD2_1, cd21) + header.add(FitsKeyword.CD2_2, cd22) val solution = PlateSolution(true, crota2.deg, cdelt2.deg, crval1.deg, crval2.deg, width.deg, height.deg, header = header) diff --git a/nebulosa-astrometrynet-jna/src/main/kotlin/nebulosa/astrometrynet/plate/solving/LibAstrometryNetPlateSolver.kt b/nebulosa-astrometrynet-jna/src/main/kotlin/nebulosa/astrometrynet/plate/solving/LibAstrometryNetPlateSolver.kt index 8f69b51ab..9bca41290 100644 --- a/nebulosa-astrometrynet-jna/src/main/kotlin/nebulosa/astrometrynet/plate/solving/LibAstrometryNetPlateSolver.kt +++ b/nebulosa-astrometrynet-jna/src/main/kotlin/nebulosa/astrometrynet/plate/solving/LibAstrometryNetPlateSolver.kt @@ -1,7 +1,7 @@ package nebulosa.astrometrynet.plate.solving import nebulosa.common.concurrency.cancel.CancellationToken -import nebulosa.imaging.Image +import nebulosa.image.Image import nebulosa.math.Angle import nebulosa.plate.solving.PlateSolution import nebulosa.plate.solving.PlateSolver diff --git a/nebulosa-astrometrynet/src/main/kotlin/nebulosa/astrometrynet/nova/NovaAstrometryNetService.kt b/nebulosa-astrometrynet/src/main/kotlin/nebulosa/astrometrynet/nova/NovaAstrometryNetService.kt index 51cffcdca..4574bbf5d 100644 --- a/nebulosa-astrometrynet/src/main/kotlin/nebulosa/astrometrynet/nova/NovaAstrometryNetService.kt +++ b/nebulosa-astrometrynet/src/main/kotlin/nebulosa/astrometrynet/nova/NovaAstrometryNetService.kt @@ -1,7 +1,7 @@ package nebulosa.astrometrynet.nova -import nebulosa.fits.FitsIO -import nebulosa.imaging.Image +import nebulosa.fits.FitsFormat +import nebulosa.image.Image import nebulosa.retrofit.RetrofitService import okhttp3.FormBody import okhttp3.MediaType.Companion.toMediaType @@ -62,7 +62,7 @@ class NovaAstrometryNetService( override fun contentType() = OCTET_STREAM_MEDIA_TYPE override fun writeTo(sink: BufferedSink) { - FitsIO.write(sink, image.hdu()) + image.writeTo(sink, FitsFormat) } } diff --git a/nebulosa-astrometrynet/src/main/kotlin/nebulosa/astrometrynet/plate/solving/LocalAstrometryNetPlateSolver.kt b/nebulosa-astrometrynet/src/main/kotlin/nebulosa/astrometrynet/plate/solving/LocalAstrometryNetPlateSolver.kt index 455f1ca60..690922646 100644 --- a/nebulosa-astrometrynet/src/main/kotlin/nebulosa/astrometrynet/plate/solving/LocalAstrometryNetPlateSolver.kt +++ b/nebulosa-astrometrynet/src/main/kotlin/nebulosa/astrometrynet/plate/solving/LocalAstrometryNetPlateSolver.kt @@ -2,7 +2,7 @@ package nebulosa.astrometrynet.plate.solving import nebulosa.common.concurrency.cancel.CancellationToken import nebulosa.common.process.ProcessExecutor -import nebulosa.imaging.Image +import nebulosa.image.Image import nebulosa.log.loggerFor import nebulosa.math.* import nebulosa.plate.solving.PlateSolution diff --git a/nebulosa-astrometrynet/src/main/kotlin/nebulosa/astrometrynet/plate/solving/NovaAstrometryNetPlateSolver.kt b/nebulosa-astrometrynet/src/main/kotlin/nebulosa/astrometrynet/plate/solving/NovaAstrometryNetPlateSolver.kt index a0f6a6bbe..ec6fd1671 100644 --- a/nebulosa-astrometrynet/src/main/kotlin/nebulosa/astrometrynet/plate/solving/NovaAstrometryNetPlateSolver.kt +++ b/nebulosa-astrometrynet/src/main/kotlin/nebulosa/astrometrynet/plate/solving/NovaAstrometryNetPlateSolver.kt @@ -4,8 +4,8 @@ import nebulosa.astrometrynet.nova.NovaAstrometryNetService import nebulosa.astrometrynet.nova.Session import nebulosa.astrometrynet.nova.Upload import nebulosa.common.concurrency.cancel.CancellationToken -import nebulosa.fits.Header -import nebulosa.imaging.Image +import nebulosa.fits.FitsHeader +import nebulosa.image.Image import nebulosa.log.loggerFor import nebulosa.math.Angle import nebulosa.math.toDegrees @@ -83,7 +83,7 @@ data class NovaAstrometryNetPlateSolver( val body = service.wcs(status.jobs[0]).execute().body() ?: throw PlateSolvingException("failed to retrieve WCS file") - val header = Header.from(body) + val header = FitsHeader.from(body) val calibration = PlateSolution.from(header) LOG.info("astrometry.net solved. calibration={}", calibration) diff --git a/nebulosa-fits/build.gradle.kts b/nebulosa-fits/build.gradle.kts index 290ac267a..cec8ef9cb 100644 --- a/nebulosa-fits/build.gradle.kts +++ b/nebulosa-fits/build.gradle.kts @@ -6,7 +6,8 @@ plugins { dependencies { api(project(":nebulosa-math")) api(project(":nebulosa-io")) - api("org.apache.commons:commons-numbers-complex:1.1") + api(project(":nebulosa-image-format")) + api(libs.apache.numbers.complex) implementation(project(":nebulosa-log")) testImplementation(project(":nebulosa-test")) } diff --git a/nebulosa-fits/src/main/kotlin/nebulosa/fits/Bitpix.kt b/nebulosa-fits/src/main/kotlin/nebulosa/fits/Bitpix.kt index eb487c908..f6bc99ba7 100644 --- a/nebulosa-fits/src/main/kotlin/nebulosa/fits/Bitpix.kt +++ b/nebulosa-fits/src/main/kotlin/nebulosa/fits/Bitpix.kt @@ -1,56 +1,52 @@ package nebulosa.fits +import nebulosa.image.format.HeaderCard +import nebulosa.image.format.ReadableHeader import kotlin.math.abs -enum class Bitpix(val type: Class, val code: Int, val description: String) { - BYTE(Byte::class.javaPrimitiveType!!, 8, "bytes"), - SHORT(Short::class.javaPrimitiveType!!, 16, "16-bit integers"), - INTEGER(Int::class.javaPrimitiveType!!, 32, "32-bit integers"), - LONG(Long::class.javaPrimitiveType!!, 64, "64-bit integers"), - FLOAT(Float::class.javaPrimitiveType!!, -32, "32-bit floating point"), - DOUBLE(Double::class.javaPrimitiveType!!, -64, "64-bit floating point"); +enum class Bitpix(@JvmField val code: Int) : HeaderCard by FitsHeaderCard.create(FitsKeyword.BITPIX, code) { + BYTE(8), + SHORT(16), + INTEGER(32), + LONG(64), + FLOAT(-32), + DOUBLE(-64); - val card = HeaderCard.create(Standard.BITPIX, code) - - val byteSize = abs(code) / 8 + @JvmField internal val byteLength = abs(code) / 8 companion object { @JvmStatic - fun from(header: Header): Bitpix { - return of(header.getInt(Standard.BITPIX, 0)) + fun from(header: ReadableHeader): Bitpix { + return of(header.getInt(FitsKeyword.BITPIX, 0)) } @JvmStatic - fun of(code: Int): Bitpix { - return when (code) { - 8 -> BYTE - 16 -> SHORT - 32 -> INTEGER - 64 -> LONG - -32 -> FLOAT - -64 -> DOUBLE - else -> throw IllegalArgumentException("invalid BITPIX code: $code") - } + fun of(code: Int) = when (code) { + 8 -> BYTE + 16 -> SHORT + 32 -> INTEGER + 64 -> LONG + -32 -> FLOAT + -64 -> DOUBLE + else -> throw IllegalArgumentException("invalid BITPIX code: $code") } @JvmStatic - fun of(type: Class<*>): Bitpix { - return when (type) { - Byte::class.javaPrimitiveType, - Byte::class.javaObjectType -> BYTE - Short::class.javaPrimitiveType, - Short::class.javaObjectType -> SHORT - Int::class.javaPrimitiveType, - Int::class.javaObjectType -> INTEGER - Long::class.javaPrimitiveType, - Long::class.javaObjectType -> LONG - Float::class.javaPrimitiveType, - Float::class.javaObjectType -> FLOAT - Double::class.javaPrimitiveType, - Double::class.javaObjectType -> DOUBLE - else -> throw IllegalArgumentException("no BITPIX for type: $type") - } + fun of(type: Class<*>) = when (type) { + Byte::class.javaPrimitiveType, + Byte::class.javaObjectType -> BYTE + Short::class.javaPrimitiveType, + Short::class.javaObjectType -> SHORT + Int::class.javaPrimitiveType, + Int::class.javaObjectType -> INTEGER + Long::class.javaPrimitiveType, + Long::class.javaObjectType -> LONG + Float::class.javaPrimitiveType, + Float::class.javaObjectType -> FLOAT + Double::class.javaPrimitiveType, + Double::class.javaObjectType -> DOUBLE + else -> throw IllegalArgumentException("no BITPIX for type: $type") } } } diff --git a/nebulosa-fits/src/main/kotlin/nebulosa/fits/Checksum.kt b/nebulosa-fits/src/main/kotlin/nebulosa/fits/Checksum.kt index a2784903f..63de84647 100644 --- a/nebulosa-fits/src/main/kotlin/nebulosa/fits/Checksum.kt +++ b/nebulosa-fits/src/main/kotlin/nebulosa/fits/Checksum.kt @@ -1,6 +1,6 @@ package nebulosa.fits -enum class Checksum(hduType: HduType, valueType: ValueType, comment: String) : FitsHeader { +enum class Checksum(hduType: HduType, valueType: ValueType, comment: String) : FitsHeaderKey { /** * The value field of the CHECKSUM keyword shall contain a 16 character string, left justified starting in column * 12, containing the ASCII encoded complement of the checksum of the FITS HDU (Header and Data Unit). The algorithm @@ -28,7 +28,7 @@ enum class Checksum(hduType: HduType, valueType: ValueType, comment: String) : F */ DATASUM(HduType.ANY, ValueType.STRING, "checksum of the data records"); - private val header = FitsHeaderImpl(name, hduType, valueType, comment) + private val header = FitsHeaderKeyItem(name, hduType, valueType, comment) override val key get() = header.key diff --git a/nebulosa-fits/src/main/kotlin/nebulosa/fits/Compression.kt b/nebulosa-fits/src/main/kotlin/nebulosa/fits/Compression.kt index 6a5674f20..c4beafe02 100644 --- a/nebulosa-fits/src/main/kotlin/nebulosa/fits/Compression.kt +++ b/nebulosa-fits/src/main/kotlin/nebulosa/fits/Compression.kt @@ -2,8 +2,8 @@ package nebulosa.fits enum class Compression( hduType: HduType, valueType: ValueType, comment: String, - val uncompressedKey: FitsHeader? = null, -) : FitsHeader { + val keyword: FitsHeaderKey? = null, +) : FitsHeaderKey { /** * (required keyword) This keyword must have the logical value T. The value field of this keyword shall be ’T’ to * indicate that the FITS binary table extension contains a compressed BINTABLE, and that logically this extension @@ -30,19 +30,19 @@ enum class Compression( * (required keyword) The value field of this keyword shall contain an integer that gives the value of the BITPIX * keyword in the uncompressed FITS image. 1 */ - ZBITPIX(HduType.ANY, ValueType.INTEGER, "", Standard.BITPIX), + ZBITPIX(HduType.ANY, ValueType.INTEGER, "", FitsKeyword.BITPIX), /** * (required keyword) The value field of this keyword shall contain an integer that gives the value of the NAXIS * keyword in the uncompressed FITS image. */ - ZNAXIS(HduType.ANY, ValueType.INTEGER, "", Standard.NAXIS), + ZNAXIS(HduType.ANY, ValueType.INTEGER, "", FitsKeyword.NAXIS), /** * (required keywords) The value field of these keywords shall contain a positive integer that gives the value of * the NAXISn keywords in the uncompressed FITS image. */ - ZNAXISn(HduType.ANY, ValueType.INTEGER, "", Standard.NAXISn), + ZNAXISn(HduType.ANY, ValueType.INTEGER, "", FitsKeyword.NAXISn), /** * (optional keywords) The value of these indexed keywords (where n ranges from 1 to ZNAXIS ) shall contain a @@ -89,7 +89,7 @@ enum class Compression( * identical copy of the original FITS file when the image is uncompressed.preserves the original SIMPLE keyword.may * only be used if the original uncompressed image was contained in the primary array of the FITS file. */ - ZSIMPLE(HduType.PRIMARY, ValueType.LOGICAL, "", Standard.SIMPLE), + ZSIMPLE(HduType.PRIMARY, ValueType.LOGICAL, "", FitsKeyword.SIMPLE), /** * The following optional keyword is defined to store a verbatim copy of the value and comment field of the @@ -98,7 +98,7 @@ enum class Compression( * keyword.may only be used if the original uncompressed image was contained in in IMAGE extension. */ - ZTENSION(HduType.ANY, ValueType.STRING, "", Standard.XTENSION), + ZTENSION(HduType.ANY, ValueType.STRING, "", FitsKeyword.XTENSION), /** * The following optional keyword is defined to store a verbatim copy of the value and comment field of the @@ -106,7 +106,7 @@ enum class Compression( * identical copy of the original FITS file when the image is uncompressed.preserves the original EXTEND keyword.may * only be used if the original uncompressed image was contained in the primary array of the FITS file. */ - ZEXTEND(HduType.PRIMARY, ValueType.LOGICAL, "", Standard.EXTEND), + ZEXTEND(HduType.PRIMARY, ValueType.LOGICAL, "", FitsKeyword.EXTEND), /** * The following optional keyword is defined to store a verbatim copy of the value and comment field of the @@ -115,7 +115,7 @@ enum class Compression( * keyword.may only be used if the original uncompressed image was contained in the primary array of the FITS file, */ @Deprecated("no blocksize other that 2880 may be used") - ZBLOCKED(HduType.PRIMARY, ValueType.LOGICAL, "", Standard.BLOCKED), + ZBLOCKED(HduType.PRIMARY, ValueType.LOGICAL, "", FitsKeyword.BLOCKED), /** * The following optional keyword is defined to store a verbatim copy of the value and comment field of the @@ -123,7 +123,7 @@ enum class Compression( * identical copy o f the original FITS file when the image is uncompressed.preserves the original PCOUNT * keyword.may only be used if the original uncompressed image was contained in in IMAGE extension. */ - ZPCOUNT(HduType.EXTENSION, ValueType.INTEGER, "", Standard.PCOUNT), + ZPCOUNT(HduType.EXTENSION, ValueType.INTEGER, "", FitsKeyword.PCOUNT), /** * The following optional keyword is defined to store a verbatim copy of the value and comment field of the @@ -131,7 +131,7 @@ enum class Compression( * identical copy o f the original FITS file when the image is uncompressed.preserves the original GCOUNT * keyword.may only be used if the original uncompressed image was contained in in IMAGE extension. */ - ZGCOUNT(HduType.EXTENSION, ValueType.INTEGER, "", Standard.GCOUNT), + ZGCOUNT(HduType.EXTENSION, ValueType.INTEGER, "", FitsKeyword.GCOUNT), /** * The following optional keyword is defined to store a verbatim copy of the value and comment field of the @@ -181,7 +181,7 @@ enum class Compression( * The value field of these keywords shall contain the character string values of the corresponding TFORMn keywords * that defines the data type of column n in the original uncompressed FITS table. */ - ZFORMn(HduType.ANY, ValueType.STRING, "", Standard.TFORMn), + ZFORMn(HduType.ANY, ValueType.STRING, "", FitsKeyword.TFORMn), /** * The value field of these keywords shall contain a charac- ter string giving the mnemonic name of the algorithm @@ -190,7 +190,7 @@ enum class Compression( */ ZCTYPn(HduType.ANY, ValueType.STRING, ""); - private val header = FitsHeaderImpl(name, hduType, valueType, comment) + private val header = FitsHeaderKeyItem(name, hduType, valueType, comment) override val key get() = header.key diff --git a/nebulosa-fits/src/main/kotlin/nebulosa/fits/Fits.kt b/nebulosa-fits/src/main/kotlin/nebulosa/fits/Fits.kt index 4ecdfc0f3..67c96b6b2 100644 --- a/nebulosa-fits/src/main/kotlin/nebulosa/fits/Fits.kt +++ b/nebulosa-fits/src/main/kotlin/nebulosa/fits/Fits.kt @@ -1,31 +1,22 @@ package nebulosa.fits +import nebulosa.image.format.Hdu +import nebulosa.image.format.ImageRepresentation import nebulosa.io.SeekableSource import okio.Sink -import java.io.EOFException import java.util.* -open class Fits : LinkedList> { +open class Fits : LinkedList>, ImageRepresentation { constructor() : super() constructor(hdus: Collection>) : super(hdus) - fun readHdu(source: SeekableSource): Hdu<*>? { - return try { - return FitsIO.read(source).also(::add) - } catch (ignored: EOFException) { - null - } + override fun read(source: SeekableSource) { + addAll(FitsFormat.read(source)) } - fun read(source: SeekableSource) { - while (true) { - readHdu(source) ?: break - } - } - - fun writeTo(sink: Sink) { - forEach { FitsIO.write(sink, it) } + override fun write(sink: Sink) { + FitsFormat.write(sink, this) } } diff --git a/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsElement.kt b/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsElement.kt deleted file mode 100644 index 258b8b2bb..000000000 --- a/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsElement.kt +++ /dev/null @@ -1,11 +0,0 @@ -package nebulosa.fits - -import nebulosa.io.SeekableSource -import okio.Sink - -interface FitsElement { - - fun read(source: SeekableSource) - - fun write(sink: Sink) -} diff --git a/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsFormat.kt b/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsFormat.kt new file mode 100644 index 000000000..95e648f7a --- /dev/null +++ b/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsFormat.kt @@ -0,0 +1,178 @@ +package nebulosa.fits + +import nebulosa.fits.FitsHeader.Companion.isFirstCard +import nebulosa.image.format.* +import nebulosa.io.* +import nebulosa.log.loggerFor +import okio.Buffer +import okio.Sink +import java.io.EOFException +import kotlin.math.max + +data object FitsFormat : ImageFormat { + + const val BLOCK_SIZE = 2880 + + @JvmStatic + fun computeRemainingBytesToSkip(sizeInBytes: Long): Long { + val numberOfBlocks = (sizeInBytes / BLOCK_SIZE) + 1 + val remainingByteCount = (numberOfBlocks * BLOCK_SIZE) - sizeInBytes + return max(0L, remainingByteCount) + } + + fun isImageHdu(header: ReadableHeader) = + header.getBoolean(FitsKeyword.SIMPLE) || header.getStringOrNull(FitsKeyword.XTENSION) == "IMAGE" + + fun readHeader(source: SeekableSource): FitsHeader { + val header = FitsHeader() + + var count = 0 + + Buffer().use { buffer -> + while (true) { + buffer.clear() + + if (source.read(buffer, 80L) != 80L) throw EOFException() + + count++ + + val card = try { + FitsHeaderCard.from(buffer) + } catch (e: IllegalArgumentException) { + break + } + + if (header.isEmpty()) { + require(isFirstCard(card.key)) { "Not a proper FITS header: ${card.key}" } + } else if (card.isBlank) { + continue + } else if (card.key == FitsKeyword.END.key) { + break + } + + header.add(card) + } + + val skipBytes = computeRemainingBytesToSkip(count * 80L) + if (skipBytes > 0L) source.skip(skipBytes) + } + + return header + } + + fun readImageData(header: ReadableHeader, source: SeekableSource): ImageData { + val width = header.width + val height = header.height + val numberOfChannels = header.numberOfChannels + val bitpix = header.bitpix + val position = source.position + + val data = SeekableSourceImageData(source, position, width, height, numberOfChannels, bitpix) + val skipBytes = computeRemainingBytesToSkip(data.totalSizeInBytes) + if (skipBytes > 0L) source.seek(position + data.totalSizeInBytes + skipBytes) + + return data + } + + override fun read(source: SeekableSource): List> { + val hdus = ArrayList(1) + + while (!source.exhausted) { + val header = try { + readHeader(source) + } catch (e: Throwable) { + LOG.error("failed to read FITS header", e) + break + } + + val hdu = when { + isImageHdu(header) -> BasicImageHdu(header.width, header.height, header.numberOfChannels, header, readImageData(header, source)) + else -> { + LOG.warn("unsupported FITS header: {}", header) + continue + } + } + + hdus.add(hdu) + } + + return hdus + } + + fun writeHeader(header: ReadableHeader, sink: Sink) { + Buffer().use { buffer -> + for (card in header) { + buffer.writeString(card.formatted(), Charsets.US_ASCII) + } + + if (header.last().key != FitsHeaderCard.END.key) { + buffer.writeString(FitsHeaderCard.END.formatted(), Charsets.US_ASCII) + } + + val remainingBytes = computeRemainingBytesToSkip(buffer.size) + repeat(remainingBytes.toInt()) { buffer.writeByte(0) } + buffer.readAll(sink) + } + } + + fun writeImageData(data: ImageData, header: ReadableHeader, sink: Sink) { + val bitpix = header.bitpix + val channels = arrayOf(data.red, data.green, data.blue) + var byteCount = 0L + + Buffer().use { buffer -> + for (channel in 0 until data.numberOfChannels) { + for (i in 0 until data.numberOfPixels) { + buffer.writePixel(channels[channel][i], bitpix) + + if (buffer.size >= 1024L) { + byteCount += buffer.readAll(sink) + } + } + } + + byteCount += buffer.readAll(sink) + val remainingBytes = computeRemainingBytesToSkip(byteCount) + + if (remainingBytes > 0) { + repeat(remainingBytes.toInt()) { buffer.writeByte(0) } + buffer.readAll(sink) + } + } + } + + override fun write(sink: Sink, hdus: Iterable>) { + for (hdu in hdus) { + if (hdu is ImageHdu) { + writeHeader(hdu.header, sink) + writeImageData(hdu.data, hdu.header, sink) + } + } + } + + @JvmStatic + internal fun Buffer.readPixel(bitpix: Bitpix): Float { + return when (bitpix) { + Bitpix.BYTE -> (readByte().toInt() and 0xFF) / 255f + Bitpix.SHORT -> (readShort().toInt() + 32768) / 65535f + Bitpix.INTEGER -> ((readInt().toLong() + 2147483648L) / 4294967295.0).toFloat() + Bitpix.LONG -> TODO("Unsupported UInt64 sample format") + Bitpix.FLOAT -> readFloat() + Bitpix.DOUBLE -> readDouble().toFloat() + } + } + + @JvmStatic + internal fun Buffer.writePixel(pixel: Float, bitpix: Bitpix) { + when (bitpix) { + Bitpix.BYTE -> writeByte((pixel * 255f).toInt()) + Bitpix.SHORT -> writeShort((pixel * 65535f).toInt() - 32768) + Bitpix.INTEGER -> writeInt(((pixel * 4294967295.0).toLong() - 2147483648L).toInt()) + Bitpix.LONG -> TODO("Unsupported 64-bit format") + Bitpix.FLOAT -> writeFloat(pixel) + Bitpix.DOUBLE -> writeDouble(pixel.toDouble()) + } + } + + @JvmStatic private val LOG = loggerFor() +} diff --git a/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsHeader.kt b/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsHeader.kt index ceca4437f..994041e49 100644 --- a/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsHeader.kt +++ b/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsHeader.kt @@ -1,17 +1,159 @@ package nebulosa.fits -interface FitsHeader { +import nebulosa.image.format.AbstractHeader +import nebulosa.image.format.HeaderCard +import nebulosa.image.format.HeaderKey +import nebulosa.io.SeekableSource +import nebulosa.io.source +import nebulosa.log.loggerFor +import java.util.* - val key: String +open class FitsHeader : AbstractHeader { - val comment: String + constructor() : super() - val hduType: HduType + constructor(cards: Collection) : super(cards) - val valueType: ValueType + override fun readOnly(): FitsHeader = ReadOnly(this) - fun n(vararg numbers: Int): FitsHeader + override fun clone() = FitsHeader(this) - val isCommentStyle - get() = valueType == ValueType.NONE || key.isBlank() + override fun add(key: HeaderKey, value: Boolean) { + checkType(key, ValueType.LOGICAL) + FitsHeaderCard.create(key, value).also(::add) + } + + override fun add(key: String, value: Boolean, comment: String) { + FitsHeaderCard.create(key, value, comment).also(::add) + } + + override fun add(key: HeaderKey, value: Int) { + checkType(key, ValueType.INTEGER) + FitsHeaderCard.create(key, value).also(::add) + } + + override fun add(key: String, value: Int, comment: String) { + FitsHeaderCard.create(key, value, comment).also(::add) + } + + override fun add(key: HeaderKey, value: Double) { + checkType(key, ValueType.REAL) + FitsHeaderCard.create(key, value).also(::add) + } + + override fun add(key: String, value: Double, comment: String) { + FitsHeaderCard.create(key, value, comment).also(::add) + } + + override fun add(key: HeaderKey, value: String) { + checkType(key, ValueType.STRING) + FitsHeaderCard.create(key, value).also(::add) + } + + override fun add(key: String, value: String, comment: String) { + FitsHeaderCard.create(key, value, comment).also(::add) + } + + override fun add(card: HeaderCard) { + if (!card.isKeyValuePair) cards.add(card) + else { + val index = cards.indexOfFirst { it.key == card.key } + if (index >= 0) cards[index] = card + else cards.add(card) + } + } + + open class ReadOnly : FitsHeader { + + constructor() : super(LinkedList()) + + constructor(cards: Collection) : super(cards) + + final override fun clear() = Unit + + final override fun add(key: HeaderKey, value: Boolean) = Unit + + final override fun add(key: HeaderKey, value: Int) = Unit + + final override fun add(key: HeaderKey, value: Double) = Unit + + final override fun add(key: HeaderKey, value: String) = Unit + + final override fun add(key: String, value: Boolean, comment: String) = Unit + + final override fun add(key: String, value: Int, comment: String) = Unit + + final override fun add(key: String, value: Double, comment: String) = Unit + + final override fun add(key: String, value: String, comment: String) = Unit + + final override fun add(card: HeaderCard) = Unit + + final override fun addAll(cards: Iterable) = Unit + + final override fun delete(key: HeaderKey) = false + + final override fun delete(key: String) = false + + override fun readOnly() = this + } + + companion object { + + const val DEFAULT_COMMENT_ALIGN = 30 + const val MIN_COMMENT_ALIGN = 20 + const val MAX_COMMENT_ALIGN = 70 + + @JvmStatic val EMPTY = ReadOnly() + @JvmStatic private val LOG = loggerFor() + + var commentAlignPosition = DEFAULT_COMMENT_ALIGN + set(value) { + require(value in MIN_COMMENT_ALIGN..MAX_COMMENT_ALIGN) + field = value + } + + @JvmStatic + fun from(source: SeekableSource): FitsHeader { + return FitsFormat.readHeader(source) + } + + @JvmStatic + fun from(source: String): FitsHeader { + return from(source.toByteArray()) + } + + @JvmStatic + fun from(source: ByteArray): FitsHeader { + return source.source().use(::from) + } + + @JvmStatic + fun checkType(key: HeaderKey, type: ValueType): Boolean { + if (key is FitsHeaderKey) { + if (key.valueType == type || key.valueType == ValueType.ANY) { + return true + } + + if (key.valueType == ValueType.COMPLEX && (type == ValueType.REAL || type == ValueType.INTEGER)) { + return true + } + + if (key.valueType == ValueType.REAL && type == ValueType.INTEGER) { + return true + } + + LOG.warn("[${key.key}] with unexpected value type. Expected $type, got ${key.valueType}") + + return false + } + + return true + } + + @JvmStatic + fun isFirstCard(key: String): Boolean { + return FitsKeyword.SIMPLE.key == key || FitsKeyword.XTENSION.key == key + } + } } diff --git a/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsHeaderCard.kt b/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsHeaderCard.kt new file mode 100644 index 000000000..9f2d7f8da --- /dev/null +++ b/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsHeaderCard.kt @@ -0,0 +1,181 @@ +package nebulosa.fits + +import nebulosa.image.format.HeaderCard +import nebulosa.image.format.HeaderKey +import okio.Buffer +import java.io.Serializable +import java.math.BigDecimal +import java.math.BigInteger +import kotlin.math.max + +data class FitsHeaderCard( + override val key: String, override val value: String, + override val comment: String, override val type: FitsHeaderCardType, +) : HeaderCard, Serializable { + + internal constructor(parsed: FitsHeaderCardParser) : this( + parsed.key, parsed.value, parsed.comment, parsed.type + ) + + override val isCommentStyle + get() = type == FitsHeaderCardType.NONE + + override val isKeyValuePair + get() = !isCommentStyle && key.isNotEmpty() + + override val isBooleanType + get() = type == FitsHeaderCardType.BOOLEAN + + override val isStringType + get() = type == FitsHeaderCardType.TEXT + + override val isDecimalType + get() = type == FitsHeaderCardType.DECIMAL || type == FitsHeaderCardType.BIG_DECIMAL + + override val isIntegerType + get() = type == FitsHeaderCardType.INTEGER || type == FitsHeaderCardType.BIG_INTEGER + + val hasHierarchKey + get() = isHierarchKey(key) + + override fun formatted(): String { + return FitsHeaderCardFormatter.format(this) + } + + companion object { + + const val FITS_HEADER_CARD_SIZE = 80 + const val MAX_KEYWORD_LENGTH = 8 + const val STRING_QUOTES_LENGTH = 2 + const val MAX_VALUE_LENGTH = 70 + const val MAX_COMMENT_CARD_COMMENT_LENGTH = MAX_VALUE_LENGTH + 1 + const val MAX_STRING_VALUE_LENGTH = MAX_VALUE_LENGTH - 2 + const val MAX_LONG_STRING_VALUE_LENGTH = MAX_STRING_VALUE_LENGTH - 1 + const val MAX_LONG_STRING_VALUE_WITH_COMMENT_LENGTH = MAX_LONG_STRING_VALUE_LENGTH - 2 + const val MAX_HIERARCH_KEYWORD_LENGTH = FITS_HEADER_CARD_SIZE - 6 + const val MAX_LONG_STRING_CONTINUE_OVERHEAD = 3 + const val HIERARCH_WITH_DOT = "HIERARCH." + + @JvmStatic val SIMPLE = create(FitsKeyword.SIMPLE, true) + @JvmStatic val END = FitsHeaderCard("END", "", "", FitsHeaderCardType.NONE) + @JvmStatic val EXTENDED = create(FitsKeyword.EXTEND, true) + + @JvmStatic + fun from(source: Buffer): FitsHeaderCard { + return from(source.readString(80L, Charsets.US_ASCII)) + } + + @JvmStatic + fun from(source: CharSequence): FitsHeaderCard { + return FitsHeaderCard(FitsHeaderCardParser(source)) + } + + @JvmStatic + fun create(header: HeaderKey, value: Boolean): FitsHeaderCard { + return create(header.key, value, header.comment) + } + + @JvmStatic + fun create(header: HeaderKey, value: Int): FitsHeaderCard { + return create(header.key, value, header.comment) + } + + @JvmStatic + fun create(header: HeaderKey, value: Long): FitsHeaderCard { + return create(header.key, value, header.comment) + } + + @JvmStatic + fun create(header: HeaderKey, value: BigInteger): FitsHeaderCard { + return create(header.key, value, header.comment) + } + + @JvmStatic + fun create(header: HeaderKey, value: Float): FitsHeaderCard { + return create(header.key, value, header.comment) + } + + @JvmStatic + fun create(header: HeaderKey, value: Double): FitsHeaderCard { + return create(header.key, value, header.comment) + } + + @JvmStatic + fun create(key: HeaderKey, value: BigDecimal, comment: String = ""): FitsHeaderCard { + return create(key.key, value, comment) + } + + @JvmStatic + fun create(header: HeaderKey, value: String): FitsHeaderCard { + return create(header.key, value, header.comment) + } + + @JvmStatic + fun create(key: String, value: Boolean, comment: String = ""): FitsHeaderCard { + return FitsHeaderCard(key, if (value) "T" else "F", comment, FitsHeaderCardType.BOOLEAN) + } + + @JvmStatic + fun create(key: String, value: Int, comment: String = ""): FitsHeaderCard { + return FitsHeaderCard(key, "$value", comment, FitsHeaderCardType.INTEGER) + } + + @JvmStatic + fun create(key: String, value: Long, comment: String = ""): FitsHeaderCard { + return FitsHeaderCard(key, "$value", comment, FitsHeaderCardType.INTEGER) + } + + @JvmStatic + fun create(key: String, value: BigInteger, comment: String = ""): FitsHeaderCard { + return FitsHeaderCard(key, "$value", comment, FitsHeaderCardType.BIG_INTEGER) + } + + @JvmStatic + fun create(key: String, value: Float, comment: String = ""): FitsHeaderCard { + return FitsHeaderCard(key, "$value", comment, FitsHeaderCardType.DECIMAL) + } + + @JvmStatic + fun create(key: String, value: Double, comment: String = ""): FitsHeaderCard { + return FitsHeaderCard(key, "$value", comment, FitsHeaderCardType.DECIMAL) + } + + @JvmStatic + fun create(key: String, value: BigDecimal, comment: String = ""): FitsHeaderCard { + return FitsHeaderCard(key, "$value", comment, FitsHeaderCardType.BIG_DECIMAL) + } + + @JvmStatic + fun create(key: String, value: String, comment: String = ""): FitsHeaderCard { + return FitsHeaderCard(key, value, comment, FitsHeaderCardType.TEXT) + } + + @JvmStatic + internal fun isHierarchKey(key: String): Boolean { + return key.uppercase().startsWith(HIERARCH_WITH_DOT) + } + + @JvmStatic + fun sanitize(input: CharSequence): String { + val data = CharArray(input.length) + + for (i in input.indices) { + val char = input[i] + data[i] = if (FitsHeaderCardParser.isValidChar(char)) char else '?' + } + + return data.concatToString() + } + + @JvmStatic + private fun spaceForValue(key: String): Int { + return if (key.length > MAX_KEYWORD_LENGTH) { + // HierarchFormater.extraSpaceRequired = 1 + FITS_HEADER_CARD_SIZE - (max(key.length, MAX_KEYWORD_LENGTH) + 1) + } else { + // DEFAULT_SKIP_BLANK_AFTER_ASSIGN = false, so AssignLength = 2. + FITS_HEADER_CARD_SIZE - (max(key.length, MAX_KEYWORD_LENGTH) + 2) + } + } + } +} diff --git a/nebulosa-fits/src/main/kotlin/nebulosa/fits/HeaderCardFormatter.kt b/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsHeaderCardFormatter.kt similarity index 89% rename from nebulosa-fits/src/main/kotlin/nebulosa/fits/HeaderCardFormatter.kt rename to nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsHeaderCardFormatter.kt index e5ee5b51a..4ec34e436 100644 --- a/nebulosa-fits/src/main/kotlin/nebulosa/fits/HeaderCardFormatter.kt +++ b/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsHeaderCardFormatter.kt @@ -1,12 +1,13 @@ package nebulosa.fits +import nebulosa.image.format.HeaderCard import java.util.* import kotlin.math.min -object HeaderCardFormatter { +object FitsHeaderCardFormatter { fun format(card: HeaderCard): String { - return with(StringBuilder(HeaderCard.FITS_HEADER_CARD_SIZE)) { + return with(StringBuilder(FitsHeaderCard.FITS_HEADER_CARD_SIZE)) { appendKey(card) val valueStart = appendValue(card) @@ -21,7 +22,7 @@ object HeaderCardFormatter { pad() - HeaderCard.sanitize(this) + FitsHeaderCard.sanitize(this) } } @@ -29,10 +30,10 @@ object HeaderCardFormatter { private fun StringBuilder.appendKey(card: HeaderCard) { var key = card.key - if (card.hasHierarchKey) { - key = HierarchKeyFormatter.INSTANCE.format(key) + if (card is FitsHeaderCard && card.hasHierarchKey) { + key = HierarchKeyFormatter.format(key) - if (key.length > HeaderCard.MAX_HIERARCH_KEYWORD_LENGTH) { + if (key.length > FitsHeaderCard.MAX_HIERARCH_KEYWORD_LENGTH) { // Truncate HIERARCH keywords as necessary to fit. // This is really just a second parachute here. Normally, HeaderCards // won't allow creation or setting longer keywords... @@ -46,7 +47,7 @@ object HeaderCardFormatter { append(key) - padTo(HeaderCard.MAX_KEYWORD_LENGTH) + padTo(FitsHeaderCard.MAX_KEYWORD_LENGTH) } @JvmStatic @@ -73,7 +74,7 @@ object HeaderCardFormatter { while (from < value.length) { pad() - append(Standard.CONTINUE.key + " ") + append(FitsKeyword.CONTINUE.key + " ") from += appendQuotedValue(card, from) } } else { @@ -182,7 +183,7 @@ object HeaderCardFormatter { if (available < COMMENT_PREFIX.length) { // Add a CONTINUE card with an empty string and try again... pad() - append(Standard.CONTINUE.key + " ''") + append(FitsKeyword.CONTINUE.key + " ''") appendComment(card) return } @@ -193,7 +194,7 @@ object HeaderCardFormatter { // Now add records as needed to write the comment fully... while (from < comment.length) { pad() - append(Standard.CONTINUE.key + " ") + append(FitsKeyword.CONTINUE.key + " ") append(if (comment.length >= from + MAX_LONG_END_COMMENT) "'&'" else "''") append(LONG_COMMENT_PREFIX) from += append(comment, from) @@ -202,11 +203,11 @@ object HeaderCardFormatter { @JvmStatic private fun StringBuilder.realign(at: Int, from: Int): Boolean { - return if (length >= HeaderCard.FITS_HEADER_CARD_SIZE || from >= Header.commentAlignPosition) { + return if (length >= FitsHeaderCard.FITS_HEADER_CARD_SIZE || from >= FitsHeader.commentAlignPosition) { // We are beyond the alignment point already... false } else { - realign(at, from, Header.commentAlignPosition) + realign(at, from, FitsHeader.commentAlignPosition) } } @@ -307,14 +308,14 @@ object HeaderCardFormatter { @JvmStatic private fun StringBuilder.padTo(to: Int) { - for (pos in length % HeaderCard.FITS_HEADER_CARD_SIZE until to) { + for (pos in length % FitsHeaderCard.FITS_HEADER_CARD_SIZE until to) { append(' ') } } @JvmStatic private fun StringBuilder.availableCharCount(): Int { - return (HeaderCard.FITS_HEADER_CARD_SIZE - length % HeaderCard.FITS_HEADER_CARD_SIZE) % HeaderCard.FITS_HEADER_CARD_SIZE + return (FitsHeaderCard.FITS_HEADER_CARD_SIZE - length % FitsHeaderCard.FITS_HEADER_CARD_SIZE) % FitsHeaderCard.FITS_HEADER_CARD_SIZE } @JvmStatic diff --git a/nebulosa-fits/src/main/kotlin/nebulosa/fits/HeaderCardParser.kt b/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsHeaderCardParser.kt similarity index 73% rename from nebulosa-fits/src/main/kotlin/nebulosa/fits/HeaderCardParser.kt rename to nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsHeaderCardParser.kt index e3b6c2bba..6ff467a1b 100644 --- a/nebulosa-fits/src/main/kotlin/nebulosa/fits/HeaderCardParser.kt +++ b/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsHeaderCardParser.kt @@ -1,27 +1,19 @@ package nebulosa.fits import nebulosa.log.loggerFor -import org.apache.commons.numbers.complex.Complex import java.math.BigDecimal import java.math.BigInteger import java.util.* import kotlin.math.min -internal class HeaderCardParser(private val line: CharSequence) { +internal data class FitsHeaderCardParser(private val line: CharSequence) { private var parsePos = 0 - var key = "" - private set - - var value = "" - private set - - var comment = "" - private set - - var type: Class<*> = Nothing::class.java - private set + @JvmField internal var key = "" + @JvmField internal var value = "" + @JvmField internal var comment = "" + @JvmField internal var type = FitsHeaderCardType.NONE init { parseKey() @@ -31,12 +23,12 @@ internal class HeaderCardParser(private val line: CharSequence) { private fun parseKey() { // Find the '=' in the line, if any... - val iEq: Int = line.indexOf('=') + val iEq = line.indexOf('=') // The stem is in the first 8 characters or what precedes an '=' character // before that. - var endStem = if (iEq >= 0 && iEq <= HeaderCard.MAX_KEYWORD_LENGTH) iEq else HeaderCard.MAX_KEYWORD_LENGTH - endStem = min(line.length.toDouble(), endStem.toDouble()).toInt() + var endStem = if (iEq in 0..FitsHeaderCard.MAX_KEYWORD_LENGTH) iEq else FitsHeaderCard.MAX_KEYWORD_LENGTH + endStem = min(line.length, endStem) val rawStem = line.substring(0, endStem).trim { it <= ' ' } // Check for space at the start of the keyword... @@ -60,7 +52,7 @@ internal class HeaderCardParser(private val line: CharSequence) { // If the line does not have an '=', can only be a simple key // If it's not a HIERARCH keyword, then return the simple key. - if (iEq < 0 || stem != NonStandard.HIERARCH.key) { + if (iEq < 0 || stem != FitsKeyword.HIERARCH.key) { return } @@ -76,9 +68,10 @@ internal class HeaderCardParser(private val line: CharSequence) { builder.append('.') builder.append(token) } + key = builder.toString() - if (NonStandard.HIERARCH.key == key) { + if (FitsKeyword.HIERARCH.key == key) { // The key is only HIERARCH, without a hierarchical keyword after it... LOG.warn("HIERARCH base keyword without HIERARCH-style long key after it.") return @@ -118,7 +111,7 @@ internal class HeaderCardParser(private val line: CharSequence) { } } - comment = line.substring(parsePos) + comment = line.substring(parsePos).trim() parsePos = line.length } @@ -128,11 +121,11 @@ internal class HeaderCardParser(private val line: CharSequence) { return } - if (Standard.CONTINUE.key == key) { + if (FitsKeyword.CONTINUE.key == key) { parseValueBody() } else if (line[parsePos] == '=') { - if (parsePos < HeaderCard.MAX_KEYWORD_LENGTH) { - LOG.warn("[$key] assigmment before byte ${HeaderCard.MAX_KEYWORD_LENGTH + 1} for key '$key'.") + if (parsePos < FitsHeaderCard.MAX_KEYWORD_LENGTH) { + LOG.warn("[$key] assigmment before byte ${FitsHeaderCard.MAX_KEYWORD_LENGTH + 1} for key '$key'.") } if (parsePos + 1 >= line.length) { @@ -141,9 +134,9 @@ internal class HeaderCardParser(private val line: CharSequence) { LOG.warn("[$key] missing required standard space after '='.") } - if (parsePos > HeaderCard.MAX_KEYWORD_LENGTH) { + if (parsePos > FitsHeaderCard.MAX_KEYWORD_LENGTH) { // equal sign = after the 9th char -- only supported with hierarch keys... - if (!key.startsWith(NonStandard.HIERARCH.key + ".")) { + if (!key.startsWith(FitsKeyword.HIERARCH.key + ".")) { LOG.warn("[$key] possibly misplaced '=' (after byte 9).") // It's not a HIERARCH key return @@ -198,9 +191,9 @@ internal class HeaderCardParser(private val line: CharSequence) { } private fun parseStringValue() { - type = String::class.java + type = FitsHeaderCardType.TEXT - val buf = StringBuilder(HeaderCard.MAX_VALUE_LENGTH) + val buf = StringBuilder(FitsHeaderCard.MAX_VALUE_LENGTH) // Build the string value, up to the end quote and paying attention to double // quotes inside the string, which are translated to single quotes within @@ -226,16 +219,16 @@ internal class HeaderCardParser(private val line: CharSequence) { value = getNoTrailingSpaceString(buf) } - private fun getInferredValueType(key: String, value: String): Class<*> { + private fun getInferredValueType(key: String, value: String): FitsHeaderCardType { if (value.isEmpty()) { - LOG.warn("[$key] null non-string value (defaulted to Boolean.class).") - return Boolean::class.javaPrimitiveType!! + LOG.warn("[$key] null non-string value (defaulted to Boolean).") + return FitsHeaderCardType.BOOLEAN } val trimmedValue = value.trim().uppercase() if ("T" == trimmedValue || "F" == trimmedValue) { - return Boolean::class.javaPrimitiveType!! + return FitsHeaderCardType.BOOLEAN } if (INT_REGEX.matches(trimmedValue)) { return getIntegerType(trimmedValue) @@ -244,67 +237,66 @@ internal class HeaderCardParser(private val line: CharSequence) { return getDecimalType(trimmedValue) } if (COMPLEX_REGEX.matches(trimmedValue)) { - return Complex::class.java + return FitsHeaderCardType.COMPLEX } LOG.warn("[$key] unrecognised non-string value type '$trimmedValue'.") - return Nothing::class.java + return FitsHeaderCardType.NONE } - private fun getDecimalType(value: String): Class { - var transformedValue = value.uppercase() - val hasD = (transformedValue.indexOf('D') >= 0) - - if (hasD) { + private fun getDecimalType(value: String): FitsHeaderCardType { + val transformedValue = if ('D' in value) { // Convert the Double Scientific Notation specified by FITS to pure IEEE. - transformedValue = transformedValue.replace('D', 'E') + value.uppercase().replace('D', 'E') + } else { + value } val big = BigDecimal(transformedValue) // Check for zero, and deal with it separately... - if (big.stripTrailingZeros() == BigDecimal.ZERO) { + if (big.stripTrailingZeros().compareTo(BigDecimal.ZERO) == 0) { val decimals = big.scale() - if (decimals <= 7) { - return if (hasD) Double::class.javaPrimitiveType!! - else Float::class.javaPrimitiveType!! - } - - return if (decimals <= 16) Double::class.javaPrimitiveType!! - else BigDecimal::class.javaPrimitiveType!! + return if (decimals <= 16) FitsHeaderCardType.DECIMAL + else FitsHeaderCardType.BIG_DECIMAL } // Now non-zero values... val decimals = big.precision() - 1 val f = big.toFloat() - if ((decimals <= 7) && f != 0.0f && f.isFinite()) { - return if (hasD) Double::class.javaPrimitiveType!! - else Float::class.javaPrimitiveType!! + if (decimals <= 7 && f != 0.0f && f.isFinite()) { + return FitsHeaderCardType.DECIMAL } val d = big.toDouble() - return if ((decimals <= 16) && d != 0.0 && d.isFinite()) Double::class.javaPrimitiveType!! - else BigDecimal::class.java + return if (decimals <= 16 && d != 0.0 && d.isFinite()) FitsHeaderCardType.DECIMAL + else FitsHeaderCardType.BIG_DECIMAL } - private fun getIntegerType(value: String): Class { + private fun getIntegerType(value: String): FitsHeaderCardType { val bits = BigInteger(value).bitLength() - return if (bits < 32) Int::class.javaPrimitiveType!! - else return if (bits < 64) Long::class.javaPrimitiveType!! - else BigInteger::class.java + return if (bits < 64) FitsHeaderCardType.INTEGER + else FitsHeaderCardType.BIG_INTEGER } companion object { - @JvmStatic private val LOG = loggerFor() + const val MIN_VALID_CHAR = 0x20.toChar() + const val MAX_VALID_CHAR = 0x7e.toChar() + + @JvmStatic private val LOG = loggerFor() @JvmStatic private val DECIMAL_REGEX = Regex("[+-]?\\d+(\\.\\d*)?([dDeE][+-]?\\d+)?") @JvmStatic private val COMPLEX_REGEX = Regex("\\(\\s*$DECIMAL_REGEX\\s*,\\s*$DECIMAL_REGEX\\s*\\)") @JvmStatic private val INT_REGEX = Regex("[+-]?\\d+") + @JvmStatic + fun isValidChar(c: Char): Boolean { + return c in MIN_VALID_CHAR..MAX_VALID_CHAR + } } } diff --git a/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsHeaderCardType.kt b/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsHeaderCardType.kt new file mode 100644 index 000000000..d8b7832b6 --- /dev/null +++ b/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsHeaderCardType.kt @@ -0,0 +1,17 @@ +package nebulosa.fits + +import nebulosa.image.format.HeaderCardType +import org.apache.commons.numbers.complex.Complex +import java.math.BigDecimal +import java.math.BigInteger + +enum class FitsHeaderCardType(@JvmField internal val type: Class<*>) : HeaderCardType { + NONE(Nothing::class.javaObjectType), + TEXT(String::class.javaObjectType), + BOOLEAN(Boolean::class.javaObjectType), + INTEGER(Long::class.javaObjectType), + BIG_INTEGER(BigInteger::class.java), + DECIMAL(Double::class.java), + BIG_DECIMAL(BigDecimal::class.java), + COMPLEX(Complex::class.java), +} diff --git a/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsHeaderKey.kt b/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsHeaderKey.kt new file mode 100644 index 000000000..8a816818c --- /dev/null +++ b/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsHeaderKey.kt @@ -0,0 +1,15 @@ +package nebulosa.fits + +import nebulosa.image.format.HeaderKey + +sealed interface FitsHeaderKey : HeaderKey { + + val hduType: HduType + + val valueType: ValueType + + fun n(vararg numbers: Int): FitsHeaderKey + + val isCommentStyle + get() = valueType == ValueType.NONE || key.isBlank() +} diff --git a/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsHeaderImpl.kt b/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsHeaderKeyItem.kt similarity index 57% rename from nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsHeaderImpl.kt rename to nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsHeaderKeyItem.kt index 494149080..d6f77252a 100644 --- a/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsHeaderImpl.kt +++ b/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsHeaderKeyItem.kt @@ -1,22 +1,24 @@ package nebulosa.fits -data class FitsHeaderImpl( +data class FitsHeaderKeyItem( override val key: String, override val hduType: HduType, override val valueType: ValueType, override val comment: String = "", -) : FitsHeader { +) : FitsHeaderKey { - override fun n(vararg numbers: Int): FitsHeader { + override fun n(vararg numbers: Int): FitsHeaderKey { if (numbers.isEmpty() || "n" !in key) return this val key = StringBuffer(key) + var idx = 0 for (number in numbers) { - val idx = key.indexOf("n") + idx = key.indexOf("n", idx) + if (idx < 0) break key.replace(idx, idx + 1, "$number") } - return FitsHeaderImpl("$key", hduType, valueType, comment) + return FitsHeaderKeyItem("$key", hduType, valueType, comment) } } diff --git a/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsHelper.kt b/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsHelper.kt index d7b8b660d..b829eb438 100644 --- a/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsHelper.kt +++ b/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsHelper.kt @@ -2,6 +2,7 @@ package nebulosa.fits +import nebulosa.image.format.ReadableHeader import nebulosa.io.SeekableSource import nebulosa.math.Angle import nebulosa.math.deg @@ -10,72 +11,79 @@ import java.nio.file.Path import java.time.Duration import java.time.LocalDateTime -inline fun Header.clone() = Header(this) +inline val ReadableHeader.naxis + get() = getInt(FitsKeyword.NAXIS, -1) -inline val Header.naxis - get() = getInt(Standard.NAXIS, -1) +inline fun ReadableHeader.naxis(n: Int) = getInt(FitsKeyword.NAXISn.n(n), 0) -inline fun Header.naxis(n: Int) = getInt(Standard.NAXISn.n(n), 0) +inline val ReadableHeader.width + get() = getInt(FitsKeyword.NAXIS1, 0) -inline val Header.width - get() = getInt(Standard.NAXIS1, 0) +inline val ReadableHeader.height + get() = getInt(FitsKeyword.NAXIS2, 0) -inline val Header.height - get() = getInt(Standard.NAXIS2, 0) +inline val ReadableHeader.numberOfChannels + get() = getInt(FitsKeyword.NAXIS3, 1) -val Header.rightAscension - get() = Angle(getStringOrNull(Standard.RA), isHours = true, decimalIsHours = false).takeIf { it.isFinite() } - ?: Angle(getStringOrNull(SBFitsExt.OBJCTRA), true).takeIf { it.isFinite() } - ?: getDouble(NOAOExt.CRVAL1, Double.NaN).deg +inline val ReadableHeader.bitpix + get() = Bitpix.from(this) -val Header.declination - get() = Angle(getStringOrNull(Standard.DEC)).takeIf { it.isFinite() } - ?: Angle(getStringOrNull(SBFitsExt.OBJCTDEC)).takeIf { it.isFinite() } - ?: getDouble(NOAOExt.CRVAL2, Double.NaN).deg +val ReadableHeader.rightAscension + get() = Angle(getStringOrNull(FitsKeyword.RA), isHours = true, decimalIsHours = false).takeIf { it.isFinite() } + ?: Angle(getStringOrNull(FitsKeyword.OBJCTRA), true).takeIf { it.isFinite() } + ?: getDouble(FitsKeyword.CRVAL1, Double.NaN).deg -inline val Header.binX - get() = getInt(SBFitsExt.XBINNING, 1) +val ReadableHeader.declination + get() = Angle(getStringOrNull(FitsKeyword.DEC)).takeIf { it.isFinite() } + ?: Angle(getStringOrNull(FitsKeyword.OBJCTDEC)).takeIf { it.isFinite() } + ?: getDouble(FitsKeyword.CRVAL2, Double.NaN).deg -inline val Header.binY - get() = getIntOrNull(SBFitsExt.YBINNING) ?: binX +inline val ReadableHeader.binX + get() = getInt(FitsKeyword.XBINNING, 1) -inline val Header.exposureTimeInSeconds - get() = getDoubleOrNull(Standard.EXPTIME) ?: getDouble(Standard.EXPOSURE, 0.0) +inline val ReadableHeader.binY + get() = getIntOrNull(FitsKeyword.YBINNING) ?: binX -inline val Header.exposureTime: Duration +inline val ReadableHeader.exposureTimeInSeconds + get() = getDoubleOrNull(FitsKeyword.EXPTIME) ?: getDouble(FitsKeyword.EXPOSURE, 0.0) + +inline val ReadableHeader.exposureTime: Duration get() = Duration.ofNanos((exposureTimeInSeconds * 1000000000.0).toLong()) -inline val Header.exposureTimeInMicroseconds +inline val ReadableHeader.exposureTimeInMicroseconds get() = (exposureTimeInSeconds * 1000000.0).toLong() const val INVALID_TEMPERATURE = 999.0 -inline val Header.temperature - get() = getDoubleOrNull(NOAOExt.CCDTEM) ?: getDouble(SBFitsExt.CCD_TEMP, INVALID_TEMPERATURE) +inline val ReadableHeader.temperature + get() = getDoubleOrNull(FitsKeyword.CCDTEM) ?: getDouble(FitsKeyword.CCD_TEMP, INVALID_TEMPERATURE) + +inline val ReadableHeader.gain + get() = getDouble(FitsKeyword.GAIN, 0.0) -inline val Header.gain - get() = getDouble(NOAOExt.GAIN, 0.0) +inline val ReadableHeader.latitude + get() = (getDoubleOrNull(FitsKeyword.SITELAT)?.deg ?: getDoubleOrNull("LAT-OBS"))?.deg -inline val Header.latitude - get() = (getDoubleOrNull(SBFitsExt.SITELAT)?.deg ?: getDoubleOrNull("LAT-OBS"))?.deg +inline val ReadableHeader.longitude + get() = (getDoubleOrNull(FitsKeyword.SITELONG)?.deg ?: getDoubleOrNull("LONG-OBS"))?.deg -inline val Header.longitude - get() = (getDoubleOrNull(SBFitsExt.SITELONG)?.deg ?: getDoubleOrNull("LONG-OBS"))?.deg +inline val ReadableHeader.observationDate + get() = getStringOrNull(FitsKeyword.DATE_OBS)?.let(LocalDateTime::parse) -inline val Header.observationDate - get() = getStringOrNull(Standard.DATE_OBS)?.let(LocalDateTime::parse) +inline val ReadableHeader.cfaPattern + get() = getStringOrNull(FitsKeyword.BAYERPAT)?.ifBlank { null }?.trim() -inline val Header.cfaPattern - get() = getStringOrNull(MaxImDLExt.BAYERPAT)?.ifBlank { null }?.trim() +inline val ReadableHeader.filter + get() = getStringOrNull(FitsKeyword.FILTER)?.ifBlank { null }?.trim() -inline val Header.filter - get() = getStringOrNull(Standard.FILTER)?.ifBlank { null }?.trim() +inline val ReadableHeader.frame + get() = (getStringOrNull("FRAME") ?: getStringOrNull(FitsKeyword.IMAGETYP))?.ifBlank { null }?.trim() -inline val Header.frame - get() = (getStringOrNull("FRAME") ?: getStringOrNull(SBFitsExt.IMAGETYP))?.ifBlank { null }?.trim() +inline val ReadableHeader.camera + get() = getStringOrNull(FitsKeyword.CAMERA)?.ifBlank { null }?.trim() -inline val Header.instrument - get() = getStringOrNull(Standard.INSTRUME)?.ifBlank { null }?.trim() +inline val ReadableHeader.instrument + get() = getStringOrNull(FitsKeyword.INSTRUME)?.ifBlank { null }?.trim() inline fun SeekableSource.fits() = Fits().also { it.read(this) } diff --git a/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsIO.kt b/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsIO.kt deleted file mode 100644 index d0c951efe..000000000 --- a/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsIO.kt +++ /dev/null @@ -1,25 +0,0 @@ -package nebulosa.fits - -import nebulosa.io.SeekableSource -import okio.Sink -import java.io.IOException - -object FitsIO : FitsReader, FitsWriter { - - override fun read(source: SeekableSource): Hdu<*> { - val header = Header.from(source) - - val hdu = when { - ImageHdu.isValid(header) -> ImageHdu(header) - else -> throw IOException("unsupported FITS header") - } - - hdu.read(source) - - return hdu - } - - override fun write(sink: Sink, hdu: Hdu<*>) { - hdu.write(sink) - } -} diff --git a/nebulosa-fits/src/main/kotlin/nebulosa/fits/NOAOExt.kt b/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsKeyword.kt similarity index 65% rename from nebulosa-fits/src/main/kotlin/nebulosa/fits/NOAOExt.kt rename to nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsKeyword.kt index 37b18604a..055d8c0ba 100644 --- a/nebulosa-fits/src/main/kotlin/nebulosa/fits/NOAOExt.kt +++ b/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsKeyword.kt @@ -1,13 +1,945 @@ package nebulosa.fits -/** - * This keyword dictionary defines keywords which may be used in image data recorded by the data acquisition system. It - * currently does not consider keywords for data processing. Most of the keywords defined here will not be used. New - * parameters must be added to the logical class heirarchy and then a keyword defined in this dictionary before use in - * image data. - */ @Suppress("EnumEntryName") -enum class NOAOExt : FitsHeader { +enum class FitsKeyword : FitsHeaderKey { + + // Standard. + // https://github.com/nom-tam-fits/nom-tam-fits/blob/master/src/main/java/nom/tam/fits/header/Standard.java + // https://github.com/nom-tam-fits/nom-tam-fits/blob/master/src/main/java/nom/tam/fits/header/ObservationDescription.java + // https://github.com/nom-tam-fits/nom-tam-fits/blob/master/src/main/java/nom/tam/fits/header/ObservationDurationDescription.java + + /** + * The value field shall contain a character string identifying who compiled the information in the data associated + * with the key. This keyword is appropriate when the data originate in a published paper or are compiled from many + * sources. + */ + AUTHOR(HduType.ANY, ValueType.STRING, "author of the data"), + + /** + * The value field shall contain an integer. The absolute value is used in computing the sizes of data structures. + * It shall specify the number of bits that represent a data value. RANGE: -64,-32,8,16,32 + */ + BITPIX(HduType.ANY, ValueType.INTEGER, "bits per data value"), + + /** + * This keyword shall be used only in primary array headers or IMAGE extension headers with positive values of + * BITPIX (i.e., in arrays with integer data). Columns 1-8 contain the string, `BLANK ' (ASCII blanks in columns + * 6-8). The value field shall contain an integer that specifies the representation of array values whose physical + * values are undefined. + */ + BLANK(HduType.IMAGE, ValueType.INTEGER, "value used for undefined array elements"), + + /** + * Columns 1-8 contain ASCII blanks. This keyword has no associated value. Columns 9-80 may contain any ASCII text. + * Any number of card images with blank keyword fields may appear in a key. + */ + BLANKS(" ", HduType.ANY, ValueType.NONE, ""), + + /** + * This keyword may be used only in the primary key. It shall appear within the first 36 card images of the FITS + * file. (Note: This keyword thus cannot appear if NAXIS is greater than 31, or if NAXIS is greater than 30 and the + * EXTEND keyword is present.) Its presence with the required logical value of T advises that the physical block + * size of the FITS file on which it appears may be an integral multiple of the logical record length, and not + * necessarily equal to it. Physical block size and logical record length may be equal even if this keyword is + * present or unequal if it is absent. It is reserved primarily to prevent its use with other meanings. Since the + * issuance of version 1 of the standard, the BLOCKED keyword has been deprecated. + */ + @Deprecated("no blocksize other that 2880 may be used") + BLOCKED(HduType.PRIMARY, ValueType.LOGICAL, "is physical blocksize a multiple of 2880?"), + + /** + * This keyword shall be used, along with the BZERO keyword, when the array pixel values are not the true physical + * values, to transform the primary data array values to the true physical values they represent, using the + * equation: physical_value = BZERO + BSCALE * array_value. The value field shall contain a floating point number + * representing the coefficient of the linear term in the scaling equation, the ratio of physical value to array + * value at zero offset. The default value for this keyword is 1.0. + */ + BSCALE(HduType.IMAGE, ValueType.REAL, "linear factor in scaling equation"), + + /** + * The value field shall contain a character string, describing the physical units in which the quantities in the + * array, after application of BSCALE and BZERO, are expressed. The units of all FITS key keyword values, with the + * exception of measurements of angles, should conform with the recommendations in the IAU Style Manual. For angular + * measurements given as floating point values and specified with reserved keywords, degrees are the recommended + * units (with the units, if specified, given as 'deg'). + */ + BUNIT(HduType.IMAGE, ValueType.STRING, "physical units of the array values"), + + /** + * This keyword shall be used, along with the BSCALE keyword, when the array pixel values are not the true physical + * values, to transform the primary data array values to the true values using the equation: physical_value = BZERO + * + BSCALE * array_value. The value field shall contain a floating point number representing the physical value + * corresponding to an array value of zero. The default value for this keyword is 0.0. + */ + BZERO(HduType.IMAGE, ValueType.REAL, "zero point in scaling equation"), + + /** + * The value field shall contain a floating point number giving the partial derivative of the coordinate specified + * by the CTYPEn keywords with respect to the pixel index, evaluated at the reference point CRPIXn, in units of the + * coordinate specified by the CTYPEn keyword. These units must follow the prescriptions of section 5.3 of the FITS + * Standard. + */ + CDELTn(HduType.IMAGE, ValueType.REAL, "coordinate increment along axis"), + + /** + * This keyword shall have no associated value; columns 9-80 may contain any ASCII text. Any number of COMMENT card + * images may appear in a key. + */ + COMMENT(HduType.ANY, ValueType.NONE, ""), + + /** + * The CONTINUE keyword, when followed by spaces in columns 9 and 10 of the card image and a character string + * enclosed in single quotes starting in column 11 or higher, indicates that the quoted string should be treated as + * a continuation of the character string value in the previous key keyword. To conform to this convention, the + * character string value on the previous keyword must end with the ampersand character ('&'), but the ampersand + * is not part of the value string and should be deleted before concatenating the strings together. The character + * string value may be continued on any number of consecutive CONTINUE keywords, thus effectively allowing + * arbitrarily long strings to be written as keyword values. + */ + CONTINUE(HduType.ANY, ValueType.NONE, "denotes the CONTINUE long string keyword convention"), + + /** + * This keyword is used to indicate a rotation from a standard coordinate system described by the CTYPEn to a + * different coordinate system in which the values in the array are actually expressed. Rules for such rotations are + * not further specified in the Standard; the rotation should be explained in comments. The value field shall + * contain a floating point number giving the rotation angle in degrees between axis n and the direction implied by + * the coordinate system defined by CTYPEn. In unit degrees. + */ + CROTAn(HduType.IMAGE, ValueType.REAL, "coordinate system rotation angle"), + + /** + * The value field shall contain a floating point number, identifying the location of a reference point along axis + * n, in units of the axis index. This value is based upon a counter that runs from 1 to NAXISn with an increment of + * 1 per pixel. The reference point value need not be that for the center of a pixel nor lie within the actual data + * array. Use comments to indicate the location of the index point relative to the pixel. + */ + CRPIXn(HduType.IMAGE, ValueType.REAL, "coordinate system reference pixel"), + + /** + * The value field shall contain a floating point number, giving the value of the coordinate specified by the CTYPEn + * keyword at the reference point CRPIXn. Units must follow the prescriptions of section 5.3 of the FITS Standard. + */ + CRVALn(HduType.IMAGE, ValueType.REAL, "coordinate system value at reference pixel"), + + /** + * The value field shall contain a character string, giving the name of the coordinate represented by axis n. + */ + CTYPEn(HduType.IMAGE, ValueType.STRING, "name of the coordinate axis"), + + /** + * The value field shall always contain a floating point number, regardless of the value of BITPIX. This number + * shall give the maximum valid physical value represented by the array, exclusive of any special values. + */ + DATAMAX(HduType.IMAGE, ValueType.REAL, "maximum data value"), + + /** + * The value field shall always contain a floating point number, regardless of the value of BITPIX. This number + * shall give the minimum valid physical value represented by the array, exclusive of any special values. + */ + DATAMIN(HduType.IMAGE, ValueType.REAL, "minimum data value"), + + /** + * The date on which the HDU was created, in the format specified in the FITS Standard. The old date format was + * 'yy/mm/dd' and may be used only for dates from 1900 through 1999. the new Y2K compliant date format is + * 'yyyy-mm-dd' or 'yyyy-mm-ddTHH:MM:SS[.sss]'. + */ + DATE(HduType.ANY, ValueType.STRING, "date of file creation"), + + /** + * The date of the observation, in the format specified in the FITS Standard. The old date format was 'yy/mm/dd' and + * may be used only for dates from 1900 through 1999. The new Y2K compliant date format is 'yyyy-mm-dd' or + * 'yyyy-mm-ddTHH:MM:SS[.sss]'. + */ + DATE_OBS("DATE-OBS", HduType.ANY, ValueType.STRING, "date of the observation"), + + /** + * This keyword has no associated value. Columns 9-80 shall be filled with ASCII blanks. + */ + END(HduType.ANY, ValueType.NONE, ""), + + /** + * The value field shall contain a floating point number giving the equinox in years for the celestial coordinate + * system in which positions are expressed. Starting with Version 1, the Standard has deprecated the use of the + * EPOCH keyword and thus it shall not be used in FITS files created after the adoption of the standard; rather, the + * EQUINOX keyword shall be used. + */ + @Deprecated("use EQUINOX instead") + EPOCH(HduType.ANY, ValueType.REAL, "equinox of celestial coordinate system"), + + /** + * The value field shall contain a floating point number giving the equinox in years for the celestial coordinate + * system in which positions are expressed. + */ + EQUINOX(HduType.ANY, ValueType.REAL, "equinox of celestial coordinate system"), + + /** + * If the FITS file may contain extensions, a card image with the keyword EXTEND and the value field containing the + * logical value T must appear in the primary key immediately after the last NAXISn card image, or, if NAXIS=0, the + * NAXIS card image. The presence of this keyword with the value T in the primary key does not require that + * extensions be present. + */ + EXTEND(HduType.PRIMARY, ValueType.LOGICAL, "may the FITS file contain extensions?"), + + /** + * The value field shall contain an integer, specifying the level in a hierarchy of extension levels of the + * extension key containing it. The value shall be 1 for the highest level; levels with a higher value of this + * keyword shall be subordinate to levels with a lower value. If the EXTLEVEL keyword is absent, the file should be + * treated as if the value were 1. This keyword is used to describe an extension and should not appear in the + * primary key.RANGE: [1:] DEFAULT: 1 + */ + EXTLEVEL(HduType.EXTENSION, ValueType.INTEGER, "hierarchical level of the extension"), + + /** + * The value field shall contain a character string, to be used to distinguish among different extensions of the + * same type, i.e., with the same value of XTENSION, in a FITS file. This keyword is used to describe an extension + * and should not appear in the primary key. + */ + EXTNAME(HduType.EXTENSION, ValueType.STRING, "name of the extension"), + + /** + * The value field shall contain an integer, to be used to distinguish among different extensions in a FITS file + * with the same type and name, i.e., the same values for XTENSION and EXTNAME. The values need not start with 1 for + * the first extension with a particular value of EXTNAME and need not be in sequence for subsequent values. If the + * EXTVER keyword is absent, the file should be treated as if the value were 1. This keyword is used to describe an + * extension and should not appear in the primary key.RANGE: [1:] DEFAULT: 1 + */ + EXTVER(HduType.EXTENSION, ValueType.INTEGER, "version of the extension"), + + /** + * The value field shall contain an integer that shall be used in any way appropriate to define the data structure, + * consistent with Eq. 5.2 in the FITS Standard. This keyword originated for use in FITS Random Groups where it + * specifies the number of random groups present. In most other cases this keyword will have the value 1. + */ + GCOUNT(HduType.EXTENSION, ValueType.INTEGER, "group count"), + + /** + * The value field shall contain the logical constant T. The value T associated with this keyword implies that + * random groups records are present. + */ + GROUPS(HduType.GROUPS, ValueType.LOGICAL, "indicates random groups structure"), + + /** + * This keyword shall have no associated value; columns 9-80 may contain any ASCII text. The text should contain a + * history of steps and procedures associated with the processing of the associated data. Any number of HISTORY card + * images may appear in a key. + */ + HISTORY(HduType.ANY, ValueType.NONE, "processing history of the data"), + + /** + * The value field shall contain a character string identifying the instrument used to acquire the data associated + * with the key. + */ + INSTRUME(HduType.ANY, ValueType.STRING, "name of instrument"), + + /** + * The value field shall contain a non-negative integer no greater than 999, representing the number of axes in the + * associated data array. A value of zero signifies that no data follow the key in the HduType. In the context of FITS + * 'TABLE' or 'BINTABLE' extensions, the value of NAXIS is always 2.RANGE: [0:999] + */ + NAXIS(HduType.ANY, ValueType.INTEGER, "number of axes"), + + /** + * The value field of this indexed keyword shall contain a non-negative integer, representing the number of elements + * along axis n of a data array. The NAXISn must be present for all values n = 1,...,NAXIS, and for no other values + * of n. A value of zero for any of the NAXISn signifies that no data follow the key in the HduType. If NAXIS is equal + * to 0, there should not be any NAXISn keywords.RANGE: [0:] + */ + NAXISn(HduType.ANY, ValueType.INTEGER, "size of the n'th axis"), + + /** + * The value field shall contain a character string giving a name for the object observed. + */ + OBJECT(HduType.ANY, ValueType.STRING, "name of observed object"), + + /** + * The value field shall contain a character string identifying who acquired the data associated with the key. + */ + OBSERVER(HduType.ANY, ValueType.STRING, "observer who acquired the data"), + + /** + * The value field shall contain a character string identifying the organization or institution responsible for + * creating the FITS file. + */ + ORIGIN(HduType.ANY, ValueType.STRING, "organization responsible for the data"), + + /** + * The value field shall contain an integer that shall be used in any way appropriate to define the data structure, + * consistent with Eq. 5.2 in the FITS Standard. This keyword was originated for use with FITS Random Groups and + * represented the number of parameters preceding each group. It has since been used in 'BINTABLE' extensions to + * represent the size of the data heap following the main data table. In most other cases its value will be zero. + */ + PCOUNT(HduType.EXTENSION, ValueType.INTEGER, "parameter count"), + + /** + * This keyword is reserved for use within the FITS Random Groups structure. This keyword shall be used, along with + * the PZEROn keyword, when the nth FITS group parameter value is not the true physical value, to transform the + * group parameter value to the true physical values it represents, using the equation, physical_value = PZEROn + + * PSCALn * group_parameter_value. The value field shall contain a floating point number representing the + * coefficient of the linear term, the scaling factor between true values and group parameter values at zero offset. + * The default value for this keyword is 1.0. + */ + PSCALn(HduType.GROUPS, ValueType.REAL, "parameter scaling factor"), + + /** + * This keyword is reserved for use within the FITS Random Groups structure. The value field shall contain a + * character string giving the name of parameter n. If the PTYPEn keywords for more than one value of n have the + * same associated name in the value field, then the data value for the parameter of that name is to be obtained by + * adding the derived data values of the corresponding parameters. This rule provides a mechanism by which a random + * parameter may have more precision than the accompanying data array elements; for example, by summing two 16-bit + * values with the first scaled relative to the other such that the sum forms a number of up to 32-bit precision. + */ + PTYPEn(HduType.GROUPS, ValueType.STRING, "name of random groups parameter"), + + /** + * This keyword is reserved for use within the FITS Random Groups structure. This keyword shall be used, along with + * the PSCALn keyword, when the nth FITS group parameter value is not the true physical value, to transform the + * group parameter value to the physical value. The value field shall contain a floating point number, representing + * the true value corresponding to a group parameter value of zero. The default value for this keyword is 0.0. The + * transformation equation is as follows: physical_value = PZEROn + PSCALn * group_parameter_value.DEFAULT: 0.0 + */ + PZEROn(HduType.GROUPS, ValueType.REAL, "parameter scaling zero point"), + + /** + * Coordinate reference frame of major/minor axes.If absent the default value is 'FK5'. + */ + RADESYS(HduType.ANY, ValueType.STRING, "Coordinate reference frame of major/minor axes."), + + /** + * The value field shall contain a character string citing a reference where the data associated with the key are + * published. + */ + REFERENC(HduType.ANY, ValueType.STRING, "bibliographic reference"), + + /** + * The SIMPLE keyword is required to be the first keyword in the primary key of all FITS files. The value field + * shall contain a logical constant with the value T if the file conforms to the standard. This keyword is mandatory + * for the primary key and is not permitted in extension headers. A value of F signifies that the file does not + * conform to this standard. + */ + SIMPLE(HduType.PRIMARY, ValueType.LOGICAL, "does file conform to the Standard?"), + + /** + * The value field of this indexed keyword shall contain an integer specifying the column in which field n starts in + * an ASCII TABLE extension. The first column of a row is numbered 1.RANGE: [1:] + */ + TBCOLn(HduType.ASCII_TABLE, ValueType.INTEGER, "begining column number"), + + /** + * The value field of this indexed keyword shall contain a character string describing how to interpret the contents + * of field n as a multidimensional array, providing the number of dimensions and the length along each axis. The + * form of the value is not further specified by the Standard. A proposed convention is described in Appendix B.2 of + * the FITS Standard in which the value string has the format '(l,m,n...)' where l, m, n,... are the dimensions of + * the array. + */ + TDIMn(HduType.BINTABLE, ValueType.STRING, "dimensionality of the array "), + + /** + * The value field of this indexed keyword shall contain a character string describing the format recommended for + * the display of the contents of field n. If the table value has been scaled, the physical value shall be + * displayed. All elements in a field shall be displayed with a single, repeated format. For purposes of display, + * each byte of bit (type X) and byte (type B) arrays is treated as an unsigned integer. Arrays of type A may be + * terminated with a zero byte. Only the format codes in Table 8.6, discussed in section 8.3.4 of the FITS Standard, + * are permitted for encoding. The format codes must be specified in upper case. If the Bw.m, Ow.m, and Zw.m formats + * are not readily available to the reader, the Iw.m display format may be used instead, and if the ENw.d and ESw.d + * formats are not available, Ew.d may be used. The meaning of this keyword is not defined for fields of type P in + * the Standard but may be defined in conventions using such fields. + */ + TDISPn(HduType.TABLE, ValueType.STRING, "display format"), + + /** + * The value field shall contain a character string identifying the telescope used to acquire the data associated + * with the key. + */ + TELESCOP(HduType.ANY, ValueType.STRING, "name of telescope"), + + /** + * The value field shall contain a non-negative integer representing the number of fields in each row of a 'TABLE' + * or 'BINTABLE' extension. The maximum permissible value is 999. RANGE: [0:999] + */ + TFIELDS(HduType.TABLE, ValueType.INTEGER, "number of columns in the table"), + + /** + * The value field of this indexed keyword shall contain a character string describing the format in which field n + * is encoded in a 'TABLE' or 'BINTABLE' extension. + */ + TFORMn(HduType.TABLE, ValueType.STRING, "column data format"), + + /** + * The value field of this keyword shall contain an integer providing the separation, in bytes, between the start of + * the main data table and the start of a supplemental data area called the heap. The default value shall be the + * product of the values of NAXIS1 and NAXIS2. This keyword shall not be used if the value of PCOUNT is zero. A + * proposed application of this keyword is presented in Appendix B.1 of the FITS Standard. + */ + THEAP(HduType.BINTABLE, ValueType.INTEGER, "offset to starting data heap address"), + + /** + * In ASCII 'TABLE' extensions, the value field for this indexed keyword shall contain the character string that + * represents an undefined value for field n. The string is implicitly blank filled to the width of the field. In + * binary 'BINTABLE' table extensions, the value field for this indexed keyword shall contain the integer that + * represents an undefined value for field n of data type B, I, or J. The keyword may not be used in 'BINTABLE' + * extensions if field n is of any other data type. + */ + TNULLn(HduType.TABLE, ValueType.STRING, "value used to indicate undefined table element"), + + /** + * This indexed keyword shall be used, along with the TZEROn keyword, when the quantity in field n does not + * represent a true physical quantity. The value field shall contain a floating point number representing the + * coefficient of the linear term in the equation, physical_value = TZEROn + TSCALn * field_value, which must be + * used to compute the true physical value of the field, or, in the case of the complex data types C and M, of the + * real part of the field with the imaginary part of the scaling factor set to zero. The default value for this + * keyword is 1.0. This keyword may not be used if the format of field n is A, L, or X.DEFAULT: 1.0 + */ + TSCALn(HduType.TABLE, ValueType.REAL, "linear data scaling factor"), + + /** + * The value field for this indexed keyword shall contain a character string, giving the name of field n. It is + * recommended that only letters, digits, and underscore (hexadecimal code 5F, ('_') be used in the name. String + * comparisons with the values of TTYPEn keywords should not be case sensitive. The use of identical names for + * different fields should be avoided. + */ + TTYPEn(HduType.TABLE, ValueType.STRING, "column name"), + + /** + * The value field shall contain a character string describing the physical units in which the quantity in field n, + * after any application of TSCALn and TZEROn, is expressed. The units of all FITS key keyword values, with the + * exception of measurements of angles, should conform with the recommendations in the IAU Style Manual. For angular + * measurements given as floating point values and specified with reserved keywords, degrees are the recommended + * units (with the units, if specified, given as 'deg'). + */ + TUNITn(HduType.TABLE, ValueType.STRING, "column units"), + + /** + * This indexed keyword shall be used, along with the TSCALn keyword, when the quantity in field n does not + * represent a true physical quantity. The value field shall contain a floating point number representing the true + * physical value corresponding to a value of zero in field n of the FITS file, or, in the case of the complex data + * types C and M, in the real part of the field, with the imaginary part set to zero. The default value for this + * keyword is 0.0. This keyword may not be used if the format of field n is A, L, or X.DEFAULT: 0.0 + */ + TZEROn(HduType.TABLE, ValueType.REAL, "column scaling zero point"), + + /** + * The value field shall contain a character string giving the name of the extension type. This keyword is mandatory + * for an extension key and must not appear in the primary key. For an extension that is not a standard extension, + * the type name must not be the same as that of a standard extension. + */ + XTENSION(HduType.EXTENSION, ValueType.STRING, "marks beginning of new HDU"), + + // FITS keywords that have been widely used within the astronomical community. + // These are the Keywords that describe the observation. + + /** + * The value field shall contain a floating point number giving the air mass during the observation by a ground + * based telescope. The value of the airmass is often approximated by the secant of the elevation angle and has a + * value of 1.0 at the zenith and increases towards the horizon. This value is assumed to correspond to the start of + * the observation unless another interpretation is clearly explained in the comment field. + */ + AIRMASS(HduType.ANY, ValueType.REAL, "air mass"), + + /** + * The value field gives the declination of the observation. It may be expressed either as a floating point number + * in units of decimal degrees, or as a character string in 'dd:mm:ss.sss' format where the decimal point and number + * of fractional digits are optional. The coordinate reference frame is given by the RADECSYS keyword, and the + * coordinate epoch is given by the EQUINOX keyword. Example: -47.25944 or '-47:15:34.00'. + */ + DEC(HduType.ANY, ValueType.STRING, "declination of the observed object"), + + /** + * The value field shall contain a floating point number giving the nominal declination of the pointing direction in + * units of decimal degrees. The coordinate reference frame is given by the RADECSYS keyword, and the coordinate + * epoch is given by the EQUINOX keyword. The precise definition of this keyword is instrument-specific, but + * typically the nominal direction corresponds to the direction to which the instrument was requested to point. The + * DEC_PNT keyword should be used to give the actual pointed direction. + */ + DEC_NOM(HduType.ANY, ValueType.REAL, "nominal declination of the observation"), + + /** + * The value field shall contain a floating point number giving the declination of the observed object in units of + * decimal degrees. The coordinate reference frame is given by the RADECSYS keyword, and the coordinate epoch is + * given by the EQUINOX keyword. + */ + DEC_OBJ(HduType.ANY, ValueType.REAL, "declination of the observed object"), + + /** + * The value field shall contain a floating point number giving the declination of the pointing direction in units + * of decimal degrees. The coordinate reference frame is given by the RADECSYS keyword, and the coordinate epoch is + * given by the EQUINOX keyword. The precise definition of this keyword is instrument-specific, but typically the + * pointed direction corresponds to the optical axis of the instrument. This keyword gives a mean value in cases + * where the pointing axis was not fixed during the entire observation. + */ + DEC_PNT(HduType.ANY, ValueType.REAL, "declination of the pointed direction of the instrument"), + + /** + * The value field shall contain a floating point number giving the declination of the space craft (or telescope + * platform) X axis during the observation in decimal degrees. The coordinate reference frame is given by the + * RADECSYS keyword, and the coordinate epoch is given by the EQUINOX keyword. This keyword gives a mean value in + * cases where the axis was not fixed during the entire observation. + */ + DEC_SCX(HduType.ANY, ValueType.REAL, "declination of the X spacecraft axis"), + + /** + * The value field shall contain a floating point number giving the declination of the space craft (or telescope + * platform) Z axis during the observation in decimal degrees. The coordinate reference frame is given by the + * RADECSYS keyword, and the coordinate epoch is given by the EQUINOX keyword. This keyword gives a mean value in + * cases where the axis was not fixed during the entire observation. + */ + DEC_SCZ(HduType.ANY, ValueType.REAL, "declination of the Z spacecraft axis"), + + /** + * The value field shall contain a floating point number giving the geographic latitude from which the observation + * was made in units of degrees. + */ + LATITUDE(HduType.ANY, ValueType.REAL, "geographic latitude of the observation"), + + /** + * The value field shall contain a floating point number giving the angle between the direction of the observation + * (e.g., the optical axis of the telescope or the position of the target) and the moon, measured in degrees. + */ + MOONANGL(HduType.ANY, ValueType.REAL, "angle between the observation and the moon"), + + /** + * The value field shall contain a character string giving a name for the observed object that conforms to the IAU + * astronomical object naming conventions. The value of this keyword is more strictly constrained than for the + * standard OBJECT keyword which in practice has often been used to record other ancillary information about the + * observation (e.g. filter, exposure time, weather conditions, etc.). + */ + OBJNAME(HduType.ANY, ValueType.STRING, "AU name of observed object"), + + /** + * The value field shall contain a character string which uniquely identifies the dataset contained in the FITS + * file. This is typically a sequence number that can contain a mixture of numerical and character values. Example: + * '10315-01-01-30A' + */ + OBS_ID(HduType.ANY, ValueType.STRING, "unique observation ID"), + + /** + * The value field shall contain a floating point number giving the position angle of the y axis of the detector + * projected on the sky, in degrees east of north. This keyword is synonymous with the CROTA2 WCS keyword. + */ + ORIENTAT(HduType.IMAGE, ValueType.REAL, "position angle of image y axis (deg. E of N)"), + + /** + * The value field shall contain a floating point number giving the position angle of the relevant aspect of + * telescope pointing axis and/or instrument on the sky in units of degrees east of north. It commonly applies to + * the orientation of a slit mask. + */ + PA_PNT(HduType.ANY, ValueType.REAL, "position angle of the pointing"), + + /** + * The value field gives the Right Ascension of the observation. It may be expressed either as a floating point + * number in units of decimal degrees, or as a character string in 'HH:MM:SS.sss' format where the decimal point and + * number of fractional digits are optional. The coordinate reference frame is given by the RADECSYS keyword, and + * the coordinate epoch is given by the EQUINOX keyword. Example: 180.6904 or '12:02:45.7'. + */ + RA(HduType.ANY, ValueType.STRING, "R.A. of the observation"), + + /** + * The value field shall contain a floating point number giving the nominal Right Ascension of the pointing + * direction in units of decimal degrees. The coordinate reference frame is given by the RADECSYS keyword, and the + * coordinate epoch is given by the EQUINOX keyword. The precise definition of this keyword is instrument-specific, + * but typically the nominal direction corresponds to the direction to which the instrument was requested to point. + * The RA_PNT keyword should be used to give the actual pointed direction. + */ + RA_NOM(HduType.ANY, ValueType.REAL, "nominal R.A. of the observation"), + + /** + * The value field shall contain a floating point number giving the Right Ascension of the observed object in units + * of decimal degrees. The coordinate reference frame is given by the RADECSYS keyword, and the coordinate epoch is + * given by the EQUINOX keyword. + */ + RA_OBJ(HduType.ANY, ValueType.REAL, "R.A. of the observed object"), + + /** + * The value field shall contain a floating point number giving the Right Ascension of the pointing direction in + * units of decimal degrees. The coordinate reference frame is given by the RADECSYS keyword, and the coordinate + * epoch is given by the EQUINOX keyword. The precise definition of this keyword is instrument-specific, but + * typically the pointed direction corresponds to the optical axis of the instrument. This keyword gives a mean + * value in cases where the pointing axis was not fixed during the entire observation. + */ + RA_PNT(HduType.ANY, ValueType.REAL, "R.A. of the pointed direction of the instrument"), + + /** + * The value field shall contain a floating point number giving the Right Ascension of the space craft (or telescope + * platform) X axis during the observation in decimal degrees. The coordinate reference frame is given by the + * RADECSYS keyword, and the coordinate epoch is given by the EQUINOX keyword. This keyword gives a mean value in + * cases where the axis was not fixed during the entire observation. + */ + RA_SCX(HduType.ANY, ValueType.REAL, "R.A. of the X spacecraft axis"), + + /** + * The value field shall contain a floating point number giving the Right Ascension of the space craft (or telescope + * platform) Y axis during the observation in decimal degrees. The coordinate reference frame is given by the + * RADECSYS keyword, and the coordinate epoch is given by the EQUINOX keyword. This keyword gives a mean value in + * cases where the axis was not fixed during the entire observation. + */ + RA_SCY(HduType.ANY, ValueType.REAL, "R.A. of the Y spacecraft axis"), + + /** + * The value field shall contain a floating point number giving the Right Ascension of the space craft (or telescope + * platform) Z axis during the observation in decimal degrees. The coordinate reference frame is given by the + * RADECSYS keyword, and the coordinate epoch is given by the EQUINOX keyword. This keyword gives a mean value in + * cases where the axis was not fixed during the entire observation. + */ + RA_SCZ(HduType.ANY, ValueType.REAL, "R.A. of the Z spacecraft axis"), + + /** + * The value field shall contain a floating point number giving the angle between the direction of the observation + * (e.g., the optical axis of the telescope or the position of the target) and the sun, measured in degrees. + */ + SUNANGLE(HduType.ANY, ValueType.REAL, "angle between the observation and the sun"), + + // FITS keywords that have been widely used within the astronomical community. + // These are the Keywords that describe the instrument that took the data. + + /** + * The value field shall contain a character string which gives the name of the instrumental aperture though which + * the observation was made. This keyword is typically used in instruments which have a selection of apertures which + * restrict the field of view of the detector. + */ + APERTURE(HduType.ANY, ValueType.STRING, "name of field of view aperture"), + + /** + * The value field shall contain a character string which identifies the configuration or mode of the pre-processing + * software that operated on the raw instrumental data to generate the data that is recorded in the FITS file. + * Example: some X-ray satellite data may be recorded in 'BRIGHT', 'FAINT', or 'FAST' data mode. + */ + DATAMODE(HduType.ANY, ValueType.STRING, "pre-processor data mode"), + + /** + * The value field shall contain a character string giving the name of the detector within the instrument that was + * used to make the observation. Example: 'CCD1' + */ + DETNAM(HduType.ANY, ValueType.STRING, "name of the detector used to make the observation"), + + /** + * The value field shall contain a character string which gives the name of the filter that was used during the + * observation to select or modify the radiation that was transmitted to the detector. More than 1 filter may be + * listed by using the FILTERn indexed keyword. The value 'none' or 'NONE' indicates that no filter was used. + */ + FILTER(HduType.ANY, ValueType.STRING, "name of filter used during the observation"), + + /** + * The value field of this indexed keyword shall contain a character string which gives the name of one of multiple + * filters that were used during the observation to select or modify the radiation that was transmitted to the + * detector. The value 'none' or 'NONE' indicates that no filter was used. + */ + FILTERn(HduType.ANY, ValueType.STRING, "name of filters used during the observation"), + + /** + * The value field shall contain a character string which gives the name of the defraction grating that was used + * during the observation. More than 1 grating may be listed by using the GRATINGn indexed keyword. The value 'none' + * or 'NONE' indicates that no grating was used. + */ + GRATING(HduType.ANY, ValueType.STRING, "name of the grating used during the observation."), + + /** + * The value field of this indexed keyword shall contain a character string which gives the name of one of multiple + * defraction gratings that were used during the observation. The value 'none' or 'NONE' indicates that no grating + * was used. + */ + GRATINGn(HduType.ANY, ValueType.STRING, "name of gratings used during the observation."), + + /** + * The value field shall contain a character string which gives the observing mode of the observation. This is used + * in cases where the instrument or detector can be configured to operate in different modes which significantly + * affect the resulting data. Examples: 'SLEW', 'RASTER', or 'POINTING' + */ + OBS_MODE(HduType.ANY, ValueType.STRING, "instrumental mode of the observation"), + + /** + * The value field shall contain an integer giving the data value at which the detector becomes saturated. This + * keyword value may differ from the maximum value implied by the BITPIX in that more bits may be allocated in the + * FITS pixel values than the detector can accommodate. + */ + SATURATE(HduType.ANY, ValueType.INTEGER, "Data value at which saturation occurs"), + + // FITS keywords that have been widely used within the astronomical community. + // These are the Keywords that describe the observation. + + /** + * The value field shall contain a character string that gives the date on which the observation ended. This keyword + * has the same format, and is used in conjunction with, the standard DATA-OBS keyword that gives the starting date + * of the observation. These 2 keywords may give either the calendar date using the 'yyyy-mm-dd' format, or may give + * the full date and time using the 'yyyy-mm-ddThh:mm:ss.sss' format. + */ + DATE_END("DATE-END", HduType.ANY, ValueType.STRING, "date of the end of observation"), + + /** + * The value field shall contain a floating point number giving the difference between the stop and start times of + * the observation in units of seconds. This keyword is synonymous with the TELAPSE keyword. + */ + ELAPTIME(HduType.ANY, ValueType.REAL, "elapsed time of the observation"), + + /** + * The value field shall contain a floating point number giving the exposure time of the observation in units of + * seconds. The exact definition of 'exposure time' is mission dependent and may, for example, include corrections + * for shutter open and close duration, detector dead time, vignetting, or other effects. This keyword is synonymous + * with the EXPTIME keyword. + */ + EXPOSURE(HduType.ANY, ValueType.REAL, "exposure time"), + + /** + * The value field shall contain a floating point number giving the exposure time of the observation in units of + * seconds. The exact definition of 'exposure time' is mission dependent and may, for example, include corrections + * for shutter open and close duration, detector dead time, vignetting, or other effects. This keyword is synonymous + * with the EXPOSURE keyword. + */ + EXPTIME(HduType.ANY, ValueType.REAL, "exposure time"), + + /** + * The value field shall contain a floating point number giving the total integrated exposure time in units of + * seconds corrected for detector 'dead time' effects which reduce the net efficiency of the detector. The ratio of + * LIVETIME/ONTIME gives the mean dead time correction during the observation, which lies in the range 0.0 to 1.0. + */ + LIVETIME(HduType.ANY, ValueType.REAL, "exposure time after deadtime correction"), + + /** + * The value field shall contain a floating point number giving the total integrated exposure time of the + * observation in units of seconds. ONTIME may be less than TELAPSE if there were intevals during the observation in + * which the target was not observed (e.g., the shutter was closed, or the detector power was turned off). + */ + ONTIME(HduType.ANY, ValueType.REAL, "integration time during the observation"), + + /** + * The value field shall contain a floating point number giving the difference between the stop and start times of + * the observation in units of seconds. This keyword is synonymous with the ELAPTIME keyword. + */ + TELAPSE(HduType.ANY, ValueType.REAL, "elapsed time of the observation"), + + /** + * The value field shall contain a character string that gives the time at which the observation ended. This keyword + * is used in conjunction with the DATE-END keyword to give the ending time of the observation; the DATE-END keyword + * gives the ending calendar date, with format 'yyyy-mm-dd', and TIME-END gives the time within that day using the + * format 'hh:mm:ss.sss...'. This keyword should not be used if the time is included directly as part of the + * DATE-END keyword value with the format 'yyyy-mm-ddThh:mm:ss.sss'. + */ + TIME_END("TIME-END", HduType.ANY, ValueType.STRING, "time at the end of the observation"), + + /** + * The value field shall contain a character string that gives the time at which the observation started. This + * keyword is used in conjunction with the standard DATE-OBS keyword to give the starting time of the observation; + * the DATE-OBS keyword gives the starting calendar date, with format 'yyyy-mm-dd', and TIME-OBS gives the time + * within that day using the format 'hh:mm:ss.sss...'. This keyword should not be used if the time is included + * directly as part of the DATE-OBS keyword value with the format 'yyyy-mm-ddThh:mm:ss.sss'. + */ + TIME_OBS("TIME-OBS", HduType.ANY, ValueType.STRING, "time at the start of the observation"), + + // Maxim DL.Extension keywords that may be added or read by MaxIm DL. + // https://github.com/nom-tam-fits/nom-tam-fits/blob/master/src/main/java/nom/tam/fits/header/extra/MaxImDLExt.java + + /** + * if present the image has a valid Bayer color pattern. + */ + BAYERPAT(HduType.IMAGE, ValueType.REAL, "image Bayer color pattern"), + + /** + * Boltwood Cloud Sensor ambient temperature in degrees C. + */ + BOLTAMBT(HduType.IMAGE, ValueType.REAL, "ambient temperature in degrees C"), + + /** + * Boltwood Cloud Sensor cloud condition. + */ + BOLTCLOU(HduType.IMAGE, ValueType.REAL, "Boltwood Cloud Sensor cloud condition."), + + /** + * Boltwood Cloud Sensor daylight level. + */ + BOLTDAY(HduType.IMAGE, ValueType.REAL, "Boltwood Cloud Sensor daylight level."), + + /** + * Boltwood Cloud Sensor dewpoint in degrees C. + */ + BOLTDEW(HduType.IMAGE, ValueType.REAL, "Boltwood Cloud Sensor dewpoint in degrees C."), + + /** + * Boltwood Cloud Sensor humidity in percent. + */ + BOLTHUM(HduType.IMAGE, ValueType.REAL, "Boltwood Cloud Sensor humidity in percent."), + + /** + * Boltwood Cloud Sensor rain condition. + */ + BOLTRAIN(HduType.IMAGE, ValueType.REAL, "Boltwood Cloud Sensor rain condition."), + + /** + * Boltwood Cloud Sensor sky minus ambient temperature in degrees C. + */ + BOLTSKYT(HduType.IMAGE, ValueType.REAL, "Boltwood Cloud Sensor sky minus ambient temperature in degrees C."), + + /** + * Boltwood Cloud Sensor wind speed in km/h. + */ + BOLTWIND(HduType.IMAGE, ValueType.REAL, "Boltwood Cloud Sensor wind speed in km/h."), + + /** + * indicates calibration state of the image; B indicates bias corrected, D indicates dark corrected, F indicates + * flat corrected. + */ + CALSTAT(HduType.IMAGE, ValueType.REAL, "calibration state of the image"), + + /** + * type of color sensor Bayer array or zero for monochrome. + */ + COLORTYP(HduType.IMAGE, ValueType.REAL, "type of color sensor"), + + /** + * initial display screen stretch mode. + */ + CSTRETCH(HduType.IMAGE, ValueType.REAL, "initial display screen stretch mode"), + + /** + * Total dark time of the observation. This is the total time during which dark current is collected by the + * detector. If the times in the extension are different the primary HDU gives one of the extension times. + */ + DARKTIME(HduType.IMAGE, ValueType.REAL, "dark current integration time"), + + /** + * Davis Instruments Weather Station ambient temperature in deg C + */ + DAVAMBT(HduType.IMAGE, ValueType.REAL, "ambient temperature"), + + /** + * Davis Instruments Weather Station barometric pressure in hPa + */ + DAVBAROM(HduType.IMAGE, ValueType.REAL, "barometric pressure"), + + /** + * Davis Instruments Weather Station dewpoint in deg C + */ + DAVDEW(HduType.IMAGE, ValueType.REAL, "dewpoint in deg C"), + + /** + * Davis Instruments Weather Station humidity in percent + */ + DAVHUM(HduType.IMAGE, ValueType.REAL, "humidity in percent"), + + /** + * Davis Instruments Weather Station solar radiation in W/m^2 + */ + DAVRAD(HduType.IMAGE, ValueType.REAL, "solar radiation"), + + /** + * Davis Instruments Weather Station accumulated rainfall in mm/day + */ + DAVRAIN(HduType.IMAGE, ValueType.REAL, "accumulated rainfall"), + + /** + * Davis Instruments Weather Station wind speed in km/h + */ + DAVWIND(HduType.IMAGE, ValueType.REAL, "wind speed"), + + /** + * Davis Instruments Weather Station wind direction in deg + */ + DAVWINDD(HduType.IMAGE, ValueType.REAL, "wind direction"), + + /** + * status of pier flip for German Equatorial mounts. + */ + FLIPSTAT(HduType.IMAGE, ValueType.REAL, "status of pier flip"), + + /** + * Focuser position in steps, if focuser is connected. + */ + FOCUSPOS(HduType.IMAGE, ValueType.REAL, "Focuser position in steps"), + + /** + * Focuser step size in microns, if available. + */ + FOCUSSZ(HduType.IMAGE, ValueType.REAL, "Focuser step size in microns"), + + /** + * Focuser temperature readout in degrees C, if available. + */ + FOCUSTEM(HduType.IMAGE, ValueType.REAL, "Focuser temperature readout"), + + /** + * format of file from which image was read. + */ + INPUTFMT(HduType.IMAGE, ValueType.REAL, "format of file"), + + /** + * ISO camera setting, if camera uses ISO speeds. + */ + ISOSPEED(HduType.IMAGE, ValueType.REAL, "ISO camera setting"), + + /** + * records the geocentric Julian Day of the start of exposure. + */ + JD(HduType.IMAGE, ValueType.REAL, "geocentric Julian Day"), + + /** + * records the geocentric Julian Day of the start of exposure. + */ + JD_GEO(HduType.IMAGE, ValueType.REAL, "geocentric Julian Da"), + + /** + * records the Heliocentric Julian Date at the exposure midpoint. + */ + JD_HELIO(HduType.IMAGE, ValueType.REAL, "Heliocentric Julian Date"), + + /** + * records the Heliocentric Julian Date at the exposure midpoint. + */ + JD_HELIO2("JD-HELIO", HduType.IMAGE, ValueType.REAL, "Heliocentric Julian Date"), + + /** + * UT of midpoint of exposure. + */ + MIDPOINT(HduType.IMAGE, ValueType.REAL, "midpoint of exposure"), + + /** + * user-entered information; free-form notes. + */ + NOTES(HduType.IMAGE, ValueType.REAL, "free-form note"), + + /** + * nominal altitude of center of image + */ + OBJCTALT(HduType.IMAGE, ValueType.REAL, "altitude of center of image"), + + /** + * nominal azimuth of center of image + */ + OBJCTAZ(HduType.IMAGE, ValueType.REAL, "nominal azimuth of center of image"), + + /** + * nominal hour angle of center of image + */ + OBJCTHA(HduType.IMAGE, ValueType.REAL, "nominal hour angle of center of image"), + + /** + * indicates side-of-pier status when connected to a German Equatorial mount. + */ + PIERSIDE(HduType.IMAGE, ValueType.REAL, "side-of-pier status"), + + /** + * records the selected Readout Mode (if any) for the camera. + */ + READOUTM(HduType.IMAGE, ValueType.REAL, "Readout Mode for the camera"), + + /** + * Rotator angle in degrees, if focal plane rotator is connected. + */ + ROTATANG(HduType.IMAGE, ValueType.REAL, "Rotator angle in degrees"), + + /** + * indicates tile position within a mosaic. + */ + TILEXY(HduType.IMAGE, ValueType.REAL, "tile position within a mosaic"), + + /** + * X offset of Bayer array on imaging sensor. + */ + XBAYROFF(HduType.IMAGE, ValueType.REAL, "X offset of Bayer array"), + + /** + * Y offset of Bayer array on imaging sensor. + */ + YBAYROFF(HduType.IMAGE, ValueType.REAL, "Y offset of Bayer array"), + + // NOAO. https://github.com/nom-tam-fits/nom-tam-fits/blob/master/src/main/java/nom/tam/fits/header/extra/NOAOExt.java + ACTFREQ(HduType.PRIMARY, ValueType.NONE, ""), ACTHWV(HduType.PRIMARY, ValueType.STRING, ""), @@ -1240,12 +2172,6 @@ enum class NOAOExt : FitsHeader { */ CUNIT2(HduType.EXTENSION, ValueType.STRING, "Coordinate reference unit"), - /** - * Total dark time of the observation. This is the total time during which dark current is collected by the - * detector. If the times in the extension are different the primary HDU gives one of the extension times. - */ - DARKTIME(HduType.PRIMARY_EXTENSION, ValueType.REAL, "Dark time"), - /** * Mapping of the CCD section to image coordinates. */ @@ -3467,16 +4393,197 @@ enum class NOAOExt : FitsHeader { * Modified Julian date at the start of the exposure. The fractional part of the date is given to better than a * second of time. */ - MJD_OBS("MJD-OBS", HduType.PRIMARY_EXTENSION, ValueType.REAL, "MJD of exposure start"); + MJD_OBS("MJD-OBS", HduType.PRIMARY_EXTENSION, ValueType.REAL, "MJD of exposure start"), + + // SBIG. https://github.com/nom-tam-fits/nom-tam-fits/blob/master/src/main/java/nom/tam/fits/header/extra/SBFitsExt.java + + /** + * Aperture Area of the Telescope used in square millimeters. Note that we are specifying the area as well as the + * diameter because we want to be able to correct for any central obstruction. + */ + APTAREA(HduType.IMAGE, ValueType.REAL, "Aperture Area of the Telescope"), + + /** + * Aperture Diameter of the Telescope used in millimeters. + */ + APTDIA(HduType.IMAGE, ValueType.REAL, "Aperture Diameter of the Telescope"), + + /** + * Upon initial display of this image use this ADU level for the Black level. + */ + CBLACK(HduType.IMAGE, ValueType.INTEGER, "use this ADU level for the Black"), + + /** + * Temperature of CCD when exposure taken. + */ + CCD_TEMP("CCD-TEMP", HduType.IMAGE, ValueType.REAL, "Temperature of CCD"), + + /** + * Altitude in degrees of the center of the image in degrees. Format is the same as the OBJCTDEC keyword. + */ + CENTALT(HduType.IMAGE, ValueType.STRING, "Altitude of the center of the image"), + + /** + * Azimuth in degrees of the center of the image in degrees. Format is the same as the OBJCTDEC keyword. + */ + CENTAZ(HduType.IMAGE, ValueType.STRING, "Azimuth of the center of the image"), + + /** + * Upon initial display of this image use this ADU level as the White level. For the SBIG method of displaying + * images using Background and Range the following conversions would be used: Background = CBLACK Range = CWHITE - + * CBLACK. + */ + CWHITE(HduType.IMAGE, ValueType.INTEGER, "use this ADU level for the White"), + + /** + * Electronic gain in e-/ADU. + */ + EGAIN(HduType.IMAGE, ValueType.REAL, "Electronic gain in e-/ADU"), + /* + * Optional Keywords

The following Keywords are not defined in the FITS Standard but are defined in this + * Standard. They may or may not be included by AIP Software Packages adhering to this Standard. Any of these + * keywords read by an AIP Package must be preserved in files written.

+ */ + /** + * Focal Length of the Telescope used in millimeters. + */ + FOCALLEN(HduType.IMAGE, ValueType.REAL, "Focal Length of the Telescope"), + + /** + * This indicates the type of image and should be one of the following: Light Frame Dark Frame Bias Frame Flat + * Field. + */ + IMAGETYP(HduType.IMAGE, ValueType.STRING, "type of image"), + + /** + * This is the Declination of the center of the image in degrees. The format for this is ‘+25 12 34.111’ (SDD MM + * SS.SSS) using a space as the separator. For the sign, North is + and South is -. + */ + OBJCTDEC(HduType.IMAGE, ValueType.STRING, "Declination of the center of the image"), + + /** + * This is the Right Ascension of the center of the image in hours, minutes and secon ds. The format for this is ’12 + * 24 23.123’ (HH MM SS.SSS) using a space as the separator. + */ + OBJCTRA(HduType.IMAGE, ValueType.STRING, "Right Ascension of the center of the image"), + + /** + * Add this ADU count to each pixel value to get to a zero - based ADU. For example in SBIG images we add 100 ADU to + * each pixel to stop underflow at Zero ADU from noise. We would set PEDESTAL to - 100 in this case. + */ + PEDESTAL(HduType.IMAGE, ValueType.INTEGER, "ADU count to each pixel value to get to a zero"), + + /** + * This string indicates the version of this standard that the image was created to ie ‘SBFITSEXT Version 1.0’. + */ + SBSTDVER(HduType.IMAGE, ValueType.STRING, "version of this standard"), + + /** + * This is the setpoint of the cooling in degrees C. If it is not specified the setpoint is assumed to be the + */ + SET_TEMP("SET-TEMP", HduType.IMAGE, ValueType.REAL, "setpoint of the cooling in degrees C"), + + /** + * Latitude of the imaging location in degrees. Format is the same as the OBJCTDEC key word. + */ + SITELAT(HduType.IMAGE, ValueType.STRING, "Latitude of the imaging location"), + + /** + * Longitude of the imaging location in degrees. Format is the same as the OBJCTDEC keyword. + */ + SITELONG(HduType.IMAGE, ValueType.STRING, "Longitude of the imaging location"), + + /** + * Number of images combined to make this image as in Track and Accumulate or Co - Added images. + */ + SNAPSHOT(HduType.IMAGE, ValueType.INTEGER, "Number of images combined"), + + /** + * This indicates the name and version of the Software that initially created this file ie ‘SBIGs CCDOps Version + * 5.10’. + */ + SWCREATE(HduType.IMAGE, ValueType.STRING, "created version of the Software"), + + /** + * This indicates the name and version of the Software that modified this file ie ‘SBIGs CCDOps Version 5.10’ and + * the re can be multiple copies of this keyword. Only add this keyword if you actually modified the image and we + * suggest placing this above the HISTORY keywords corresponding to the modifications made to the image. + */ + SWMODIFY(HduType.IMAGE, ValueType.STRING, "modified version of the Software"), + + /** + * If the image was auto-guided this is the exposure time in seconds of the tracker used to acquire this image. If + * this keyword is not present then the image was unguided or hand guided. + */ + TRAKTIME(HduType.IMAGE, ValueType.REAL, "exposure time in seconds of the tracker"), + + /** + * Binning factor in width. + */ + XBINNING(HduType.IMAGE, ValueType.INTEGER, "Binning factor in width"), + + /** + * Sub frame X position of upper left pixel relative to whole frame in binned pixel units. + */ + XORGSUBF(HduType.IMAGE, ValueType.INTEGER, "Sub frame X position"), + + /** + * Pixel width in microns (after binning). + */ + XPIXSZ(HduType.IMAGE, ValueType.REAL, "Pixel width in microns"), + + /** + * Binning factor in height. + */ + YBINNING(HduType.IMAGE, ValueType.INTEGER, "Binning factor in height"), + + /** + * Sub frame Y position of upper left pixel relative to whole frame in binned pixel units. + */ + YORGSUBF(HduType.IMAGE, ValueType.INTEGER, "Sub frame Y position"), + + /** + * Pixel height in microns (after binning). + */ + YPIXSZ(HduType.IMAGE, ValueType.REAL, "Pixel height in microns"), + + // Non-Standard. https://github.com/nom-tam-fits/nom-tam-fits/blob/master/src/main/java/nom/tam/fits/header/NonStandard.java + + /** + * The HIERARCH keyword, when followed by spaces in columns 9 and 10 of the FITS card image, indicates that the ESO + * HIERARCH keyword convention should be used to interpret the name and value of the keyword. The HIERARCH keyword + * formally has no value because it is not followed by an equals sign in column 9. Under the HIERARCH convention the + * actual name of the keyword begins in column 11 of the card image and is terminated by the equal sign ('=') + * character. The name can contain any number of characters as long as it fits within columns 11 and 80 of the card + * image and also leaves enough space for the equal sign separator and the value field. The name can contain any + * printable ASCII text character, including spaces and lower-case characters, except for the equal sign character + * which serves as the terminator of the name field. Leading and trailing spaces in the name field are not + * significant, but embedded spaces within the name are significant. The value field follows the equals sign and + * must conform to the syntax for a free-format value field as defined in the FITS Standard. The value field may be + * null, in which case it contains only space characters, otherwise it may contain either a character string + * enclosed in single quotes, the logical constant T or F, an integer number, a floating point number, a complex + * integer number, or a complex floating point number. The value field may be followed by an optional comment + * string. The comment field must be separated from the value field by a slash character ('/'). It is recommended + * that the slash character be preceeded and followed by a space character. Example: "HIERARCH Filter Wheel = 12 / + * filter position". In this example the logical name of the keyword is 'Filter Wheel' and the value is 12. + */ + HIERARCH(HduType.ANY, ValueType.NONE, "denotes the HIERARCH keyword convention"), - private val header: FitsHeaderImpl + /** + * The presence of this keyword with a value = T in an extension key indicates that the keywords contained in the + * primary key (except the FITS Mandatory keywords, and any COMMENT, HISTORY or 'blank' keywords) are to be + * inherited, or logically included in that extension key. + */ + INHERIT(HduType.EXTENSION, ValueType.LOGICAL, "denotes the INHERIT keyword convention"); - constructor(key: String, hduType: HduType, valueType: ValueType, comment: String) { - header = FitsHeaderImpl(key, hduType, valueType, comment) + private val header: FitsHeaderKey + + constructor(name: String, hduType: HduType, valueType: ValueType, comment: String) { + header = FitsHeaderKeyItem(name, hduType, valueType, comment) } constructor(hduType: HduType, valueType: ValueType, comment: String) { - header = FitsHeaderImpl(name, hduType, valueType, comment) + header = FitsHeaderKeyItem(name, hduType, valueType, comment) } override val key @@ -3492,4 +4599,17 @@ enum class NOAOExt : FitsHeader { get() = header.valueType override fun n(vararg numbers: Int) = header.n(*numbers) + + companion object { + + @JvmStatic val NAXIS1 = NAXISn.n(1) + @JvmStatic val NAXIS2 = NAXISn.n(2) + @JvmStatic val NAXIS3 = NAXISn.n(3) + + @JvmStatic val CDELT1 = CDELTn.n(1) + @JvmStatic val CDELT2 = CDELTn.n(2) + + @JvmStatic val CROTA1 = CROTAn.n(1) + @JvmStatic val CROTA2 = CROTAn.n(2) + } } diff --git a/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsPath.kt b/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsPath.kt index 84d4d5704..765b4dedc 100644 --- a/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsPath.kt +++ b/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsPath.kt @@ -6,7 +6,7 @@ import java.io.Closeable import java.io.File import java.nio.file.Path -class FitsPath(path: Path) : Fits(), Closeable { +data class FitsPath(val path: Path) : Fits(), Closeable { private val source = path.seekableSource() private val sink = path.seekableSink() @@ -16,15 +16,11 @@ class FitsPath(path: Path) : Fits(), Closeable { constructor(path: String) : this(Path.of(path)) fun read() { - return read(source) + read(source) } - fun readHdu(): Hdu<*>? { - return readHdu(source) - } - - fun writeTo() { - writeTo(sink) + fun write() { + write(sink) } override fun close() { diff --git a/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsReader.kt b/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsReader.kt deleted file mode 100644 index 558d92df7..000000000 --- a/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsReader.kt +++ /dev/null @@ -1,8 +0,0 @@ -package nebulosa.fits - -import nebulosa.io.SeekableSource - -interface FitsReader { - - fun read(source: SeekableSource): Hdu<*>? -} diff --git a/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsWriter.kt b/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsWriter.kt deleted file mode 100644 index 347f10112..000000000 --- a/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsWriter.kt +++ /dev/null @@ -1,8 +0,0 @@ -package nebulosa.fits - -import okio.Sink - -interface FitsWriter { - - fun write(sink: Sink, hdu: Hdu<*>) -} diff --git a/nebulosa-fits/src/main/kotlin/nebulosa/fits/FloatImageData.kt b/nebulosa-fits/src/main/kotlin/nebulosa/fits/FloatImageData.kt deleted file mode 100644 index 0c62de7fc..000000000 --- a/nebulosa-fits/src/main/kotlin/nebulosa/fits/FloatImageData.kt +++ /dev/null @@ -1,43 +0,0 @@ -package nebulosa.fits - -import nebulosa.io.writeFloat -import okio.Buffer -import okio.Sink -import java.nio.ByteBuffer - -@Suppress("ArrayInDataClass") -data class FloatImageData( - override val width: Int, - override val height: Int, - @JvmField val data: FloatArray = FloatArray(width * height), -) : ImageData { - - override val bitpix = Bitpix.FLOAT - - override fun read(block: (ByteBuffer) -> Unit) { - val strideSizeInBytes = width * bitpix.byteSize - val stride = ByteBuffer.allocate(strideSizeInBytes) - - repeat(height) { - var offset = it * width - stride.clear() - repeat(width) { stride.putFloat(data[offset++]) } - stride.flip() - block(stride) - } - } - - override fun writeTo(sink: Sink): Long { - return Buffer().use { b -> - var byteCount = 0L - - repeat(height) { - var offset = it * width - repeat(width) { b.writeFloat(data[offset++]) } - byteCount += b.readAll(sink) - } - - byteCount - } - } -} diff --git a/nebulosa-fits/src/main/kotlin/nebulosa/fits/Hdu.kt b/nebulosa-fits/src/main/kotlin/nebulosa/fits/Hdu.kt deleted file mode 100644 index d5daeb787..000000000 --- a/nebulosa-fits/src/main/kotlin/nebulosa/fits/Hdu.kt +++ /dev/null @@ -1,41 +0,0 @@ -package nebulosa.fits - -import kotlin.math.max - -interface Hdu : FitsElement, Collection { - - val header: Header - - val data: Array - - override val size - get() = data.size - - override fun contains(element: T): Boolean { - return data.any { it === element } - } - - override fun containsAll(elements: Collection): Boolean { - return elements.all { it in this } - } - - override fun isEmpty(): Boolean { - return data.isEmpty() - } - - override fun iterator(): Iterator { - return data.iterator() - } - - companion object { - - const val BLOCK_SIZE = 2880 - - @JvmStatic - fun computeRemainingBytesToSkip(sizeInBytes: Long): Long { - val numberOfBlocks = (sizeInBytes / BLOCK_SIZE) + 1 - val remainingByteCount = (numberOfBlocks * BLOCK_SIZE) - sizeInBytes - return max(0L, remainingByteCount) - } - } -} diff --git a/nebulosa-fits/src/main/kotlin/nebulosa/fits/Header.kt b/nebulosa-fits/src/main/kotlin/nebulosa/fits/Header.kt deleted file mode 100644 index 0f5132f13..000000000 --- a/nebulosa-fits/src/main/kotlin/nebulosa/fits/Header.kt +++ /dev/null @@ -1,199 +0,0 @@ -package nebulosa.fits - -import nebulosa.io.SeekableSource -import nebulosa.io.source -import nebulosa.log.loggerFor -import okio.Buffer -import okio.Sink -import java.io.EOFException -import java.io.Serializable -import java.util.* - -open class Header internal constructor(@JvmField internal val cards: LinkedList) : - FitsElement, WritableHeader, ReadableHeader, Collection by cards, Serializable { - - constructor() : this(LinkedList()) - - constructor(cards: Collection) : this(LinkedList(cards)) - - constructor(header: Header) : this(LinkedList(header.cards)) - - open fun readOnly(): Header = ReadOnlyHeader(this) - - override fun clear() { - cards.clear() - } - - override fun read(source: SeekableSource) { - clear() - - var count = 0 - val buffer = Buffer() - - while (true) { - buffer.clear() - - if (source.read(buffer, 80L) != 80L) throw EOFException() - - val card = HeaderCard.from(buffer) - count++ - - if (cards.isEmpty()) { - require(isFirstCard(card.key)) { "Not a proper FITS header: ${card.key} at ${source.position - 80L} offset" } - } else if (card.isBlank) { - continue - } else if (card.key == Standard.END.key) { - break - } - - add(card) - } - - val skipBytes = Hdu.computeRemainingBytesToSkip(count * 80L) - if (skipBytes > 0L) source.skip(skipBytes) - - buffer.clear() - } - - override fun write(sink: Sink) { - val buffer = Buffer() - - for (card in cards) { - buffer.writeString(card.format().also { println(it) }, Charsets.US_ASCII) - } - - if (cards.last.key != "END") { - buffer.writeString(HeaderCard.END.format(), Charsets.US_ASCII) - } - - var remainingBytes = Hdu.computeRemainingBytesToSkip(buffer.size) - - while (remainingBytes-- > 0) { - buffer.writeByte(0) - } - - buffer.readAll(sink) - } - - override fun add(key: FitsHeader, value: Boolean): HeaderCard { - checkType(key, ValueType.LOGICAL) - return HeaderCard.create(key, value).also(::add) - } - - override fun add(key: String, value: Boolean, comment: String): HeaderCard { - return HeaderCard.create(key, value, comment).also(::add) - } - - override fun add(key: FitsHeader, value: Int): HeaderCard { - checkType(key, ValueType.INTEGER) - return HeaderCard.create(key, value).also(::add) - } - - override fun add(key: String, value: Int, comment: String): HeaderCard { - return HeaderCard.create(key, value, comment).also(::add) - } - - override fun add(key: FitsHeader, value: Double): HeaderCard { - checkType(key, ValueType.REAL) - return HeaderCard.create(key, value).also(::add) - } - - override fun add(key: String, value: Double, comment: String): HeaderCard { - return HeaderCard.create(key, value, comment).also(::add) - } - - override fun add(key: FitsHeader, value: String): HeaderCard { - checkType(key, ValueType.STRING) - return HeaderCard.create(key, value).also(::add) - } - - override fun add(key: String, value: String, comment: String): HeaderCard { - return HeaderCard.create(key, value, comment).also(::add) - } - - override fun add(card: HeaderCard) { - if (!card.isKeyValuePair) cards.add(card) - else { - val index = cards.indexOfFirst { it.key == card.key } - if (index >= 0) cards[index] = card - else cards.add(card) - } - } - - override fun delete(key: FitsHeader): Boolean { - return cards.removeIf { it.key == key.key } - } - - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (other !is Header) return false - - if (cards != other.cards) return false - - return true - } - - override fun hashCode(): Int { - return cards.hashCode() - } - - override fun toString(): String { - return "Header(cards=$cards)" - } - - companion object { - - @JvmStatic val EMPTY: Header = ReadOnlyHeader() - - const val DEFAULT_COMMENT_ALIGN = 30 - const val MIN_COMMENT_ALIGN = 20 - const val MAX_COMMENT_ALIGN = 70 - - @JvmStatic private val LOG = loggerFor
() - - var commentAlignPosition = DEFAULT_COMMENT_ALIGN - set(value) { - require(value in MIN_COMMENT_ALIGN..MAX_COMMENT_ALIGN) - field = value - } - - @JvmStatic - fun from(source: SeekableSource): Header { - val header = Header() - header.read(source) - return header - } - - @JvmStatic - fun from(source: String): Header { - return from(source.toByteArray()) - } - - @JvmStatic - fun from(source: ByteArray): Header { - return from(source.source()) - } - - @JvmStatic - fun checkType(key: FitsHeader, type: ValueType): Boolean { - if (key.valueType == type || key.valueType == ValueType.ANY) { - return true - } - if (key.valueType == ValueType.COMPLEX && (type == ValueType.REAL || type == ValueType.INTEGER)) { - return true - } - if (key.valueType == ValueType.REAL && type == ValueType.INTEGER) { - return true - } - - LOG.warn("[${key.key}] with unexpected value type. Expected $type, got ${key.valueType}") - - return false - } - - @JvmStatic - fun isFirstCard(key: String): Boolean { - return Standard.SIMPLE.key == key || Standard.XTENSION.key == key - } - } -} diff --git a/nebulosa-fits/src/main/kotlin/nebulosa/fits/HeaderCard.kt b/nebulosa-fits/src/main/kotlin/nebulosa/fits/HeaderCard.kt deleted file mode 100644 index 27d5e392f..000000000 --- a/nebulosa-fits/src/main/kotlin/nebulosa/fits/HeaderCard.kt +++ /dev/null @@ -1,242 +0,0 @@ -package nebulosa.fits - -import nebulosa.log.loggerFor -import okio.Buffer -import org.apache.commons.numbers.complex.Complex -import java.io.Serializable -import java.math.BigDecimal -import java.math.BigInteger -import kotlin.math.max - -data class HeaderCard( - override val key: String, override val value: String, - val comment: String, val type: Class<*>, -) : Serializable, Map.Entry { - - internal constructor(parsed: HeaderCardParser) : this( - parsed.key, parsed.value, parsed.comment, parsed.type - ) - - val isCommentStyle - get() = type === Nothing::class.java - - val isKeyValuePair - get() = !isCommentStyle && key.isNotEmpty() - - val isBooleanType - get() = BOOLEAN_TYPES.any { it === type } - - val isStringType - get() = type === String::class.javaObjectType - - val isDecimalType - get() = DECIMAL_TYPES.any { it === type } - || BigDecimal::class.java.isAssignableFrom(type) - - val isIntegerType - get() = INTEGET_TYPES.any { it === type } - - val isNumericType - get() = isDecimalType || isIntegerType - - val isBlank - get() = if (!isCommentStyle || key.isNotBlank()) false else comment.isBlank() - - val hasHierarchKey - get() = isHierarchKey(key) - - private fun getBooleanValue(defaultValue: Boolean): Boolean { - return if (value == "T") true else if (value == "F") false else defaultValue - } - - inline fun getValue(defaultValue: T): T { - return getValue(T::class.java, defaultValue) - } - - fun getValue(asType: Class, defaultValue: T): T { - return if (isStringType) { - asType.cast(value) - } else if (value.isBlank()) { - defaultValue - } else if (isBooleanType) { - asType.cast(getBooleanValue(defaultValue as Boolean)) - } else if (Complex::class.java.isAssignableFrom(asType)) { - asType.cast(Complex.parse(value.trim().uppercase().replace('D', 'E'))) - } else if (isNumericType) { - try { - val decimal = BigDecimal(value.uppercase().replace('D', 'E')) - - if (Byte::class.javaObjectType.isAssignableFrom(asType)) { - asType.cast(decimal.toByte()) - } else if (Short::class.javaObjectType.isAssignableFrom(asType)) { - asType.cast(decimal.toShort()) - } else if (Int::class.javaObjectType.isAssignableFrom(asType)) { - asType.cast(decimal.toInt()) - } else if (Long::class.javaObjectType.isAssignableFrom(asType)) { - asType.cast(decimal.toLong()) - } else if (Float::class.javaObjectType.isAssignableFrom(asType)) { - asType.cast(decimal.toFloat()) - } else if (Double::class.javaObjectType.isAssignableFrom(asType)) { - asType.cast(decimal.toDouble()) - } else if (BigInteger::class.javaObjectType.isAssignableFrom(asType)) { - asType.cast(decimal.toBigInteger()) - } else if (String::class.javaObjectType.isAssignableFrom(asType)) { - asType.cast(decimal.toString()) - } else if (Boolean::class.javaObjectType.isAssignableFrom(asType)) { - asType.cast(decimal.toBigInteger().compareTo(BigInteger.ZERO) != 0) - } else { - asType.cast(decimal) - } - } catch (e: NumberFormatException) { - LOG.error("failed to parse numeric value", e) - defaultValue - } - } else { - throw IllegalArgumentException("unsupported class $asType") - } - } - - fun format(): String { - return HeaderCardFormatter.format(this) - } - - companion object { - - @JvmStatic private val LOG = loggerFor() - - const val FITS_HEADER_CARD_SIZE = 80 - const val MAX_KEYWORD_LENGTH = 8 - const val STRING_QUOTES_LENGTH = 2 - const val MAX_VALUE_LENGTH = 70 - const val MAX_COMMENT_CARD_COMMENT_LENGTH = MAX_VALUE_LENGTH + 1 - const val MAX_STRING_VALUE_LENGTH = MAX_VALUE_LENGTH - 2 - const val MAX_LONG_STRING_VALUE_LENGTH = MAX_STRING_VALUE_LENGTH - 1 - const val MAX_LONG_STRING_VALUE_WITH_COMMENT_LENGTH = MAX_LONG_STRING_VALUE_LENGTH - 2 - const val MAX_HIERARCH_KEYWORD_LENGTH = FITS_HEADER_CARD_SIZE - 6 - const val MAX_LONG_STRING_CONTINUE_OVERHEAD = 3 - const val MIN_VALID_CHAR = 0x20.toChar() - const val MAX_VALID_CHAR = 0x7e.toChar() - const val HIERARCH_WITH_DOT = "HIERARCH." - - @JvmStatic val END = HeaderCard("END", "", "", Any::class.java) - - @JvmStatic private val BOOLEAN_TYPES = arrayOf( - Boolean::class.javaPrimitiveType!!, Boolean::class.javaObjectType, - ) - - @JvmStatic private val DECIMAL_TYPES = arrayOf( - Float::class.javaPrimitiveType!!, Double::class.javaPrimitiveType!!, - Float::class.javaObjectType, Double::class.javaObjectType, - ) - - @JvmStatic private val INTEGET_TYPES = arrayOf( - Byte::class.javaPrimitiveType!!, Short::class.javaPrimitiveType!!, - Int::class.javaPrimitiveType!!, Long::class.javaPrimitiveType!!, - Byte::class.javaObjectType, Short::class.javaObjectType, - Int::class.javaObjectType, Long::class.javaObjectType, - ) - - @JvmStatic - fun from(source: Buffer): HeaderCard { - return from(source.readString(80L, Charsets.US_ASCII)) - } - - @JvmStatic - fun from(source: CharSequence): HeaderCard { - return HeaderCard(HeaderCardParser(source)) - } - - @JvmStatic - fun create(header: FitsHeader, value: Boolean): HeaderCard { - return HeaderCard(header.key, if (value) "T" else "F", header.comment, Boolean::class.javaPrimitiveType!!) - } - - @JvmStatic - fun create(header: FitsHeader, value: Int): HeaderCard { - return HeaderCard(header.key, "$value", header.comment, Int::class.javaPrimitiveType!!) - } - - @JvmStatic - fun create(header: FitsHeader, value: Long): HeaderCard { - return HeaderCard(header.key, "$value", header.comment, Long::class.javaPrimitiveType!!) - } - - @JvmStatic - fun create(header: FitsHeader, value: Float): HeaderCard { - return HeaderCard(header.key, "$value", header.comment, Float::class.javaPrimitiveType!!) - } - - @JvmStatic - fun create(header: FitsHeader, value: Double): HeaderCard { - return HeaderCard(header.key, "$value", header.comment, Double::class.javaPrimitiveType!!) - } - - @JvmStatic - fun create(header: FitsHeader, value: String): HeaderCard { - return HeaderCard(header.key, value, header.comment, String::class.javaObjectType) - } - - @JvmStatic - fun create(key: String, value: Boolean, comment: String = ""): HeaderCard { - return HeaderCard(key, if (value) "T" else "F", comment, Boolean::class.javaPrimitiveType!!) - } - - @JvmStatic - fun create(key: String, value: Int, comment: String = ""): HeaderCard { - return HeaderCard(key, "$value", comment, Int::class.javaPrimitiveType!!) - } - - @JvmStatic - fun create(key: String, value: Long, comment: String = ""): HeaderCard { - return HeaderCard(key, "$value", comment, Long::class.javaPrimitiveType!!) - } - - @JvmStatic - fun create(key: String, value: Float, comment: String = ""): HeaderCard { - return HeaderCard(key, "$value", comment, Float::class.javaPrimitiveType!!) - } - - @JvmStatic - fun create(key: String, value: Double, comment: String = ""): HeaderCard { - return HeaderCard(key, "$value", comment, Double::class.javaPrimitiveType!!) - } - - @JvmStatic - fun create(key: String, value: String, comment: String = ""): HeaderCard { - return HeaderCard(key, value, comment, String::class.javaObjectType) - } - - @JvmStatic - internal fun isHierarchKey(key: String): Boolean { - return key.uppercase().startsWith(HIERARCH_WITH_DOT) - } - - @JvmStatic - fun isValidChar(c: Char): Boolean { - return c in MIN_VALID_CHAR..MAX_VALID_CHAR - } - - @JvmStatic - fun sanitize(input: CharSequence): String { - val data = CharArray(input.length) - - for (i in input.indices) { - val char = input[i] - data[i] = if (isValidChar(char)) char else '?' - } - - return data.concatToString() - } - - @JvmStatic - private fun spaceForValue(key: String): Int { - return if (key.length > MAX_KEYWORD_LENGTH) { - // HierarchFormater.extraSpaceRequired = 1 - FITS_HEADER_CARD_SIZE - (max(key.length, MAX_KEYWORD_LENGTH) + 1) - } else { - // DEFAULT_SKIP_BLANK_AFTER_ASSIGN = false, so AssignLength = 2. - FITS_HEADER_CARD_SIZE - (max(key.length, MAX_KEYWORD_LENGTH) + 2) - } - } - } -} diff --git a/nebulosa-fits/src/main/kotlin/nebulosa/fits/HierarchKeyFormatter.kt b/nebulosa-fits/src/main/kotlin/nebulosa/fits/HierarchKeyFormatter.kt index a74dee47f..76941adef 100644 --- a/nebulosa-fits/src/main/kotlin/nebulosa/fits/HierarchKeyFormatter.kt +++ b/nebulosa-fits/src/main/kotlin/nebulosa/fits/HierarchKeyFormatter.kt @@ -8,8 +8,5 @@ interface HierarchKeyFormatter { val isCaseSensitive: Boolean - companion object { - - @JvmStatic var INSTANCE: HierarchKeyFormatter = StandardHierarchKeyFormatter.DEFAULT - } + companion object : HierarchKeyFormatter by StandardHierarchKeyFormatter.DEFAULT } diff --git a/nebulosa-fits/src/main/kotlin/nebulosa/fits/ImageData.kt b/nebulosa-fits/src/main/kotlin/nebulosa/fits/ImageData.kt deleted file mode 100644 index 6e1aae545..000000000 --- a/nebulosa-fits/src/main/kotlin/nebulosa/fits/ImageData.kt +++ /dev/null @@ -1,17 +0,0 @@ -package nebulosa.fits - -import okio.Sink -import java.nio.ByteBuffer - -interface ImageData { - - val width: Int - - val height: Int - - val bitpix: Bitpix - - fun read(block: (ByteBuffer) -> Unit) - - fun writeTo(sink: Sink): Long -} diff --git a/nebulosa-fits/src/main/kotlin/nebulosa/fits/ImageHdu.kt b/nebulosa-fits/src/main/kotlin/nebulosa/fits/ImageHdu.kt deleted file mode 100644 index 43fd30a06..000000000 --- a/nebulosa-fits/src/main/kotlin/nebulosa/fits/ImageHdu.kt +++ /dev/null @@ -1,63 +0,0 @@ -package nebulosa.fits - -import nebulosa.io.SeekableSource -import okio.Buffer -import okio.Sink - -data class ImageHdu( - override var header: Header, - override var data: Array = emptyArray(), -) : Hdu { - - val width = header.width - val height = header.height - val bitpix = Bitpix.from(header) - - override fun read(source: SeekableSource) { - val imageSize = (width * height * bitpix.byteSize).toLong() - var position = source.position - - val n = header.getInt(Standard.NAXIS3, 1) - data = Array(n) { SeekableSourceImageData(source, position, width, height, bitpix).also { position += imageSize } } - - val skipBytes = Hdu.computeRemainingBytesToSkip(imageSize * size) - if (skipBytes > 0L) source.seek(position + skipBytes) - } - - override fun write(sink: Sink) { - header.write(sink) - - val byteCount = data.sumOf { it.writeTo(sink) } - var remainingBytes = Hdu.computeRemainingBytesToSkip(byteCount) - - if (remainingBytes > 0) { - Buffer().use { - while (remainingBytes-- > 0) it.writeByte(0) - it.readAll(sink) - it.close() - } - } - } - - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (other !is ImageHdu) return false - - if (header != other.header) return false - if (!data.contentDeepEquals(other.data)) return false - - return true - } - - override fun hashCode(): Int { - var result = header.hashCode() - result = 31 * result + data.contentDeepHashCode() - return result - } - - companion object { - - @JvmStatic - fun isValid(header: Header) = header.getBoolean(Standard.SIMPLE) || header.getStringOrNull(Standard.XTENSION) == "IMAGE" - } -} diff --git a/nebulosa-fits/src/main/kotlin/nebulosa/fits/MaxImDLExt.kt b/nebulosa-fits/src/main/kotlin/nebulosa/fits/MaxImDLExt.kt deleted file mode 100644 index 073e439cc..000000000 --- a/nebulosa-fits/src/main/kotlin/nebulosa/fits/MaxImDLExt.kt +++ /dev/null @@ -1,242 +0,0 @@ -package nebulosa.fits - -/** - * The Fits extension as defined by Maxim DL.Extension keywords that may be added or read by MaxIm DL, depending on the - * current equipment and software configuration. - */ -enum class MaxImDLExt : FitsHeader { - /** - * if present the image has a valid Bayer color pattern. - */ - BAYERPAT(ValueType.REAL, "image Bayer color pattern"), - - /** - * Boltwood Cloud Sensor ambient temperature in degrees C. - */ - BOLTAMBT(ValueType.REAL, "ambient temperature in degrees C"), - - /** - * Boltwood Cloud Sensor cloud condition. - */ - BOLTCLOU(ValueType.REAL, "Boltwood Cloud Sensor cloud condition."), - - /** - * Boltwood Cloud Sensor daylight level. - */ - BOLTDAY(ValueType.REAL, "Boltwood Cloud Sensor daylight level."), - - /** - * Boltwood Cloud Sensor dewpoint in degrees C. - */ - BOLTDEW(ValueType.REAL, "Boltwood Cloud Sensor dewpoint in degrees C."), - - /** - * Boltwood Cloud Sensor humidity in percent. - */ - BOLTHUM(ValueType.REAL, "Boltwood Cloud Sensor humidity in percent."), - - /** - * Boltwood Cloud Sensor rain condition. - */ - BOLTRAIN(ValueType.REAL, "Boltwood Cloud Sensor rain condition."), - - /** - * Boltwood Cloud Sensor sky minus ambient temperature in degrees C. - */ - BOLTSKYT(ValueType.REAL, "Boltwood Cloud Sensor sky minus ambient temperature in degrees C."), - - /** - * Boltwood Cloud Sensor wind speed in km/h. - */ - BOLTWIND(ValueType.REAL, "Boltwood Cloud Sensor wind speed in km/h."), - - /** - * indicates calibration state of the image; B indicates bias corrected, D indicates dark corrected, F indicates - * flat corrected. - */ - CALSTAT(ValueType.REAL, "calibration state of the image"), - - /** - * type of color sensor Bayer array or zero for monochrome. - */ - COLORTYP(ValueType.REAL, "type of color sensor"), - - /** - * initial display screen stretch mode. - */ - CSTRETCH(ValueType.REAL, "initial display screen stretch mode"), - - /** - * dark current integration time, if recorded. May be longer than exposure time. - */ - DARKTIME(ValueType.REAL, "dark current integration time"), - - /** - * Davis Instruments Weather Station ambient temperature in deg C - */ - DAVAMBT(ValueType.REAL, "ambient temperature"), - - /** - * Davis Instruments Weather Station barometric pressure in hPa - */ - DAVBAROM(ValueType.REAL, "barometric pressure"), - - /** - * Davis Instruments Weather Station dewpoint in deg C - */ - DAVDEW(ValueType.REAL, "dewpoint in deg C"), - - /** - * Davis Instruments Weather Station humidity in percent - */ - DAVHUM(ValueType.REAL, "humidity in percent"), - - /** - * Davis Instruments Weather Station solar radiation in W/m^2 - */ - DAVRAD(ValueType.REAL, "solar radiation"), - - /** - * Davis Instruments Weather Station accumulated rainfall in mm/day - */ - DAVRAIN(ValueType.REAL, "accumulated rainfall"), - - /** - * Davis Instruments Weather Station wind speed in km/h - */ - DAVWIND(ValueType.REAL, "wind speed"), - - /** - * Davis Instruments Weather Station wind direction in deg - */ - DAVWINDD(ValueType.REAL, "wind direction"), - - /** - * status of pier flip for German Equatorial mounts. - */ - FLIPSTAT(ValueType.REAL, "status of pier flip"), - - /** - * Focuser position in steps, if focuser is connected. - */ - FOCUSPOS(ValueType.REAL, "Focuser position in steps"), - - /** - * Focuser step size in microns, if available. - */ - FOCUSSZ(ValueType.REAL, "Focuser step size in microns"), - - /** - * Focuser temperature readout in degrees C, if available. - */ - FOCUSTEM(ValueType.REAL, "Focuser temperature readout"), - - /** - * format of file from which image was read. - */ - INPUTFMT(ValueType.REAL, "format of file"), - - /** - * ISO camera setting, if camera uses ISO speeds. - */ - ISOSPEED(ValueType.REAL, "ISO camera setting"), - - /** - * records the geocentric Julian Day of the start of exposure. - */ - JD(ValueType.REAL, "geocentric Julian Day"), - - /** - * records the geocentric Julian Day of the start of exposure. - */ - JD_GEO(ValueType.REAL, "geocentric Julian Da"), - - /** - * records the Heliocentric Julian Date at the exposure midpoint. - */ - JD_HELIO(ValueType.REAL, "Heliocentric Julian Date"), - - /** - * records the Heliocentric Julian Date at the exposure midpoint. - */ - JD_HELIO2("JD-HELIO", ValueType.REAL, "Heliocentric Julian Date"), - - /** - * UT of midpoint of exposure. - */ - MIDPOINT(ValueType.REAL, "midpoint of exposure"), - - /** - * user-entered information; free-form notes. - */ - NOTES(ValueType.REAL, "free-form note"), - - /** - * nominal altitude of center of image - */ - OBJCTALT(ValueType.REAL, "altitude of center of image"), - - /** - * nominal azimuth of center of image - */ - OBJCTAZ(ValueType.REAL, "nominal azimuth of center of image"), - - /** - * nominal hour angle of center of image - */ - OBJCTHA(ValueType.REAL, "nominal hour angle of center of image"), - - /** - * indicates side-of-pier status when connected to a German Equatorial mount. - */ - PIERSIDE(ValueType.REAL, "side-of-pier status"), - - /** - * records the selected Readout Mode (if any) for the camera. - */ - READOUTM(ValueType.REAL, "Readout Mode for the camera"), - - /** - * Rotator angle in degrees, if focal plane rotator is connected. - */ - ROTATANG(ValueType.REAL, "Rotator angle in degrees"), - - /** - * indicates tile position within a mosaic. - */ - TILEXY(ValueType.REAL, "tile position within a mosaic"), - - /** - * X offset of Bayer array on imaging sensor. - */ - XBAYROFF(ValueType.REAL, "X offset of Bayer array"), - - /** - * Y offset of Bayer array on imaging sensor. - */ - YBAYROFF(ValueType.REAL, "Y offset of Bayer array"); - - private val header: FitsHeaderImpl - - constructor(key: String, valueType: ValueType, comment: String) { - header = FitsHeaderImpl(key, hduType, valueType, comment) - } - - constructor(valueType: ValueType, comment: String) { - header = FitsHeaderImpl(name, hduType, valueType, comment) - } - - override val key - get() = header.key - - override val comment - get() = header.comment - - override val hduType - get() = HduType.IMAGE - - override val valueType - get() = header.valueType - - override fun n(vararg numbers: Int) = header.n(*numbers) -} diff --git a/nebulosa-fits/src/main/kotlin/nebulosa/fits/NonStandard.kt b/nebulosa-fits/src/main/kotlin/nebulosa/fits/NonStandard.kt deleted file mode 100644 index bf3310be3..000000000 --- a/nebulosa-fits/src/main/kotlin/nebulosa/fits/NonStandard.kt +++ /dev/null @@ -1,46 +0,0 @@ -package nebulosa.fits - -enum class NonStandard(hduType: HduType, valueType: ValueType, comment: String) : FitsHeader { - /** - * The HIERARCH keyword, when followed by spaces in columns 9 and 10 of the FITS card image, indicates that the ESO - * HIERARCH keyword convention should be used to interpret the name and value of the keyword. The HIERARCH keyword - * formally has no value because it is not followed by an equals sign in column 9. Under the HIERARCH convention the - * actual name of the keyword begins in column 11 of the card image and is terminated by the equal sign ('=') - * character. The name can contain any number of characters as long as it fits within columns 11 and 80 of the card - * image and also leaves enough space for the equal sign separator and the value field. The name can contain any - * printable ASCII text character, including spaces and lower-case characters, except for the equal sign character - * which serves as the terminator of the name field. Leading and trailing spaces in the name field are not - * significant, but embedded spaces within the name are significant. The value field follows the equals sign and - * must conform to the syntax for a free-format value field as defined in the FITS Standard. The value field may be - * null, in which case it contains only space characters, otherwise it may contain either a character string - * enclosed in single quotes, the logical constant T or F, an integer number, a floating point number, a complex - * integer number, or a complex floating point number. The value field may be followed by an optional comment - * string. The comment field must be separated from the value field by a slash character ('/'). It is recommended - * that the slash character be preceeded and followed by a space character. Example: "HIERARCH Filter Wheel = 12 / - * filter position". In this example the logical name of the keyword is 'Filter Wheel' and the value is 12. - */ - HIERARCH(HduType.ANY, ValueType.NONE, "denotes the HIERARCH keyword convention"), - - /** - * The presence of this keyword with a value = T in an extension key indicates that the keywords contained in the - * primary key (except the FITS Mandatory keywords, and any COMMENT, HISTORY or 'blank' keywords) are to be - * inherited, or logically included in that extension key. - */ - INHERIT(HduType.EXTENSION, ValueType.LOGICAL, "denotes the INHERIT keyword convention"); - - private val header = FitsHeaderImpl(name, hduType, valueType, comment) - - override val key - get() = header.key - - override val comment - get() = header.comment - - override val hduType - get() = header.hduType - - override val valueType - get() = header.valueType - - override fun n(vararg numbers: Int) = this -} diff --git a/nebulosa-fits/src/main/kotlin/nebulosa/fits/ReadOnlyHeader.kt b/nebulosa-fits/src/main/kotlin/nebulosa/fits/ReadOnlyHeader.kt deleted file mode 100644 index 522b2e17e..000000000 --- a/nebulosa-fits/src/main/kotlin/nebulosa/fits/ReadOnlyHeader.kt +++ /dev/null @@ -1,31 +0,0 @@ -package nebulosa.fits - -import nebulosa.io.SeekableSource -import java.util.* - -open class ReadOnlyHeader : Header { - - constructor() : super(LinkedList()) - - constructor(cards: Collection) : super(LinkedList(cards)) - - constructor(header: Header) : super(LinkedList(header.cards)) - - override fun read(source: SeekableSource) = throw UnsupportedOperationException("Header is read-only") - - override fun clear() = throw UnsupportedOperationException("Header is read-only") - - override fun add(key: FitsHeader, value: Boolean) = throw UnsupportedOperationException("Header is read-only") - - override fun add(key: FitsHeader, value: Int) = throw UnsupportedOperationException("Header is read-only") - - override fun add(key: FitsHeader, value: Double) = throw UnsupportedOperationException("Header is read-only") - - override fun add(key: FitsHeader, value: String) = throw UnsupportedOperationException("Header is read-only") - - override fun add(card: HeaderCard) = throw UnsupportedOperationException("Header is read-only") - - override fun delete(key: FitsHeader) = throw UnsupportedOperationException("Header is read-only") - - override fun readOnly() = this -} diff --git a/nebulosa-fits/src/main/kotlin/nebulosa/fits/SBFitsExt.kt b/nebulosa-fits/src/main/kotlin/nebulosa/fits/SBFitsExt.kt deleted file mode 100644 index 77efeee74..000000000 --- a/nebulosa-fits/src/main/kotlin/nebulosa/fits/SBFitsExt.kt +++ /dev/null @@ -1,195 +0,0 @@ -package nebulosa.fits - -/** - * A Set of FITS Standard Extensions for Amateur Astronomical Processing Software Packages published by SBIG. - */ -enum class SBFitsExt : FitsHeader { - /** - * Aperture Area of the Telescope used in square millimeters. Note that we are specifying the area as well as the - * diameter because we want to be able to correct for any central obstruction. - */ - APTAREA(ValueType.REAL, "Aperture Area of the Telescope"), - - /** - * Aperture Diameter of the Telescope used in millimeters. - */ - APTDIA(ValueType.REAL, "Aperture Diameter of the Telescope"), - - /** - * Upon initial display of this image use this ADU level for the Black level. - */ - CBLACK(ValueType.INTEGER, "use this ADU level for the Black"), - - /** - * Temperature of CCD when exposure taken. - */ - CCD_TEMP("CCD-TEMP", ValueType.REAL, "Temperature of CCD"), - - /** - * Altitude in degrees of the center of the image in degrees. Format is the same as the OBJCTDEC keyword. - */ - CENTALT(ValueType.STRING, "Altitude of the center of the image"), - - /** - * Azimuth in degrees of the center of the image in degrees. Format is the same as the OBJCTDEC keyword. - */ - CENTAZ(ValueType.STRING, "Azimuth of the center of the image"), - - /** - * Upon initial display of this image use this ADU level as the White level. For the SBIG method of displaying - * images using Background and Range the following conversions would be used: Background = CBLACK Range = CWHITE - - * CBLACK. - */ - CWHITE(ValueType.INTEGER, "use this ADU level for the White"), - - /** - * Total dark time of the observation. This is the total time during which dark current is collected by the - * detector. If the times in the extension are different the primary HDU gives one of the extension times. - *

- * units = UNITTIME - *

- *

- * default value = EXPTIME - *

- *

- * index = none - *

- */ - DARKTIME(ValueType.REAL, "Dark time"), - - /** - * Electronic gain in e-/ADU. - */ - EGAIN(ValueType.REAL, "Electronic gain in e-/ADU"), - /* - * Optional Keywords

The following Keywords are not defined in the FITS Standard but are defined in this - * Standard. They may or may not be included by AIP Software Packages adhering to this Standard. Any of these - * keywords read by an AIP Package must be preserved in files written.

- */ - /** - * Focal Length of the Telescope used in millimeters. - */ - FOCALLEN(ValueType.REAL, "Focal Length of the Telescope"), - - /** - * This indicates the type of image and should be one of the following: Light Frame Dark Frame Bias Frame Flat - * Field. - */ - IMAGETYP(ValueType.STRING, "type of image"), - - /** - * This is the Declination of the center of the image in degrees. The format for this is ‘+25 12 34.111’ (SDD MM - * SS.SSS) using a space as the separator. For the sign, North is + and South is -. - */ - OBJCTDEC(ValueType.STRING, "Declination of the center of the image"), - - /** - * This is the Right Ascension of the center of the image in hours, minutes and secon ds. The format for this is ’12 - * 24 23.123’ (HH MM SS.SSS) using a space as the separator. - */ - OBJCTRA(ValueType.STRING, "Right Ascension of the center of the image"), - - /** - * Add this ADU count to each pixel value to get to a zero - based ADU. For example in SBIG images we add 100 ADU to - * each pixel to stop underflow at Zero ADU from noise. We would set PEDESTAL to - 100 in this case. - */ - PEDESTAL(ValueType.INTEGER, "ADU count to each pixel value to get to a zero"), - - /** - * This string indicates the version of this standard that the image was created to ie ‘SBFITSEXT Version 1.0’. - */ - SBSTDVER(ValueType.STRING, "version of this standard"), - - /** - * This is the setpoint of the cooling in degrees C. If it is not specified the setpoint is assumed to be the - */ - SET_TEMP("SET-TEMP", ValueType.REAL, "setpoint of the cooling in degrees C"), - - /** - * Latitude of the imaging location in degrees. Format is the same as the OBJCTDEC key word. - */ - SITELAT(ValueType.STRING, "Latitude of the imaging location"), - - /** - * Longitude of the imaging location in degrees. Format is the same as the OBJCTDEC keyword. - */ - SITELONG(ValueType.STRING, "Longitude of the imaging location"), - - /** - * Number of images combined to make this image as in Track and Accumulate or Co - Added images. - */ - SNAPSHOT(ValueType.INTEGER, "Number of images combined"), - - /** - * This indicates the name and version of the Software that initially created this file ie ‘SBIGs CCDOps Version - * 5.10’. - */ - SWCREATE(ValueType.STRING, "created version of the Software"), - - /** - * This indicates the name and version of the Software that modified this file ie ‘SBIGs CCDOps Version 5.10’ and - * the re can be multiple copies of this keyword. Only add this keyword if you actually modified the image and we - * suggest placing this above the HISTORY keywords corresponding to the modifications made to the image. - */ - SWMODIFY(ValueType.STRING, "modified version of the Software"), - - /** - * If the image was auto-guided this is the exposure time in seconds of the tracker used to acquire this image. If - * this keyword is not present then the image was unguided or hand guided. - */ - TRAKTIME(ValueType.REAL, "exposure time in seconds of the tracker"), - - /** - * Binning factor in width. - */ - XBINNING(ValueType.INTEGER, "Binning factor in width"), - - /** - * Sub frame X position of upper left pixel relative to whole frame in binned pixel units. - */ - XORGSUBF(ValueType.INTEGER, "Sub frame X position"), - - /** - * Pixel width in microns (after binning). - */ - XPIXSZ(ValueType.REAL, "Pixel width in microns"), - - /** - * Binning factor in height. - */ - YBINNING(ValueType.INTEGER, "Binning factor in height"), - - /** - * Sub frame Y position of upper left pixel relative to whole frame in binned pixel units. - */ - YORGSUBF(ValueType.INTEGER, "Sub frame Y position"), - - /** - * Pixel height in microns (after binning). - */ - YPIXSZ(ValueType.REAL, "Pixel height in microns"); - - private val header: FitsHeaderImpl - - constructor(key: String, valueType: ValueType, comment: String) { - header = FitsHeaderImpl(key, hduType, valueType, comment) - } - - constructor(valueType: ValueType, comment: String) { - header = FitsHeaderImpl(name, hduType, valueType, comment) - } - - override val key - get() = header.key - - override val comment - get() = header.comment - - override val hduType - get() = HduType.IMAGE - - override val valueType - get() = header.valueType - - override fun n(vararg numbers: Int) = header.n(*numbers) -} diff --git a/nebulosa-fits/src/main/kotlin/nebulosa/fits/SeekableSourceImageData.kt b/nebulosa-fits/src/main/kotlin/nebulosa/fits/SeekableSourceImageData.kt index 85f0ca77e..4a7fc10ae 100644 --- a/nebulosa-fits/src/main/kotlin/nebulosa/fits/SeekableSourceImageData.kt +++ b/nebulosa-fits/src/main/kotlin/nebulosa/fits/SeekableSourceImageData.kt @@ -1,56 +1,127 @@ package nebulosa.fits +import nebulosa.fits.FitsFormat.readPixel +import nebulosa.image.format.ImageChannel +import nebulosa.image.format.ImageData import nebulosa.io.SeekableSource -import nebulosa.io.sink -import nebulosa.io.transferFully import okio.Buffer import okio.Sink -import java.nio.ByteBuffer +import kotlin.math.min -data class SeekableSourceImageData( +@Suppress("NOTHING_TO_INLINE") +internal data class SeekableSourceImageData( private val source: SeekableSource, private val position: Long, override val width: Int, override val height: Int, - override val bitpix: Bitpix, + override val numberOfChannels: Int, + private val bitpix: Bitpix, ) : ImageData { - private val strideSizeInBytes = (width * bitpix.byteSize).toLong() + @JvmField internal val channelSizeInBytes = (numberOfPixels * bitpix.byteLength).toLong() + @JvmField internal val totalSizeInBytes = channelSizeInBytes * numberOfChannels - override fun read(block: (ByteBuffer) -> Unit) { - val data = ByteArray(strideSizeInBytes.toInt()) - val sink = data.sink() + override val red by lazy { readImage(ImageChannel.RED) } - synchronized(source) { - source.seek(position) + override val green by lazy { readImage(ImageChannel.GREEN) } - Buffer().use { b -> - repeat(height) { - sink.seek(0L) + override val blue by lazy { readImage(ImageChannel.BLUE) } - b.transferFully(source, sink, strideSizeInBytes) - block(ByteBuffer.wrap(data)) - b.clear() + @Synchronized + private fun readImage(channel: ImageChannel): FloatArray { + return if (numberOfChannels == 1) { + if (channel.index == 0) readGray() else red + } else { + when (channel) { + ImageChannel.GREEN -> readGreen() + ImageChannel.BLUE -> readBlue() + else -> readRed() + } + } + } + + private inline fun readGray(): FloatArray { + return readChannel(ImageChannel.GRAY) + } + + private inline fun readRed(): FloatArray { + return readChannel(ImageChannel.RED) + } + + private inline fun readGreen(): FloatArray { + return readChannel(ImageChannel.GREEN) + } + + private inline fun readBlue(): FloatArray { + return readChannel(ImageChannel.BLUE) + } + + private fun readChannel(channel: ImageChannel): FloatArray { + val data = FloatArray(numberOfPixels) + readChannelTo(channel, data) + return data + } + + override fun readChannelTo(channel: ImageChannel, output: FloatArray) { + // TODO: Read channel from source only if not initialized (remove lazy from red, green and blue). + + val startIndex = channelSizeInBytes * channel.index + source.seek(position + startIndex) + + var remainingPixels = output.size + var pos = 0 + + Buffer().use { buffer -> + while (remainingPixels > 0) { + var n = min(PIXEL_COUNT, remainingPixels) + val byteCount = n * bitpix.byteLength.toLong() + + val size = source.read(buffer, byteCount) + + if (size == 0L) break + + // require(size % bitpix.byteLength == 0L) + n = (size / bitpix.byteLength).toInt() + + repeat(n) { + output[pos++] = buffer.readPixel(bitpix) } + + remainingPixels -= n } } } - override fun writeTo(sink: Sink): Long { + internal fun writeTo(sink: Sink): Long { var byteCount = 0L - return synchronized(source) { - source.seek(position) + Buffer().use { buffer -> + for (i in 0 until numberOfChannels) { + val startIndex = channelSizeInBytes * i + var bytesToWrite = channelSizeInBytes + + source.seek(position + startIndex) + + while (bytesToWrite > 0L) { + val length = source.read(buffer, min(bytesToWrite, 1024L)) - Buffer().use { b -> - repeat(height) { - b.transferFully(source, sink, strideSizeInBytes) - b.clear() - byteCount += strideSizeInBytes + if (length > 0L) { + sink.write(buffer, length) + + buffer.clear() + + byteCount += length + bytesToWrite -= length + } } } - - byteCount } + + return byteCount + } + + companion object { + + const val PIXEL_COUNT = 64 } } diff --git a/nebulosa-fits/src/main/kotlin/nebulosa/fits/Standard.kt b/nebulosa-fits/src/main/kotlin/nebulosa/fits/Standard.kt deleted file mode 100644 index 2e64ab09b..000000000 --- a/nebulosa-fits/src/main/kotlin/nebulosa/fits/Standard.kt +++ /dev/null @@ -1,770 +0,0 @@ -package nebulosa.fits - -enum class Standard : FitsHeader { - /** - * The value field shall contain a character string identifying who compiled the information in the data associated - * with the key. This keyword is appropriate when the data originate in a published paper or are compiled from many - * sources. - */ - AUTHOR(HduType.ANY, ValueType.STRING, "author of the data"), - - /** - * The value field shall contain an integer. The absolute value is used in computing the sizes of data structures. - * It shall specify the number of bits that represent a data value. RANGE: -64,-32,8,16,32 - */ - BITPIX(HduType.ANY, ValueType.INTEGER, "bits per data value"), - - /** - * This keyword shall be used only in primary array headers or IMAGE extension headers with positive values of - * BITPIX (i.e., in arrays with integer data). Columns 1-8 contain the string, `BLANK ' (ASCII blanks in columns - * 6-8). The value field shall contain an integer that specifies the representation of array values whose physical - * values are undefined. - */ - BLANK(HduType.IMAGE, ValueType.INTEGER, "value used for undefined array elements"), - - /** - * Columns 1-8 contain ASCII blanks. This keyword has no associated value. Columns 9-80 may contain any ASCII text. - * Any number of card images with blank keyword fields may appear in a key. - */ - BLANKS(" ", HduType.ANY, ValueType.NONE, ""), - - /** - * This keyword may be used only in the primary key. It shall appear within the first 36 card images of the FITS - * file. (Note: This keyword thus cannot appear if NAXIS is greater than 31, or if NAXIS is greater than 30 and the - * EXTEND keyword is present.) Its presence with the required logical value of T advises that the physical block - * size of the FITS file on which it appears may be an integral multiple of the logical record length, and not - * necessarily equal to it. Physical block size and logical record length may be equal even if this keyword is - * present or unequal if it is absent. It is reserved primarily to prevent its use with other meanings. Since the - * issuance of version 1 of the standard, the BLOCKED keyword has been deprecated. - */ - @Deprecated("no blocksize other that 2880 may be used") - BLOCKED(HduType.PRIMARY, ValueType.LOGICAL, "is physical blocksize a multiple of 2880?"), - - /** - * This keyword shall be used, along with the BZERO keyword, when the array pixel values are not the true physical - * values, to transform the primary data array values to the true physical values they represent, using the - * equation: physical_value = BZERO + BSCALE * array_value. The value field shall contain a floating point number - * representing the coefficient of the linear term in the scaling equation, the ratio of physical value to array - * value at zero offset. The default value for this keyword is 1.0. - */ - BSCALE(HduType.IMAGE, ValueType.REAL, "linear factor in scaling equation"), - - /** - * The value field shall contain a character string, describing the physical units in which the quantities in the - * array, after application of BSCALE and BZERO, are expressed. The units of all FITS key keyword values, with the - * exception of measurements of angles, should conform with the recommendations in the IAU Style Manual. For angular - * measurements given as floating point values and specified with reserved keywords, degrees are the recommended - * units (with the units, if specified, given as 'deg'). - */ - BUNIT(HduType.IMAGE, ValueType.STRING, "physical units of the array values"), - - /** - * This keyword shall be used, along with the BSCALE keyword, when the array pixel values are not the true physical - * values, to transform the primary data array values to the true values using the equation: physical_value = BZERO - * + BSCALE * array_value. The value field shall contain a floating point number representing the physical value - * corresponding to an array value of zero. The default value for this keyword is 0.0. - */ - BZERO(HduType.IMAGE, ValueType.REAL, "zero point in scaling equation"), - - /** - * The value field shall contain a floating point number giving the partial derivative of the coordinate specified - * by the CTYPEn keywords with respect to the pixel index, evaluated at the reference point CRPIXn, in units of the - * coordinate specified by the CTYPEn keyword. These units must follow the prescriptions of section 5.3 of the FITS - * Standard. - */ - CDELTn(HduType.IMAGE, ValueType.REAL, "coordinate increment along axis"), - - /** - * This keyword shall have no associated value; columns 9-80 may contain any ASCII text. Any number of COMMENT card - * images may appear in a key. - */ - COMMENT(HduType.ANY, ValueType.NONE, ""), - - /** - * The CONTINUE keyword, when followed by spaces in columns 9 and 10 of the card image and a character string - * enclosed in single quotes starting in column 11 or higher, indicates that the quoted string should be treated as - * a continuation of the character string value in the previous key keyword. To conform to this convention, the - * character string value on the previous keyword must end with the ampersand character ('&'), but the ampersand - * is not part of the value string and should be deleted before concatenating the strings together. The character - * string value may be continued on any number of consecutive CONTINUE keywords, thus effectively allowing - * arbitrarily long strings to be written as keyword values. - */ - CONTINUE(HduType.ANY, ValueType.NONE, "denotes the CONTINUE long string keyword convention"), - - /** - * This keyword is used to indicate a rotation from a standard coordinate system described by the CTYPEn to a - * different coordinate system in which the values in the array are actually expressed. Rules for such rotations are - * not further specified in the Standard; the rotation should be explained in comments. The value field shall - * contain a floating point number giving the rotation angle in degrees between axis n and the direction implied by - * the coordinate system defined by CTYPEn. In unit degrees. - */ - CROTAn(HduType.IMAGE, ValueType.REAL, "coordinate system rotation angle"), - - /** - * The value field shall contain a floating point number, identifying the location of a reference point along axis - * n, in units of the axis index. This value is based upon a counter that runs from 1 to NAXISn with an increment of - * 1 per pixel. The reference point value need not be that for the center of a pixel nor lie within the actual data - * array. Use comments to indicate the location of the index point relative to the pixel. - */ - CRPIXn(HduType.IMAGE, ValueType.REAL, "coordinate system reference pixel"), - - /** - * The value field shall contain a floating point number, giving the value of the coordinate specified by the CTYPEn - * keyword at the reference point CRPIXn. Units must follow the prescriptions of section 5.3 of the FITS Standard. - */ - CRVALn(HduType.IMAGE, ValueType.REAL, "coordinate system value at reference pixel"), - - /** - * The value field shall contain a character string, giving the name of the coordinate represented by axis n. - */ - CTYPEn(HduType.IMAGE, ValueType.STRING, "name of the coordinate axis"), - - /** - * The value field shall always contain a floating point number, regardless of the value of BITPIX. This number - * shall give the maximum valid physical value represented by the array, exclusive of any special values. - */ - DATAMAX(HduType.IMAGE, ValueType.REAL, "maximum data value"), - - /** - * The value field shall always contain a floating point number, regardless of the value of BITPIX. This number - * shall give the minimum valid physical value represented by the array, exclusive of any special values. - */ - DATAMIN(HduType.IMAGE, ValueType.REAL, "minimum data value"), - - /** - * The date on which the HDU was created, in the format specified in the FITS Standard. The old date format was - * 'yy/mm/dd' and may be used only for dates from 1900 through 1999. the new Y2K compliant date format is - * 'yyyy-mm-dd' or 'yyyy-mm-ddTHH:MM:SS[.sss]'. - */ - DATE(HduType.ANY, ValueType.STRING, "date of file creation"), - - /** - * The date of the observation, in the format specified in the FITS Standard. The old date format was 'yy/mm/dd' and - * may be used only for dates from 1900 through 1999. The new Y2K compliant date format is 'yyyy-mm-dd' or - * 'yyyy-mm-ddTHH:MM:SS[.sss]'. - */ - DATE_OBS("DATE-OBS", HduType.ANY, ValueType.STRING, "date of the observation"), - - /** - * This keyword has no associated value. Columns 9-80 shall be filled with ASCII blanks. - */ - END(HduType.ANY, ValueType.NONE, ""), - - /** - * The value field shall contain a floating point number giving the equinox in years for the celestial coordinate - * system in which positions are expressed. Starting with Version 1, the Standard has deprecated the use of the - * EPOCH keyword and thus it shall not be used in FITS files created after the adoption of the standard; rather, the - * EQUINOX keyword shall be used. - */ - @Deprecated("use EQUINOX instead") - EPOCH(HduType.ANY, ValueType.REAL, "equinox of celestial coordinate system"), - - /** - * The value field shall contain a floating point number giving the equinox in years for the celestial coordinate - * system in which positions are expressed. - */ - EQUINOX(HduType.ANY, ValueType.REAL, "equinox of celestial coordinate system"), - - /** - * If the FITS file may contain extensions, a card image with the keyword EXTEND and the value field containing the - * logical value T must appear in the primary key immediately after the last NAXISn card image, or, if NAXIS=0, the - * NAXIS card image. The presence of this keyword with the value T in the primary key does not require that - * extensions be present. - */ - EXTEND(HduType.PRIMARY, ValueType.LOGICAL, "may the FITS file contain extensions?"), - - /** - * The value field shall contain an integer, specifying the level in a hierarchy of extension levels of the - * extension key containing it. The value shall be 1 for the highest level; levels with a higher value of this - * keyword shall be subordinate to levels with a lower value. If the EXTLEVEL keyword is absent, the file should be - * treated as if the value were 1. This keyword is used to describe an extension and should not appear in the - * primary key.RANGE: [1:] DEFAULT: 1 - */ - EXTLEVEL(HduType.EXTENSION, ValueType.INTEGER, "hierarchical level of the extension"), - - /** - * The value field shall contain a character string, to be used to distinguish among different extensions of the - * same type, i.e., with the same value of XTENSION, in a FITS file. This keyword is used to describe an extension - * and should not appear in the primary key. - */ - EXTNAME(HduType.EXTENSION, ValueType.STRING, "name of the extension"), - - /** - * The value field shall contain an integer, to be used to distinguish among different extensions in a FITS file - * with the same type and name, i.e., the same values for XTENSION and EXTNAME. The values need not start with 1 for - * the first extension with a particular value of EXTNAME and need not be in sequence for subsequent values. If the - * EXTVER keyword is absent, the file should be treated as if the value were 1. This keyword is used to describe an - * extension and should not appear in the primary key.RANGE: [1:] DEFAULT: 1 - */ - EXTVER(HduType.EXTENSION, ValueType.INTEGER, "version of the extension"), - - /** - * The value field shall contain an integer that shall be used in any way appropriate to define the data structure, - * consistent with Eq. 5.2 in the FITS Standard. This keyword originated for use in FITS Random Groups where it - * specifies the number of random groups present. In most other cases this keyword will have the value 1. - */ - GCOUNT(HduType.EXTENSION, ValueType.INTEGER, "group count"), - - /** - * The value field shall contain the logical constant T. The value T associated with this keyword implies that - * random groups records are present. - */ - GROUPS(HduType.GROUPS, ValueType.LOGICAL, "indicates random groups structure"), - - /** - * This keyword shall have no associated value; columns 9-80 may contain any ASCII text. The text should contain a - * history of steps and procedures associated with the processing of the associated data. Any number of HISTORY card - * images may appear in a key. - */ - HISTORY(HduType.ANY, ValueType.NONE, "processing history of the data"), - - /** - * The value field shall contain a character string identifying the instrument used to acquire the data associated - * with the key. - */ - INSTRUME(HduType.ANY, ValueType.STRING, "name of instrument"), - - /** - * The value field shall contain a non-negative integer no greater than 999, representing the number of axes in the - * associated data array. A value of zero signifies that no data follow the key in the HduType. In the context of FITS - * 'TABLE' or 'BINTABLE' extensions, the value of NAXIS is always 2.RANGE: [0:999] - */ - NAXIS(HduType.ANY, ValueType.INTEGER, "number of axes"), - - /** - * The value field of this indexed keyword shall contain a non-negative integer, representing the number of elements - * along axis n of a data array. The NAXISn must be present for all values n = 1,...,NAXIS, and for no other values - * of n. A value of zero for any of the NAXISn signifies that no data follow the key in the HduType. If NAXIS is equal - * to 0, there should not be any NAXISn keywords.RANGE: [0:] - */ - NAXISn(HduType.ANY, ValueType.INTEGER, "size of the n'th axis"), - - /** - * The value field shall contain a character string giving a name for the object observed. - */ - OBJECT(HduType.ANY, ValueType.STRING, "name of observed object"), - - /** - * The value field shall contain a character string identifying who acquired the data associated with the key. - */ - OBSERVER(HduType.ANY, ValueType.STRING, "observer who acquired the data"), - - /** - * The value field shall contain a character string identifying the organization or institution responsible for - * creating the FITS file. - */ - ORIGIN(HduType.ANY, ValueType.STRING, "organization responsible for the data"), - - /** - * The value field shall contain an integer that shall be used in any way appropriate to define the data structure, - * consistent with Eq. 5.2 in the FITS Standard. This keyword was originated for use with FITS Random Groups and - * represented the number of parameters preceding each group. It has since been used in 'BINTABLE' extensions to - * represent the size of the data heap following the main data table. In most other cases its value will be zero. - */ - PCOUNT(HduType.EXTENSION, ValueType.INTEGER, "parameter count"), - - /** - * This keyword is reserved for use within the FITS Random Groups structure. This keyword shall be used, along with - * the PZEROn keyword, when the nth FITS group parameter value is not the true physical value, to transform the - * group parameter value to the true physical values it represents, using the equation, physical_value = PZEROn + - * PSCALn * group_parameter_value. The value field shall contain a floating point number representing the - * coefficient of the linear term, the scaling factor between true values and group parameter values at zero offset. - * The default value for this keyword is 1.0. - */ - PSCALn(HduType.GROUPS, ValueType.REAL, "parameter scaling factor"), - - /** - * This keyword is reserved for use within the FITS Random Groups structure. The value field shall contain a - * character string giving the name of parameter n. If the PTYPEn keywords for more than one value of n have the - * same associated name in the value field, then the data value for the parameter of that name is to be obtained by - * adding the derived data values of the corresponding parameters. This rule provides a mechanism by which a random - * parameter may have more precision than the accompanying data array elements; for example, by summing two 16-bit - * values with the first scaled relative to the other such that the sum forms a number of up to 32-bit precision. - */ - PTYPEn(HduType.GROUPS, ValueType.STRING, "name of random groups parameter"), - - /** - * This keyword is reserved for use within the FITS Random Groups structure. This keyword shall be used, along with - * the PSCALn keyword, when the nth FITS group parameter value is not the true physical value, to transform the - * group parameter value to the physical value. The value field shall contain a floating point number, representing - * the true value corresponding to a group parameter value of zero. The default value for this keyword is 0.0. The - * transformation equation is as follows: physical_value = PZEROn + PSCALn * group_parameter_value.DEFAULT: 0.0 - */ - PZEROn(HduType.GROUPS, ValueType.REAL, "parameter scaling zero point"), - - /** - * Coordinate reference frame of major/minor axes.If absent the default value is 'FK5'. - */ - RADESYS(HduType.ANY, ValueType.STRING, "Coordinate reference frame of major/minor axes."), - - /** - * Coordinate reference frame of major/minor axes. use RADESYS instead. - */ - @Deprecated("use RADESYS instead.") - RADECSYS(HduType.ANY, ValueType.STRING, "Coordinate reference frame of major/minor axes."), - - /** - * The value field shall contain a character string citing a reference where the data associated with the key are - * published. - */ - REFERENC(HduType.ANY, ValueType.STRING, "bibliographic reference"), - - /** - * The SIMPLE keyword is required to be the first keyword in the primary key of all FITS files. The value field - * shall contain a logical constant with the value T if the file conforms to the standard. This keyword is mandatory - * for the primary key and is not permitted in extension headers. A value of F signifies that the file does not - * conform to this standard. - */ - SIMPLE(HduType.PRIMARY, ValueType.LOGICAL, "does file conform to the Standard?"), - - /** - * The value field of this indexed keyword shall contain an integer specifying the column in which field n starts in - * an ASCII TABLE extension. The first column of a row is numbered 1.RANGE: [1:] - */ - TBCOLn(HduType.ASCII_TABLE, ValueType.INTEGER, "begining column number"), - - /** - * The value field of this indexed keyword shall contain a character string describing how to interpret the contents - * of field n as a multidimensional array, providing the number of dimensions and the length along each axis. The - * form of the value is not further specified by the Standard. A proposed convention is described in Appendix B.2 of - * the FITS Standard in which the value string has the format '(l,m,n...)' where l, m, n,... are the dimensions of - * the array. - */ - TDIMn(HduType.BINTABLE, ValueType.STRING, "dimensionality of the array "), - - /** - * The value field of this indexed keyword shall contain a character string describing the format recommended for - * the display of the contents of field n. If the table value has been scaled, the physical value shall be - * displayed. All elements in a field shall be displayed with a single, repeated format. For purposes of display, - * each byte of bit (type X) and byte (type B) arrays is treated as an unsigned integer. Arrays of type A may be - * terminated with a zero byte. Only the format codes in Table 8.6, discussed in section 8.3.4 of the FITS Standard, - * are permitted for encoding. The format codes must be specified in upper case. If the Bw.m, Ow.m, and Zw.m formats - * are not readily available to the reader, the Iw.m display format may be used instead, and if the ENw.d and ESw.d - * formats are not available, Ew.d may be used. The meaning of this keyword is not defined for fields of type P in - * the Standard but may be defined in conventions using such fields. - */ - TDISPn(HduType.TABLE, ValueType.STRING, "display format"), - - /** - * The value field shall contain a character string identifying the telescope used to acquire the data associated - * with the key. - */ - TELESCOP(HduType.ANY, ValueType.STRING, "name of telescope"), - - /** - * The value field shall contain a non-negative integer representing the number of fields in each row of a 'TABLE' - * or 'BINTABLE' extension. The maximum permissible value is 999. RANGE: [0:999] - */ - TFIELDS(HduType.TABLE, ValueType.INTEGER, "number of columns in the table"), - - /** - * The value field of this indexed keyword shall contain a character string describing the format in which field n - * is encoded in a 'TABLE' or 'BINTABLE' extension. - */ - TFORMn(HduType.TABLE, ValueType.STRING, "column data format"), - - /** - * The value field of this keyword shall contain an integer providing the separation, in bytes, between the start of - * the main data table and the start of a supplemental data area called the heap. The default value shall be the - * product of the values of NAXIS1 and NAXIS2. This keyword shall not be used if the value of PCOUNT is zero. A - * proposed application of this keyword is presented in Appendix B.1 of the FITS Standard. - */ - THEAP(HduType.BINTABLE, ValueType.INTEGER, "offset to starting data heap address"), - - /** - * In ASCII 'TABLE' extensions, the value field for this indexed keyword shall contain the character string that - * represents an undefined value for field n. The string is implicitly blank filled to the width of the field. In - * binary 'BINTABLE' table extensions, the value field for this indexed keyword shall contain the integer that - * represents an undefined value for field n of data type B, I, or J. The keyword may not be used in 'BINTABLE' - * extensions if field n is of any other data type. - */ - TNULLn(HduType.TABLE, ValueType.STRING, "value used to indicate undefined table element"), - - /** - * This indexed keyword shall be used, along with the TZEROn keyword, when the quantity in field n does not - * represent a true physical quantity. The value field shall contain a floating point number representing the - * coefficient of the linear term in the equation, physical_value = TZEROn + TSCALn * field_value, which must be - * used to compute the true physical value of the field, or, in the case of the complex data types C and M, of the - * real part of the field with the imaginary part of the scaling factor set to zero. The default value for this - * keyword is 1.0. This keyword may not be used if the format of field n is A, L, or X.DEFAULT: 1.0 - */ - TSCALn(HduType.TABLE, ValueType.REAL, "linear data scaling factor"), - - /** - * The value field for this indexed keyword shall contain a character string, giving the name of field n. It is - * recommended that only letters, digits, and underscore (hexadecimal code 5F, ('_') be used in the name. String - * comparisons with the values of TTYPEn keywords should not be case sensitive. The use of identical names for - * different fields should be avoided. - */ - TTYPEn(HduType.TABLE, ValueType.STRING, "column name"), - - /** - * The value field shall contain a character string describing the physical units in which the quantity in field n, - * after any application of TSCALn and TZEROn, is expressed. The units of all FITS key keyword values, with the - * exception of measurements of angles, should conform with the recommendations in the IAU Style Manual. For angular - * measurements given as floating point values and specified with reserved keywords, degrees are the recommended - * units (with the units, if specified, given as 'deg'). - */ - TUNITn(HduType.TABLE, ValueType.STRING, "column units"), - - /** - * This indexed keyword shall be used, along with the TSCALn keyword, when the quantity in field n does not - * represent a true physical quantity. The value field shall contain a floating point number representing the true - * physical value corresponding to a value of zero in field n of the FITS file, or, in the case of the complex data - * types C and M, in the real part of the field, with the imaginary part set to zero. The default value for this - * keyword is 0.0. This keyword may not be used if the format of field n is A, L, or X.DEFAULT: 0.0 - */ - TZEROn(HduType.TABLE, ValueType.REAL, "column scaling zero point"), - - /** - * The value field shall contain a character string giving the name of the extension type. This keyword is mandatory - * for an extension key and must not appear in the primary key. For an extension that is not a standard extension, - * the type name must not be the same as that of a standard extension. - */ - XTENSION(HduType.EXTENSION, ValueType.STRING, "marks beginning of new HDU"), - - // FITS keywords that have been widely used within the astronomical community. - // These are the Keywords that describe the observation. - - /** - * The value field shall contain a floating point number giving the air mass during the observation by a ground - * based telescope. The value of the airmass is often approximated by the secant of the elevation angle and has a - * value of 1.0 at the zenith and increases towards the horizon. This value is assumed to correspond to the start of - * the observation unless another interpretation is clearly explained in the comment field. - */ - AIRMASS(HduType.ANY, ValueType.REAL, "air mass"), - - /** - * The value field gives the declination of the observation. It may be expressed either as a floating point number - * in units of decimal degrees, or as a character string in 'dd:mm:ss.sss' format where the decimal point and number - * of fractional digits are optional. The coordinate reference frame is given by the RADECSYS keyword, and the - * coordinate epoch is given by the EQUINOX keyword. Example: -47.25944 or '-47:15:34.00'. - */ - DEC(HduType.ANY, ValueType.STRING, "declination of the observed object"), - - /** - * The value field shall contain a floating point number giving the nominal declination of the pointing direction in - * units of decimal degrees. The coordinate reference frame is given by the RADECSYS keyword, and the coordinate - * epoch is given by the EQUINOX keyword. The precise definition of this keyword is instrument-specific, but - * typically the nominal direction corresponds to the direction to which the instrument was requested to point. The - * DEC_PNT keyword should be used to give the actual pointed direction. - */ - DEC_NOM(HduType.ANY, ValueType.REAL, "nominal declination of the observation"), - - /** - * The value field shall contain a floating point number giving the declination of the observed object in units of - * decimal degrees. The coordinate reference frame is given by the RADECSYS keyword, and the coordinate epoch is - * given by the EQUINOX keyword. - */ - DEC_OBJ(HduType.ANY, ValueType.REAL, "declination of the observed object"), - - /** - * The value field shall contain a floating point number giving the declination of the pointing direction in units - * of decimal degrees. The coordinate reference frame is given by the RADECSYS keyword, and the coordinate epoch is - * given by the EQUINOX keyword. The precise definition of this keyword is instrument-specific, but typically the - * pointed direction corresponds to the optical axis of the instrument. This keyword gives a mean value in cases - * where the pointing axis was not fixed during the entire observation. - */ - DEC_PNT(HduType.ANY, ValueType.REAL, "declination of the pointed direction of the instrument"), - - /** - * The value field shall contain a floating point number giving the declination of the space craft (or telescope - * platform) X axis during the observation in decimal degrees. The coordinate reference frame is given by the - * RADECSYS keyword, and the coordinate epoch is given by the EQUINOX keyword. This keyword gives a mean value in - * cases where the axis was not fixed during the entire observation. - */ - DEC_SCX(HduType.ANY, ValueType.REAL, "declination of the X spacecraft axis"), - - /** - * The value field shall contain a floating point number giving the declination of the space craft (or telescope - * platform) Z axis during the observation in decimal degrees. The coordinate reference frame is given by the - * RADECSYS keyword, and the coordinate epoch is given by the EQUINOX keyword. This keyword gives a mean value in - * cases where the axis was not fixed during the entire observation. - */ - DEC_SCZ(HduType.ANY, ValueType.REAL, "declination of the Z spacecraft axis"), - - /** - * The value field shall contain a floating point number giving the geographic latitude from which the observation - * was made in units of degrees. - */ - LATITUDE(HduType.ANY, ValueType.REAL, "geographic latitude of the observation"), - - /** - * The value field shall contain a floating point number giving the angle between the direction of the observation - * (e.g., the optical axis of the telescope or the position of the target) and the moon, measured in degrees. - */ - MOONANGL(HduType.ANY, ValueType.REAL, "angle between the observation and the moon"), - - /** - * The value field shall contain a character string giving a name for the observed object that conforms to the IAU - * astronomical object naming conventions. The value of this keyword is more strictly constrained than for the - * standard OBJECT keyword which in practice has often been used to record other ancillary information about the - * observation (e.g. filter, exposure time, weather conditions, etc.). - */ - OBJNAME(HduType.ANY, ValueType.STRING, "AU name of observed object"), - - /** - * The value field shall contain a character string which uniquely identifies the dataset contained in the FITS - * file. This is typically a sequence number that can contain a mixture of numerical and character values. Example: - * '10315-01-01-30A' - */ - OBS_ID(HduType.ANY, ValueType.STRING, "unique observation ID"), - - /** - * The value field shall contain a floating point number giving the position angle of the y axis of the detector - * projected on the sky, in degrees east of north. This keyword is synonymous with the CROTA2 WCS keyword. - */ - ORIENTAT(HduType.IMAGE, ValueType.REAL, "position angle of image y axis (deg. E of N)"), - - /** - * The value field shall contain a floating point number giving the position angle of the relevant aspect of - * telescope pointing axis and/or instrument on the sky in units of degrees east of north. It commonly applies to - * the orientation of a slit mask. - */ - PA_PNT(HduType.ANY, ValueType.REAL, "position angle of the pointing"), - - /** - * The value field gives the Right Ascension of the observation. It may be expressed either as a floating point - * number in units of decimal degrees, or as a character string in 'HH:MM:SS.sss' format where the decimal point and - * number of fractional digits are optional. The coordinate reference frame is given by the RADECSYS keyword, and - * the coordinate epoch is given by the EQUINOX keyword. Example: 180.6904 or '12:02:45.7'. - */ - RA(HduType.ANY, ValueType.STRING, "R.A. of the observation"), - - /** - * The value field shall contain a floating point number giving the nominal Right Ascension of the pointing - * direction in units of decimal degrees. The coordinate reference frame is given by the RADECSYS keyword, and the - * coordinate epoch is given by the EQUINOX keyword. The precise definition of this keyword is instrument-specific, - * but typically the nominal direction corresponds to the direction to which the instrument was requested to point. - * The RA_PNT keyword should be used to give the actual pointed direction. - */ - RA_NOM(HduType.ANY, ValueType.REAL, "nominal R.A. of the observation"), - - /** - * The value field shall contain a floating point number giving the Right Ascension of the observed object in units - * of decimal degrees. The coordinate reference frame is given by the RADECSYS keyword, and the coordinate epoch is - * given by the EQUINOX keyword. - */ - RA_OBJ(HduType.ANY, ValueType.REAL, "R.A. of the observed object"), - - /** - * The value field shall contain a floating point number giving the Right Ascension of the pointing direction in - * units of decimal degrees. The coordinate reference frame is given by the RADECSYS keyword, and the coordinate - * epoch is given by the EQUINOX keyword. The precise definition of this keyword is instrument-specific, but - * typically the pointed direction corresponds to the optical axis of the instrument. This keyword gives a mean - * value in cases where the pointing axis was not fixed during the entire observation. - */ - RA_PNT(HduType.ANY, ValueType.REAL, "R.A. of the pointed direction of the instrument"), - - /** - * The value field shall contain a floating point number giving the Right Ascension of the space craft (or telescope - * platform) X axis during the observation in decimal degrees. The coordinate reference frame is given by the - * RADECSYS keyword, and the coordinate epoch is given by the EQUINOX keyword. This keyword gives a mean value in - * cases where the axis was not fixed during the entire observation. - */ - RA_SCX(HduType.ANY, ValueType.REAL, "R.A. of the X spacecraft axis"), - - /** - * The value field shall contain a floating point number giving the Right Ascension of the space craft (or telescope - * platform) Y axis during the observation in decimal degrees. The coordinate reference frame is given by the - * RADECSYS keyword, and the coordinate epoch is given by the EQUINOX keyword. This keyword gives a mean value in - * cases where the axis was not fixed during the entire observation. - */ - RA_SCY(HduType.ANY, ValueType.REAL, "R.A. of the Y spacecraft axis"), - - /** - * The value field shall contain a floating point number giving the Right Ascension of the space craft (or telescope - * platform) Z axis during the observation in decimal degrees. The coordinate reference frame is given by the - * RADECSYS keyword, and the coordinate epoch is given by the EQUINOX keyword. This keyword gives a mean value in - * cases where the axis was not fixed during the entire observation. - */ - RA_SCZ(HduType.ANY, ValueType.REAL, "R.A. of the Z spacecraft axis"), - - /** - * The value field shall contain a floating point number giving the angle between the direction of the observation - * (e.g., the optical axis of the telescope or the position of the target) and the sun, measured in degrees. - */ - SUNANGLE(HduType.ANY, ValueType.REAL, "angle between the observation and the sun"), - - // FITS keywords that have been widely used within the astronomical community. - // These are the Keywords that describe the instrument that took the data. - - /** - * The value field shall contain a character string which gives the name of the instrumental aperture though which - * the observation was made. This keyword is typically used in instruments which have a selection of apertures which - * restrict the field of view of the detector. - */ - APERTURE(HduType.ANY, ValueType.STRING, "name of field of view aperture"), - - /** - * The value field shall contain a character string which identifies the configuration or mode of the pre-processing - * software that operated on the raw instrumental data to generate the data that is recorded in the FITS file. - * Example: some X-ray satellite data may be recorded in 'BRIGHT', 'FAINT', or 'FAST' data mode. - */ - DATAMODE(HduType.ANY, ValueType.STRING, "pre-processor data mode"), - - /** - * The value field shall contain a character string giving the name of the detector within the instrument that was - * used to make the observation. Example: 'CCD1' - */ - DETNAM(HduType.ANY, ValueType.STRING, "name of the detector used to make the observation"), - - /** - * The value field shall contain a character string which gives the name of the filter that was used during the - * observation to select or modify the radiation that was transmitted to the detector. More than 1 filter may be - * listed by using the FILTERn indexed keyword. The value 'none' or 'NONE' indicates that no filter was used. - */ - FILTER(HduType.ANY, ValueType.STRING, "name of filter used during the observation"), - - /** - * The value field of this indexed keyword shall contain a character string which gives the name of one of multiple - * filters that were used during the observation to select or modify the radiation that was transmitted to the - * detector. The value 'none' or 'NONE' indicates that no filter was used. - */ - FILTERn(HduType.ANY, ValueType.STRING, "name of filters used during the observation"), - - /** - * The value field shall contain a character string which gives the name of the defraction grating that was used - * during the observation. More than 1 grating may be listed by using the GRATINGn indexed keyword. The value 'none' - * or 'NONE' indicates that no grating was used. - */ - GRATING(HduType.ANY, ValueType.STRING, "name of the grating used during the observation."), - - /** - * The value field of this indexed keyword shall contain a character string which gives the name of one of multiple - * defraction gratings that were used during the observation. The value 'none' or 'NONE' indicates that no grating - * was used. - */ - GRATINGn(HduType.ANY, ValueType.STRING, "name of gratings used during the observation."), - - /** - * The value field shall contain a character string which gives the observing mode of the observation. This is used - * in cases where the instrument or detector can be configured to operate in different modes which significantly - * affect the resulting data. Examples: 'SLEW', 'RASTER', or 'POINTING' - */ - OBS_MODE(HduType.ANY, ValueType.STRING, "instrumental mode of the observation"), - - /** - * The value field shall contain an integer giving the data value at which the detector becomes saturated. This - * keyword value may differ from the maximum value implied by the BITPIX in that more bits may be allocated in the - * FITS pixel values than the detector can accommodate. - */ - SATURATE(HduType.ANY, ValueType.INTEGER, "Data value at which saturation occurs"), - - // FITS keywords that have been widely used within the astronomical community. - // These are the Keywords that describe the observation. - - /** - * The value field shall contain a character string that gives the date on which the observation ended. This keyword - * has the same format, and is used in conjunction with, the standard DATA-OBS keyword that gives the starting date - * of the observation. These 2 keywords may give either the calendar date using the 'yyyy-mm-dd' format, or may give - * the full date and time using the 'yyyy-mm-ddThh:mm:ss.sss' format. - */ - DATE_END("DATE-END", HduType.ANY, ValueType.STRING, "date of the end of observation"), - - /** - * The value field shall contain a floating point number giving the difference between the stop and start times of - * the observation in units of seconds. This keyword is synonymous with the TELAPSE keyword. - */ - ELAPTIME(HduType.ANY, ValueType.REAL, "elapsed time of the observation"), - - /** - * The value field shall contain a floating point number giving the exposure time of the observation in units of - * seconds. The exact definition of 'exposure time' is mission dependent and may, for example, include corrections - * for shutter open and close duration, detector dead time, vignetting, or other effects. This keyword is synonymous - * with the EXPTIME keyword. - */ - EXPOSURE(HduType.ANY, ValueType.REAL, "exposure time"), - - /** - * The value field shall contain a floating point number giving the exposure time of the observation in units of - * seconds. The exact definition of 'exposure time' is mission dependent and may, for example, include corrections - * for shutter open and close duration, detector dead time, vignetting, or other effects. This keyword is synonymous - * with the EXPOSURE keyword. - */ - EXPTIME(HduType.ANY, ValueType.REAL, "exposure time"), - - /** - * The value field shall contain a floating point number giving the total integrated exposure time in units of - * seconds corrected for detector 'dead time' effects which reduce the net efficiency of the detector. The ratio of - * LIVETIME/ONTIME gives the mean dead time correction during the observation, which lies in the range 0.0 to 1.0. - */ - LIVETIME(HduType.ANY, ValueType.REAL, "exposure time after deadtime correction"), - - /** - * The value field shall contain a floating point number giving the total integrated exposure time of the - * observation in units of seconds. ONTIME may be less than TELAPSE if there were intevals during the observation in - * which the target was not observed (e.g., the shutter was closed, or the detector power was turned off). - */ - ONTIME(HduType.ANY, ValueType.REAL, "integration time during the observation"), - - /** - * The value field shall contain a floating point number giving the difference between the stop and start times of - * the observation in units of seconds. This keyword is synonymous with the ELAPTIME keyword. - */ - TELAPSE(HduType.ANY, ValueType.REAL, "elapsed time of the observation"), - - /** - * The value field shall contain a character string that gives the time at which the observation ended. This keyword - * is used in conjunction with the DATE-END keyword to give the ending time of the observation; the DATE-END keyword - * gives the ending calendar date, with format 'yyyy-mm-dd', and TIME-END gives the time within that day using the - * format 'hh:mm:ss.sss...'. This keyword should not be used if the time is included directly as part of the - * DATE-END keyword value with the format 'yyyy-mm-ddThh:mm:ss.sss'. - */ - TIME_END("TIME-END", HduType.ANY, ValueType.STRING, "time at the end of the observation"), - - /** - * The value field shall contain a character string that gives the time at which the observation started. This - * keyword is used in conjunction with the standard DATE-OBS keyword to give the starting time of the observation; - * the DATE-OBS keyword gives the starting calendar date, with format 'yyyy-mm-dd', and TIME-OBS gives the time - * within that day using the format 'hh:mm:ss.sss...'. This keyword should not be used if the time is included - * directly as part of the DATE-OBS keyword value with the format 'yyyy-mm-ddThh:mm:ss.sss'. - */ - TIME_OBS("TIME-OBS", HduType.ANY, ValueType.STRING, "time at the start of the observation"); - - private val header: FitsHeader - - constructor(name: String, hduType: HduType, valueType: ValueType, comment: String) { - header = FitsHeaderImpl(name, hduType, valueType, comment) - } - - constructor(hduType: HduType, valueType: ValueType, comment: String) { - header = FitsHeaderImpl(name, hduType, valueType, comment) - } - - override val key - get() = header.key - - override val comment - get() = header.comment - - override val hduType - get() = header.hduType - - override val valueType - get() = header.valueType - - override fun n(vararg numbers: Int) = header.n(*numbers) - - companion object { - - @JvmStatic val NAXIS1 = NAXISn.n(1) - @JvmStatic val NAXIS2 = NAXISn.n(2) - @JvmStatic val NAXIS3 = NAXISn.n(3) - - @JvmStatic val CTYPE1 = CTYPEn.n(1) - @JvmStatic val CTYPE2 = CTYPEn.n(2) - - @JvmStatic val CRPIX1 = CRPIXn.n(1) - @JvmStatic val CRPIX2 = CRPIXn.n(2) - - @JvmStatic val CRVAL1 = CRVALn.n(1) - @JvmStatic val CRVAL2 = CRVALn.n(2) - - @JvmStatic val CDELT1 = CDELTn.n(1) - @JvmStatic val CDELT2 = CDELTn.n(2) - - @JvmStatic val CROTA1 = CROTAn.n(1) - @JvmStatic val CROTA2 = CROTAn.n(2) - } -} diff --git a/nebulosa-fits/src/main/kotlin/nebulosa/fits/StandardHierarchKeyFormatter.kt b/nebulosa-fits/src/main/kotlin/nebulosa/fits/StandardHierarchKeyFormatter.kt index c974daffb..6773ca294 100644 --- a/nebulosa-fits/src/main/kotlin/nebulosa/fits/StandardHierarchKeyFormatter.kt +++ b/nebulosa-fits/src/main/kotlin/nebulosa/fits/StandardHierarchKeyFormatter.kt @@ -1,6 +1,6 @@ package nebulosa.fits -class StandardHierarchKeyFormatter(override val isCaseSensitive: Boolean) : HierarchKeyFormatter { +data class StandardHierarchKeyFormatter(override val isCaseSensitive: Boolean) : HierarchKeyFormatter { override fun format(key: String): String { // cfitsio specifies a required space before the '=', so let's play nice with it. diff --git a/nebulosa-fits/src/main/kotlin/nebulosa/fits/WritableHeader.kt b/nebulosa-fits/src/main/kotlin/nebulosa/fits/WritableHeader.kt deleted file mode 100644 index 288459691..000000000 --- a/nebulosa-fits/src/main/kotlin/nebulosa/fits/WritableHeader.kt +++ /dev/null @@ -1,26 +0,0 @@ -package nebulosa.fits - -interface WritableHeader { - - fun clear() - - fun add(key: FitsHeader, value: Boolean): HeaderCard - - fun add(key: FitsHeader, value: Int): HeaderCard - - fun add(key: FitsHeader, value: Double): HeaderCard - - fun add(key: FitsHeader, value: String): HeaderCard - - fun add(key: String, value: Boolean, comment: String = ""): HeaderCard - - fun add(key: String, value: Int, comment: String = ""): HeaderCard - - fun add(key: String, value: Double, comment: String = ""): HeaderCard - - fun add(key: String, value: String, comment: String = ""): HeaderCard - - fun add(card: HeaderCard) - - fun delete(key: FitsHeader): Boolean -} diff --git a/nebulosa-fits/src/test/kotlin/FitsHeaderCardFormatterTest.kt b/nebulosa-fits/src/test/kotlin/FitsHeaderCardFormatterTest.kt new file mode 100644 index 000000000..54d099a1c --- /dev/null +++ b/nebulosa-fits/src/test/kotlin/FitsHeaderCardFormatterTest.kt @@ -0,0 +1,30 @@ +import io.kotest.core.spec.style.StringSpec +import io.kotest.matchers.shouldBe +import nebulosa.fits.FitsHeaderCard +import nebulosa.fits.FitsHeaderCardFormatter + +class FitsHeaderCardFormatterTest : StringSpec() { + + init { + "should format boolean value" { + val text = FitsHeaderCardFormatter.format(FitsHeaderCard.create("SIMPLE", true, "Boolean Type")) + text shouldBe "SIMPLE = T / Boolean Type " + } + "should format integer value" { + val text = FitsHeaderCardFormatter.format(FitsHeaderCard.create("NAXIS", 3, "Integer Type")) + text shouldBe "NAXIS = 3 / Integer Type " + } + "should format decimal value" { + val text = FitsHeaderCardFormatter.format(FitsHeaderCard.create("EXPOSURE", 150.0, "Decimal Type")) + text shouldBe "EXPOSURE= 150.0 / Decimal Type " + } + "should format text value" { + val text = FitsHeaderCardFormatter.format(FitsHeaderCard.create("INSTRUME", "Camera", "Text Type")) + text shouldBe "INSTRUME= 'Camera ' / Text Type " + } + "should format end key" { + val text = FitsHeaderCardFormatter.format(FitsHeaderCard.END) + text shouldBe "END " + } + } +} diff --git a/nebulosa-fits/src/test/kotlin/FitsHeaderCardParserTest.kt b/nebulosa-fits/src/test/kotlin/FitsHeaderCardParserTest.kt new file mode 100644 index 000000000..57ac0aabb --- /dev/null +++ b/nebulosa-fits/src/test/kotlin/FitsHeaderCardParserTest.kt @@ -0,0 +1,50 @@ +import io.kotest.core.spec.style.StringSpec +import io.kotest.matchers.shouldBe +import nebulosa.fits.FitsHeaderCardParser +import nebulosa.fits.FitsHeaderCardType + +class FitsHeaderCardParserTest : StringSpec() { + + init { + "should parse boolean value" { + val parsed = FitsHeaderCardParser("SIMPLE = T / Boolean Type ") + + parsed.key shouldBe "SIMPLE" + parsed.value shouldBe "T" + parsed.type shouldBe FitsHeaderCardType.BOOLEAN + parsed.comment shouldBe "Boolean Type" + } + "should parse integer value" { + val parsed = FitsHeaderCardParser("NAXIS = 3 / Integer Type ") + + parsed.key shouldBe "NAXIS" + parsed.value shouldBe "3" + parsed.type shouldBe FitsHeaderCardType.INTEGER + parsed.comment shouldBe "Integer Type" + } + "should parse decimal value" { + val parsed = FitsHeaderCardParser("EXPOSURE= 150.0 / Decimal Type ") + + parsed.key shouldBe "EXPOSURE" + parsed.value shouldBe "150.0" + parsed.type shouldBe FitsHeaderCardType.DECIMAL + parsed.comment shouldBe "Decimal Type" + } + "should parse text value" { + val parsed = FitsHeaderCardParser("INSTRUME= 'Camera ' / Text Type ") + + parsed.key shouldBe "INSTRUME" + parsed.value shouldBe "Camera" + parsed.type shouldBe FitsHeaderCardType.TEXT + parsed.comment shouldBe "Text Type" + } + "should parse end key" { + val parsed = FitsHeaderCardParser("END") + + parsed.key shouldBe "END" + parsed.value shouldBe "" + parsed.type shouldBe FitsHeaderCardType.NONE + parsed.comment shouldBe "" + } + } +} diff --git a/nebulosa-fits/src/test/kotlin/FitsReadTest.kt b/nebulosa-fits/src/test/kotlin/FitsReadTest.kt index 09e27bf95..ce38e8d58 100644 --- a/nebulosa-fits/src/test/kotlin/FitsReadTest.kt +++ b/nebulosa-fits/src/test/kotlin/FitsReadTest.kt @@ -1,81 +1,83 @@ import io.kotest.matchers.ints.shouldBeExactly import io.kotest.matchers.shouldBe import nebulosa.fits.Bitpix -import nebulosa.fits.ImageHdu -import nebulosa.test.FitsStringSpec +import nebulosa.fits.bitpix +import nebulosa.fits.fits +import nebulosa.image.format.ImageHdu +import nebulosa.test.AbstractFitsAndXisfTest -class FitsReadTest : FitsStringSpec() { +class FitsReadTest : AbstractFitsAndXisfTest() { init { "mono:8-bit" { - val hdu = NGC3344_MONO_8.filterIsInstance().first() + val hdu = NGC3344_MONO_8_FITS.fits().filterIsInstance().first() hdu.width shouldBeExactly 256 hdu.height shouldBeExactly 256 - hdu.size shouldBeExactly 1 - hdu.bitpix shouldBe Bitpix.BYTE + hdu.numberOfChannels shouldBeExactly 1 + hdu.header.bitpix shouldBe Bitpix.BYTE } "mono:16-bit" { - val hdu = NGC3344_MONO_16.filterIsInstance().first() + val hdu = NGC3344_MONO_16_FITS.fits().filterIsInstance().first() hdu.width shouldBeExactly 256 hdu.height shouldBeExactly 256 - hdu.size shouldBeExactly 1 - hdu.bitpix shouldBe Bitpix.SHORT + hdu.numberOfChannels shouldBeExactly 1 + hdu.header.bitpix shouldBe Bitpix.SHORT } "mono:32-bit" { - val hdu = NGC3344_MONO_32.filterIsInstance().first() + val hdu = NGC3344_MONO_32_FITS.fits().filterIsInstance().first() hdu.width shouldBeExactly 256 hdu.height shouldBeExactly 256 - hdu.size shouldBeExactly 1 - hdu.bitpix shouldBe Bitpix.INTEGER + hdu.numberOfChannels shouldBeExactly 1 + hdu.header.bitpix shouldBe Bitpix.INTEGER } "mono:32-bit floating-point" { - val hdu = NGC3344_MONO_F32.filterIsInstance().first() + val hdu = NGC3344_MONO_F32_FITS.fits().filterIsInstance().first() hdu.width shouldBeExactly 256 hdu.height shouldBeExactly 256 - hdu.size shouldBeExactly 1 - hdu.bitpix shouldBe Bitpix.FLOAT + hdu.numberOfChannels shouldBeExactly 1 + hdu.header.bitpix shouldBe Bitpix.FLOAT } "mono:64-bit floating-point" { - val hdu = NGC3344_MONO_F64.filterIsInstance().first() + val hdu = NGC3344_MONO_F64_FITS.fits().filterIsInstance().first() hdu.width shouldBeExactly 256 hdu.height shouldBeExactly 256 - hdu.size shouldBeExactly 1 - hdu.bitpix shouldBe Bitpix.DOUBLE + hdu.numberOfChannels shouldBeExactly 1 + hdu.header.bitpix shouldBe Bitpix.DOUBLE } "color:8-bit" { - val hdu = NGC3344_COLOR_8.filterIsInstance().first() + val hdu = NGC3344_COLOR_8_FITS.fits().filterIsInstance().first() hdu.width shouldBeExactly 256 hdu.height shouldBeExactly 256 - hdu.size shouldBeExactly 4 - hdu.bitpix shouldBe Bitpix.BYTE + hdu.numberOfChannels shouldBeExactly 4 + hdu.header.bitpix shouldBe Bitpix.BYTE } "color:16-bit" { - val hdu = NGC3344_COLOR_16.filterIsInstance().first() + val hdu = NGC3344_COLOR_16_FITS.fits().filterIsInstance().first() hdu.width shouldBeExactly 256 hdu.height shouldBeExactly 256 - hdu.size shouldBeExactly 4 - hdu.bitpix shouldBe Bitpix.SHORT + hdu.numberOfChannels shouldBeExactly 4 + hdu.header.bitpix shouldBe Bitpix.SHORT } "color:32-bit" { - val hdu = NGC3344_COLOR_32.filterIsInstance().first() + val hdu = NGC3344_COLOR_32_FITS.fits().filterIsInstance().first() hdu.width shouldBeExactly 256 hdu.height shouldBeExactly 256 - hdu.size shouldBeExactly 4 - hdu.bitpix shouldBe Bitpix.INTEGER + hdu.numberOfChannels shouldBeExactly 4 + hdu.header.bitpix shouldBe Bitpix.INTEGER } "color:32-bit floating-point" { - val hdu = NGC3344_COLOR_F32.filterIsInstance().first() + val hdu = NGC3344_COLOR_F32_FITS.fits().filterIsInstance().first() hdu.width shouldBeExactly 256 hdu.height shouldBeExactly 256 - hdu.size shouldBeExactly 4 - hdu.bitpix shouldBe Bitpix.FLOAT + hdu.numberOfChannels shouldBeExactly 4 + hdu.header.bitpix shouldBe Bitpix.FLOAT } "color:64-bit floating-point" { - val hdu = NGC3344_COLOR_F64.filterIsInstance().first() + val hdu = NGC3344_COLOR_F64_FITS.fits().filterIsInstance().first() hdu.width shouldBeExactly 256 hdu.height shouldBeExactly 256 - hdu.size shouldBeExactly 4 - hdu.bitpix shouldBe Bitpix.DOUBLE + hdu.numberOfChannels shouldBeExactly 4 + hdu.header.bitpix shouldBe Bitpix.DOUBLE } } } diff --git a/nebulosa-fits/src/test/kotlin/FitsWriteTest.kt b/nebulosa-fits/src/test/kotlin/FitsWriteTest.kt index 95b084b0c..f455b85c5 100644 --- a/nebulosa-fits/src/test/kotlin/FitsWriteTest.kt +++ b/nebulosa-fits/src/test/kotlin/FitsWriteTest.kt @@ -1,18 +1,19 @@ import io.kotest.matchers.shouldBe -import nebulosa.fits.ImageHdu +import nebulosa.fits.FitsFormat import nebulosa.fits.fits +import nebulosa.image.format.ImageHdu import nebulosa.io.sink import nebulosa.io.source -import nebulosa.test.FitsStringSpec +import nebulosa.test.AbstractFitsAndXisfTest import okio.ByteString.Companion.toByteString -class FitsWriteTest : FitsStringSpec() { +class FitsWriteTest : AbstractFitsAndXisfTest() { init { "mono" { - val hdu0 = NGC3344_MONO_8.filterIsInstance().first() + val hdu0 = NGC3344_MONO_8_FITS.fits().filterIsInstance().first() val data = ByteArray(69120) - hdu0.write(data.sink()) + FitsFormat.write(data.sink(), listOf(hdu0)) data.toByteString(2880, 66240).md5().hex() shouldBe "e1735e21c94dc49885fabc429406e573" val fits = data.source().use { it.fits() } diff --git a/nebulosa-fits/src/test/kotlin/ImageDataTest.kt b/nebulosa-fits/src/test/kotlin/ImageDataTest.kt deleted file mode 100644 index 77e75b901..000000000 --- a/nebulosa-fits/src/test/kotlin/ImageDataTest.kt +++ /dev/null @@ -1,63 +0,0 @@ -import io.kotest.core.spec.style.StringSpec -import io.kotest.matchers.floats.shouldBeExactly -import io.kotest.matchers.ints.shouldBeExactly -import nebulosa.fits.Bitpix -import nebulosa.fits.FloatImageData -import nebulosa.fits.SeekableSourceImageData -import nebulosa.io.sink -import nebulosa.io.source -import java.nio.ByteBuffer - -class ImageDataTest : StringSpec() { - - init { - "float:read" { - val input = FloatArray(100) { it.toFloat() } - val data = FloatImageData(10, 10, input) - - var i = 0 - - data.read { b -> - repeat(10) { b.getFloat() shouldBeExactly input[i++] } - } - - i shouldBeExactly 100 - } - "float:write" { - val input = FloatArray(100) { it.toFloat() } - val data = FloatImageData(10, 10, input) - val output = ByteArray(100 * 4) - - data.writeTo(output.sink()) - - val buffer = ByteBuffer.wrap(output) - - repeat(100) { - buffer.getFloat() shouldBeExactly input[it] - } - } - "seekable source:read" { - val input = ByteArray(100) { it.toByte() } - val data = SeekableSourceImageData(input.source(), 0L, 10, 10, Bitpix.BYTE) - - var i = 0 - - data.read { b -> - repeat(10) { b.get().toInt() shouldBeExactly input[i++].toInt() } - } - - i shouldBeExactly 100 - } - "seekable source:write" { - val input = ByteArray(100) { it.toByte() } - val data = SeekableSourceImageData(input.source(), 0L, 10, 10, Bitpix.BYTE) - val output = ByteArray(input.size) - - data.writeTo(output.sink()) - - repeat(output.size) { - output[it].toInt() shouldBeExactly input[it].toInt() - } - } - } -} diff --git a/nebulosa-guiding-internal/build.gradle.kts b/nebulosa-guiding-internal/build.gradle.kts index 903eaf776..e2464b95d 100644 --- a/nebulosa-guiding-internal/build.gradle.kts +++ b/nebulosa-guiding-internal/build.gradle.kts @@ -6,7 +6,7 @@ plugins { dependencies { api(project(":nebulosa-common")) api(project(":nebulosa-math")) - api(project(":nebulosa-imaging")) + api(project(":nebulosa-image")) api(project(":nebulosa-guiding")) implementation(project(":nebulosa-log")) testImplementation(project(":nebulosa-test")) diff --git a/nebulosa-guiding-internal/src/main/kotlin/nebulosa/guiding/internal/GuiderListener.kt b/nebulosa-guiding-internal/src/main/kotlin/nebulosa/guiding/internal/GuiderListener.kt index 2e57db51b..2a15333fa 100644 --- a/nebulosa-guiding-internal/src/main/kotlin/nebulosa/guiding/internal/GuiderListener.kt +++ b/nebulosa-guiding-internal/src/main/kotlin/nebulosa/guiding/internal/GuiderListener.kt @@ -1,7 +1,7 @@ package nebulosa.guiding.internal import nebulosa.guiding.GuideDirection -import nebulosa.imaging.Image +import nebulosa.image.Image interface GuiderListener { diff --git a/nebulosa-guiding-internal/src/main/kotlin/nebulosa/guiding/internal/InternalGuider.kt b/nebulosa-guiding-internal/src/main/kotlin/nebulosa/guiding/internal/InternalGuider.kt index 0c6316e79..6328418e1 100644 --- a/nebulosa-guiding-internal/src/main/kotlin/nebulosa/guiding/internal/InternalGuider.kt +++ b/nebulosa-guiding-internal/src/main/kotlin/nebulosa/guiding/internal/InternalGuider.kt @@ -1,6 +1,6 @@ package nebulosa.guiding.internal -import nebulosa.imaging.Image +import nebulosa.image.Image interface InternalGuider : Iterable { diff --git a/nebulosa-guiding-internal/src/main/kotlin/nebulosa/guiding/internal/MultiStarGuider.kt b/nebulosa-guiding-internal/src/main/kotlin/nebulosa/guiding/internal/MultiStarGuider.kt index 9ce1a0ecc..6462014ae 100644 --- a/nebulosa-guiding-internal/src/main/kotlin/nebulosa/guiding/internal/MultiStarGuider.kt +++ b/nebulosa-guiding-internal/src/main/kotlin/nebulosa/guiding/internal/MultiStarGuider.kt @@ -2,8 +2,8 @@ package nebulosa.guiding.internal import nebulosa.constants.PIOVERTWO import nebulosa.guiding.GuideDirection -import nebulosa.imaging.Image -import nebulosa.imaging.algorithms.transformation.convolution.Mean +import nebulosa.image.Image +import nebulosa.image.algorithms.transformation.convolution.Mean import nebulosa.log.loggerFor import nebulosa.math.cos import nebulosa.math.sin diff --git a/nebulosa-guiding-internal/src/main/kotlin/nebulosa/guiding/internal/Star.kt b/nebulosa-guiding-internal/src/main/kotlin/nebulosa/guiding/internal/Star.kt index a0f736c52..e24f0b2f6 100644 --- a/nebulosa-guiding-internal/src/main/kotlin/nebulosa/guiding/internal/Star.kt +++ b/nebulosa-guiding-internal/src/main/kotlin/nebulosa/guiding/internal/Star.kt @@ -1,7 +1,7 @@ package nebulosa.guiding.internal -import nebulosa.imaging.Image -import nebulosa.imaging.algorithms.computation.hfd.HFD +import nebulosa.image.Image +import nebulosa.image.algorithms.computation.hfd.HFD import kotlin.math.roundToInt /** diff --git a/nebulosa-hips2fits/build.gradle.kts b/nebulosa-hips2fits/build.gradle.kts index b4d5f2298..47b29a48e 100644 --- a/nebulosa-hips2fits/build.gradle.kts +++ b/nebulosa-hips2fits/build.gradle.kts @@ -6,7 +6,7 @@ plugins { dependencies { api(project(":nebulosa-math")) api(project(":nebulosa-retrofit")) - testImplementation(project(":nebulosa-imaging")) + testImplementation(project(":nebulosa-image")) testImplementation(project(":nebulosa-test")) } diff --git a/nebulosa-hips2fits/src/test/kotlin/Hips2FitsServiceTest.kt b/nebulosa-hips2fits/src/test/kotlin/Hips2FitsServiceTest.kt index 1f5adf9dc..ce093b062 100644 --- a/nebulosa-hips2fits/src/test/kotlin/Hips2FitsServiceTest.kt +++ b/nebulosa-hips2fits/src/test/kotlin/Hips2FitsServiceTest.kt @@ -1,3 +1,4 @@ +import io.kotest.core.annotation.EnabledIf import io.kotest.core.spec.style.StringSpec import io.kotest.matchers.collections.shouldHaveSize import io.kotest.matchers.collections.shouldNotBeEmpty @@ -6,10 +7,13 @@ import io.kotest.matchers.ints.shouldBeExactly import io.kotest.matchers.nulls.shouldNotBeNull import nebulosa.fits.* import nebulosa.hips2fits.Hips2FitsService +import nebulosa.image.format.ImageHdu import nebulosa.io.source import nebulosa.math.deg import nebulosa.math.toDegrees +import nebulosa.test.NonGitHubOnlyCondition +@EnabledIf(NonGitHubOnlyCondition::class) class Hips2FitsServiceTest : StringSpec() { init { diff --git a/nebulosa-image-format/build.gradle.kts b/nebulosa-image-format/build.gradle.kts new file mode 100644 index 000000000..f21b2894d --- /dev/null +++ b/nebulosa-image-format/build.gradle.kts @@ -0,0 +1,19 @@ +plugins { + kotlin("jvm") + id("maven-publish") +} + +dependencies { + api(project(":nebulosa-io")) + api(libs.apache.numbers.complex) + implementation(project(":nebulosa-log")) + testImplementation(project(":nebulosa-test")) +} + +publishing { + publications { + create("pluginMaven") { + from(components["java"]) + } + } +} diff --git a/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/AbstractHeader.kt b/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/AbstractHeader.kt new file mode 100644 index 000000000..3bf66aa24 --- /dev/null +++ b/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/AbstractHeader.kt @@ -0,0 +1,35 @@ +package nebulosa.image.format + +import java.io.Serializable +import java.util.* + +abstract class AbstractHeader protected constructor(@JvmField protected val cards: LinkedList) : + Header, Collection by cards, Serializable { + + constructor() : this(LinkedList()) + + constructor(cards: Collection) : this(LinkedList(cards)) + + abstract fun readOnly(): Header + + override fun clear() { + cards.clear() + } + + override fun delete(key: String): Boolean { + return cards.removeIf { it.key == key } + } + + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (other !is AbstractHeader) return false + + if (cards != other.cards) return false + + return true + } + + override fun hashCode() = cards.hashCode() + + override fun toString() = "${javaClass.simpleName}(cards=$cards)" +} diff --git a/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/BasicHdu.kt b/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/BasicHdu.kt new file mode 100644 index 000000000..c7031e544 --- /dev/null +++ b/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/BasicHdu.kt @@ -0,0 +1,3 @@ +package nebulosa.image.format + +data class BasicHdu(override val header: ReadableHeader, override val data: T) : Hdu diff --git a/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/BasicImageHdu.kt b/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/BasicImageHdu.kt new file mode 100644 index 000000000..995f641fd --- /dev/null +++ b/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/BasicImageHdu.kt @@ -0,0 +1,9 @@ +package nebulosa.image.format + +data class BasicImageHdu( + override val width: Int, + override val height: Int, + override val numberOfChannels: Int, + override val header: ReadableHeader, + override val data: ImageData, +) : ImageHdu diff --git a/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/FloatImageData.kt b/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/FloatImageData.kt new file mode 100644 index 000000000..cd30ac4e3 --- /dev/null +++ b/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/FloatImageData.kt @@ -0,0 +1,21 @@ +package nebulosa.image.format + +@Suppress("ArrayInDataClass") +data class FloatImageData( + override val width: Int, + override val height: Int, + override val numberOfChannels: Int = 1, + override val red: FloatArray = FloatArray(width * height), + override val green: FloatArray = if (numberOfChannels == 1) red else FloatArray(width * height), + override val blue: FloatArray = if (numberOfChannels == 1) red else FloatArray(width * height), +) : ImageData { + + override fun readChannelTo(channel: ImageChannel, output: FloatArray) { + when (channel) { + ImageChannel.GRAY, + ImageChannel.RED -> red.copyInto(output) + ImageChannel.GREEN -> green.copyInto(output) + ImageChannel.BLUE -> blue.copyInto(output) + } + } +} diff --git a/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/Hdu.kt b/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/Hdu.kt new file mode 100644 index 000000000..4507dd62b --- /dev/null +++ b/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/Hdu.kt @@ -0,0 +1,8 @@ +package nebulosa.image.format + +sealed interface Hdu { + + val header: ReadableHeader + + val data: T +} diff --git a/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/Header.kt b/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/Header.kt new file mode 100644 index 000000000..e8fd2a4f0 --- /dev/null +++ b/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/Header.kt @@ -0,0 +1,39 @@ +package nebulosa.image.format + +interface Header : ReadableHeader, WritableHeader, Cloneable { + + public override fun clone(): Header + + data object Empty : Header, Iterator { + + override fun clone() = this + + override fun contains(element: HeaderCard) = false + + override val size = 0 + + override fun containsAll(elements: Collection) = false + + override fun isEmpty() = true + + override fun iterator() = this + + override fun clear() = Unit + + override fun add(key: String, value: Boolean, comment: String) = Unit + + override fun add(key: String, value: Int, comment: String) = Unit + + override fun add(key: String, value: Double, comment: String) = Unit + + override fun add(key: String, value: String, comment: String) = Unit + + override fun add(card: HeaderCard) = Unit + + override fun delete(key: String) = false + + override fun hasNext() = false + + override fun next() = TODO("Unsupported operation") + } +} diff --git a/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/HeaderCard.kt b/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/HeaderCard.kt new file mode 100644 index 000000000..005ce5d53 --- /dev/null +++ b/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/HeaderCard.kt @@ -0,0 +1,31 @@ +package nebulosa.image.format + +interface HeaderCard : HeaderKey, HeaderValue, Map.Entry { + + val type: HeaderCardType + + val isCommentStyle: Boolean + + val isKeyValuePair: Boolean + + val isBooleanType: Boolean + + val isStringType: Boolean + + val isDecimalType: Boolean + + val isIntegerType: Boolean + + val isNumericType + get() = isDecimalType || isIntegerType + + val isBlank + get() = if (!isCommentStyle || key.isNotBlank()) false else comment.isBlank() + + companion object { + + inline fun HeaderCard.getValue(defaultValue: T): T { + return getValue(T::class.java, defaultValue) + } + } +} diff --git a/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/HeaderCardType.kt b/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/HeaderCardType.kt new file mode 100644 index 000000000..8bcf6c168 --- /dev/null +++ b/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/HeaderCardType.kt @@ -0,0 +1,6 @@ +package nebulosa.image.format + +interface HeaderCardType { + + val name: String +} diff --git a/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/HeaderKey.kt b/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/HeaderKey.kt new file mode 100644 index 000000000..842555ffe --- /dev/null +++ b/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/HeaderKey.kt @@ -0,0 +1,8 @@ +package nebulosa.image.format + +interface HeaderKey { + + val key: String + + val comment: String +} diff --git a/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/HeaderValue.kt b/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/HeaderValue.kt new file mode 100644 index 000000000..997bd211c --- /dev/null +++ b/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/HeaderValue.kt @@ -0,0 +1,60 @@ +package nebulosa.image.format + +import org.apache.commons.numbers.complex.Complex +import java.math.BigDecimal +import java.math.BigInteger + +interface HeaderValue { + + val value: String + + fun getBooleanValue(defaultValue: Boolean): Boolean { + return if (value == "T") true else if (value == "F") false else defaultValue + } + + fun getNumericValue(asType: Class, defaultValue: T): T { + return try { + val decimal = BigDecimal(value.uppercase().replace('D', 'E')) + + if (Byte::class.javaObjectType.isAssignableFrom(asType)) { + asType.cast(decimal.toByte()) + } else if (Short::class.javaObjectType.isAssignableFrom(asType)) { + asType.cast(decimal.toShort()) + } else if (Int::class.javaObjectType.isAssignableFrom(asType)) { + asType.cast(decimal.toInt()) + } else if (Long::class.javaObjectType.isAssignableFrom(asType)) { + asType.cast(decimal.toLong()) + } else if (Float::class.javaObjectType.isAssignableFrom(asType)) { + asType.cast(decimal.toFloat()) + } else if (Double::class.javaObjectType.isAssignableFrom(asType)) { + asType.cast(decimal.toDouble()) + } else if (BigInteger::class.javaObjectType.isAssignableFrom(asType)) { + asType.cast(decimal.toBigInteger()) + } else if (BigDecimal::class.javaObjectType.isAssignableFrom(asType)) { + asType.cast(decimal) + } else { + throw IllegalArgumentException("unsupported class $asType") + } + } catch (e: NumberFormatException) { + defaultValue + } + } + + fun getValue(asType: Class, defaultValue: T): T { + return if (Boolean::class.javaObjectType.isAssignableFrom(asType)) { + asType.cast(getBooleanValue(defaultValue as Boolean)) + } else if (Number::class.javaObjectType.isAssignableFrom(asType)) { + getNumericValue(asType, defaultValue) + } else if (String::class.javaObjectType.isAssignableFrom(asType)) { + asType.cast(value) + } else if (Complex::class.java.isAssignableFrom(asType)) { + asType.cast(Complex.parse(value.trim().uppercase().replace('D', 'E'))) + } else if (value.isBlank()) { + defaultValue + } else { + throw IllegalArgumentException("unsupported class $asType") + } + } + + fun formatted(): String +} diff --git a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/ImageChannel.kt b/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/ImageChannel.kt similarity index 51% rename from nebulosa-imaging/src/main/kotlin/nebulosa/imaging/ImageChannel.kt rename to nebulosa-image-format/src/main/kotlin/nebulosa/image/format/ImageChannel.kt index 1343276fe..c966c3aa2 100644 --- a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/ImageChannel.kt +++ b/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/ImageChannel.kt @@ -1,10 +1,10 @@ -package nebulosa.imaging +package nebulosa.image.format -enum class ImageChannel(@JvmField val offset: Int) { +enum class ImageChannel(@JvmField val index: Int) { + GRAY(0), RED(0), GREEN(1), - BLUE(2), - GRAY(0); + BLUE(2); companion object { diff --git a/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/ImageData.kt b/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/ImageData.kt new file mode 100644 index 000000000..ab83c43ca --- /dev/null +++ b/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/ImageData.kt @@ -0,0 +1,21 @@ +package nebulosa.image.format + +interface ImageData { + + val width: Int + + val height: Int + + val numberOfChannels: Int + + val numberOfPixels + get() = width * height + + val red: FloatArray + + val green: FloatArray + + val blue: FloatArray + + fun readChannelTo(channel: ImageChannel, output: FloatArray) +} diff --git a/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/ImageFormat.kt b/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/ImageFormat.kt new file mode 100644 index 000000000..d24b6db98 --- /dev/null +++ b/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/ImageFormat.kt @@ -0,0 +1,11 @@ +package nebulosa.image.format + +import nebulosa.io.SeekableSource +import okio.Sink + +interface ImageFormat { + + fun read(source: SeekableSource): List> + + fun write(sink: Sink, hdus: Iterable>) +} diff --git a/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/ImageHdu.kt b/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/ImageHdu.kt new file mode 100644 index 000000000..140125c46 --- /dev/null +++ b/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/ImageHdu.kt @@ -0,0 +1,13 @@ +package nebulosa.image.format + +interface ImageHdu : Hdu { + + val width: Int + + val height: Int + + val numberOfChannels: Int + + val isMono + get() = numberOfChannels == 1 +} diff --git a/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/ImageRepresentation.kt b/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/ImageRepresentation.kt new file mode 100644 index 000000000..67f8a0177 --- /dev/null +++ b/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/ImageRepresentation.kt @@ -0,0 +1,12 @@ +package nebulosa.image.format + +interface ImageRepresentation : MutableList>, ImageSource, ImageSink { + + fun addFirst(hdu: Hdu<*>) + + fun addLast(hdu: Hdu<*>) + + fun removeFirst(): Hdu<*> + + fun removeLast(): Hdu<*> +} diff --git a/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/ImageSink.kt b/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/ImageSink.kt new file mode 100644 index 000000000..a4c66941d --- /dev/null +++ b/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/ImageSink.kt @@ -0,0 +1,8 @@ +package nebulosa.image.format + +import okio.Sink + +interface ImageSink { + + fun write(sink: Sink) +} diff --git a/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/ImageSource.kt b/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/ImageSource.kt new file mode 100644 index 000000000..d2639348c --- /dev/null +++ b/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/ImageSource.kt @@ -0,0 +1,8 @@ +package nebulosa.image.format + +import nebulosa.io.SeekableSource + +interface ImageSource { + + fun read(source: SeekableSource) +} diff --git a/nebulosa-fits/src/main/kotlin/nebulosa/fits/ReadableHeader.kt b/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/ReadableHeader.kt similarity index 57% rename from nebulosa-fits/src/main/kotlin/nebulosa/fits/ReadableHeader.kt rename to nebulosa-image-format/src/main/kotlin/nebulosa/image/format/ReadableHeader.kt index 39c9774f1..19f9a19eb 100644 --- a/nebulosa-fits/src/main/kotlin/nebulosa/fits/ReadableHeader.kt +++ b/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/ReadableHeader.kt @@ -1,4 +1,4 @@ -package nebulosa.fits +package nebulosa.image.format interface ReadableHeader : Collection { @@ -6,115 +6,115 @@ interface ReadableHeader : Collection { return any { it.key == key } } - operator fun contains(key: FitsHeader): Boolean { + operator fun contains(key: HeaderKey): Boolean { return key.key in this } - fun getBoolean(key: String, defaultValue: Boolean = false): Boolean { + fun getBoolean(key: String, defaultValue: Boolean): Boolean { val card = firstOrNull { it.key == key } ?: return defaultValue - return card.getValue(defaultValue) + return card.getValue(Boolean::class.javaObjectType, defaultValue) } fun getBooleanOrNull(key: String): Boolean? { val card = firstOrNull { it.key == key } ?: return null - return card.getValue(null) - } - - fun getBoolean(key: FitsHeader, defaultValue: Boolean = false): Boolean { - return getBoolean(key.key, defaultValue) - } - - fun getBooleanOrNull(key: FitsHeader): Boolean? { - return getBooleanOrNull(key.key) + return card.getValue(Boolean::class.javaObjectType, null) } fun getInt(key: String, defaultValue: Int): Int { val card = firstOrNull { it.key == key } ?: return defaultValue - return card.getValue(defaultValue) + return card.getValue(Int::class.javaObjectType, defaultValue) } fun getIntOrNull(key: String): Int? { val card = firstOrNull { it.key == key } ?: return null - return card.getValue(null) + return card.getValue(Int::class.javaObjectType, null) } - fun getInt(key: FitsHeader, defaultValue: Int): Int { - return getInt(key.key, defaultValue) + fun getLong(key: String, defaultValue: Long): Long { + val card = firstOrNull { it.key == key } ?: return defaultValue + return card.getValue(Long::class.javaObjectType, defaultValue) } - fun getIntOrNull(key: FitsHeader): Int? { - return getIntOrNull(key.key) + fun getLongOrNull(key: String): Long? { + val card = firstOrNull { it.key == key } ?: return null + return card.getValue(Long::class.javaObjectType, null) } - fun getLong(key: String, defaultValue: Long): Long { + fun getFloat(key: String, defaultValue: Float): Float { val card = firstOrNull { it.key == key } ?: return defaultValue - return card.getValue(defaultValue) + return card.getValue(Float::class.javaObjectType, defaultValue) } - fun getLongOrNull(key: String): Long? { + fun getFloatOrNull(key: String): Float? { val card = firstOrNull { it.key == key } ?: return null - return card.getValue(null) + return card.getValue(Float::class.javaObjectType, null) } - fun getLong(key: FitsHeader, defaultValue: Long): Long { - return getLong(key.key, defaultValue) + fun getDouble(key: String, defaultValue: Double): Double { + val card = firstOrNull { it.key == key } ?: return defaultValue + return card.getValue(Double::class.javaObjectType, defaultValue) } - fun getLongOrNull(key: FitsHeader): Long? { - return getLongOrNull(key.key) + fun getDoubleOrNull(key: String): Double? { + val card = firstOrNull { it.key == key } ?: return null + return card.getValue(Double::class.javaObjectType, null) } - fun getFloat(key: String, defaultValue: Float): Float { + fun getString(key: String, defaultValue: String): String { val card = firstOrNull { it.key == key } ?: return defaultValue - return card.getValue(defaultValue) + return card.getValue(String::class.javaObjectType, defaultValue) } - fun getFloatOrNull(key: String): Float? { + fun getStringOrNull(key: String): String? { val card = firstOrNull { it.key == key } ?: return null - return card.getValue(null) + return card.getValue(String::class.javaObjectType, null) } - fun getFloat(key: FitsHeader, defaultValue: Float): Float { - return getFloat(key.key, defaultValue) + fun getBoolean(key: HeaderKey, defaultValue: Boolean = false): Boolean { + return getBoolean(key.key, defaultValue) } - fun getFloatOrNull(key: FitsHeader): Float? { - return getFloatOrNull(key.key) + fun getBooleanOrNull(key: HeaderKey): Boolean? { + return getBooleanOrNull(key.key) } - fun getDouble(key: String, defaultValue: Double): Double { - val card = firstOrNull { it.key == key } ?: return defaultValue - return card.getValue(defaultValue) + fun getInt(key: HeaderKey, defaultValue: Int): Int { + return getInt(key.key, defaultValue) } - fun getDoubleOrNull(key: String): Double? { - val card = firstOrNull { it.key == key } ?: return null - return card.getValue(null) + fun getIntOrNull(key: HeaderKey): Int? { + return getIntOrNull(key.key) } - fun getDouble(key: FitsHeader, defaultValue: Double): Double { - return getDouble(key.key, defaultValue) + fun getLong(key: HeaderKey, defaultValue: Long): Long { + return getLong(key.key, defaultValue) } - fun getDoubleOrNull(key: FitsHeader): Double? { - return getDoubleOrNull(key.key) + fun getLongOrNull(key: HeaderKey): Long? { + return getLongOrNull(key.key) } - fun getString(key: String, defaultValue: String): String { - val card = firstOrNull { it.key == key } ?: return defaultValue - return card.getValue(defaultValue) + fun getFloat(key: HeaderKey, defaultValue: Float): Float { + return getFloat(key.key, defaultValue) } - fun getStringOrNull(key: String): String? { - val card = firstOrNull { it.key == key } ?: return null - return card.getValue(null) + fun getFloatOrNull(key: HeaderKey): Float? { + return getFloatOrNull(key.key) + } + + fun getDouble(key: HeaderKey, defaultValue: Double): Double { + return getDouble(key.key, defaultValue) + } + + fun getDoubleOrNull(key: HeaderKey): Double? { + return getDoubleOrNull(key.key) } - fun getString(key: FitsHeader, defaultValue: String): String { + fun getString(key: HeaderKey, defaultValue: String): String { return getString(key.key, defaultValue) } - fun getStringOrNull(key: FitsHeader): String? { + fun getStringOrNull(key: HeaderKey): String? { return getStringOrNull(key.key) } } diff --git a/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/WritableHeader.kt b/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/WritableHeader.kt new file mode 100644 index 000000000..aaf1a1078 --- /dev/null +++ b/nebulosa-image-format/src/main/kotlin/nebulosa/image/format/WritableHeader.kt @@ -0,0 +1,30 @@ +package nebulosa.image.format + +interface WritableHeader { + + fun clear() + + fun add(key: HeaderKey, value: Boolean) = add(key.key, value, key.comment) + + fun add(key: HeaderKey, value: Int) = add(key.key, value, key.comment) + + fun add(key: HeaderKey, value: Double) = add(key.key, value, key.comment) + + fun add(key: HeaderKey, value: String) = add(key.key, value, key.comment) + + fun add(key: String, value: Boolean, comment: String = "") + + fun add(key: String, value: Int, comment: String = "") + + fun add(key: String, value: Double, comment: String = "") + + fun add(key: String, value: String, comment: String = "") + + fun add(card: HeaderCard) + + fun addAll(cards: Iterable) = cards.forEach(::add) + + fun delete(key: HeaderKey) = delete(key.key) + + fun delete(key: String): Boolean +} diff --git a/nebulosa-imaging/build.gradle.kts b/nebulosa-image/build.gradle.kts similarity index 100% rename from nebulosa-imaging/build.gradle.kts rename to nebulosa-image/build.gradle.kts diff --git a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/Float8bitsDataBuffer.kt b/nebulosa-image/src/main/kotlin/nebulosa/image/Float8bitsDataBuffer.kt similarity index 87% rename from nebulosa-imaging/src/main/kotlin/nebulosa/imaging/Float8bitsDataBuffer.kt rename to nebulosa-image/src/main/kotlin/nebulosa/image/Float8bitsDataBuffer.kt index 3b3cb3a53..067469071 100644 --- a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/Float8bitsDataBuffer.kt +++ b/nebulosa-image/src/main/kotlin/nebulosa/image/Float8bitsDataBuffer.kt @@ -1,16 +1,16 @@ -package nebulosa.imaging +package nebulosa.image import java.awt.image.DataBuffer @Suppress("ArrayInDataClass") data class Float8bitsDataBuffer( @JvmField val mono: Boolean, - @JvmField val r: FloatArray, // or gray. - @JvmField val g: FloatArray = r, - @JvmField val b: FloatArray = r, -) : DataBuffer(TYPE_FLOAT, if (mono) r.size else r.size + g.size + b.size) { + @JvmField val red: FloatArray, // or gray. + @JvmField val green: FloatArray = red, + @JvmField val blue: FloatArray = red, +) : DataBuffer(TYPE_FLOAT, if (mono) red.size else red.size + green.size + blue.size) { - @JvmField val data = arrayOf(r, g, b) + @JvmField val data = arrayOf(red, green, blue) @Suppress("NOTHING_TO_INLINE") private inline operator fun get(i: Int): Float { diff --git a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/Image.kt b/nebulosa-image/src/main/kotlin/nebulosa/image/Image.kt similarity index 54% rename from nebulosa-imaging/src/main/kotlin/nebulosa/imaging/Image.kt rename to nebulosa-image/src/main/kotlin/nebulosa/image/Image.kt index 405896762..4e2a161aa 100644 --- a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/Image.kt +++ b/nebulosa-image/src/main/kotlin/nebulosa/image/Image.kt @@ -1,12 +1,13 @@ -package nebulosa.imaging +package nebulosa.image import nebulosa.fits.* -import nebulosa.imaging.algorithms.ComputationAlgorithm -import nebulosa.imaging.algorithms.TransformAlgorithm -import nebulosa.imaging.algorithms.transform -import nebulosa.imaging.algorithms.transformation.CfaPattern -import nebulosa.imaging.algorithms.transformation.Debayer -import nebulosa.imaging.algorithms.transformation.Grayscale +import nebulosa.image.algorithms.ComputationAlgorithm +import nebulosa.image.algorithms.TransformAlgorithm +import nebulosa.image.algorithms.transform +import nebulosa.image.algorithms.transformation.CfaPattern +import nebulosa.image.algorithms.transformation.Debayer +import nebulosa.image.algorithms.transformation.Grayscale +import nebulosa.image.format.* import okio.Sink import java.awt.color.ColorSpace import java.awt.image.* @@ -14,11 +15,21 @@ import kotlin.math.max import kotlin.math.min @Suppress("NOTHING_TO_INLINE") -class Image( - width: Int, height: Int, - val header: Header, val mono: Boolean, -) : BufferedImage(colorModel(mono), raster(width, height, mono), false, null) { +class Image internal constructor( + width: Int, height: Int, val mono: Boolean, + @JvmField val hdu: ImageHdu, +) : BufferedImage(colorModel(mono), raster(hdu, mono), false, null), Cloneable { + constructor(width: Int, height: Int, header: ReadableHeader, mono: Boolean) + : this(width, height, mono, BasicImageHdu(width, height, if (mono) 1 else 3, header, FloatImageData(width, height, if (mono) 1 else 3))) + + constructor(width: Int, height: Int, header: ReadableHeader, red: FloatArray) + : this(width, height, true, BasicImageHdu(width, height, 1, header, FloatImageData(width, height, 1, red))) + + constructor(width: Int, height: Int, header: ReadableHeader, red: FloatArray, green: FloatArray, blue: FloatArray) + : this(width, height, false, BasicImageHdu(width, height, 3, header, FloatImageData(width, height, 3, red, green, blue))) + + @JvmField val header = hdu.header @JvmField val numberOfChannels = if (mono) 1 else 3 @JvmField val stride = width @JvmField val buffer = raster.dataBuffer as Float8bitsDataBuffer @@ -27,21 +38,21 @@ class Image( inline val data get() = buffer.data - inline val r - get() = buffer.r + inline val red + get() = buffer.red - inline val g - get() = buffer.g + inline val green + get() = buffer.green - inline val b - get() = buffer.b + inline val blue + get() = buffer.blue inline fun indexAt(x: Int, y: Int): Int { return y * stride + x } inline fun write(index: Int, channel: ImageChannel, color: Float) { - write(index, channel.offset, color) + write(index, channel.index, color) } inline fun write(index: Int, channel: Int, color: Float) { @@ -49,7 +60,7 @@ class Image( } inline fun write(x: Int, y: Int, channel: ImageChannel, color: Float) { - write(x, y, channel.offset, color) + write(x, y, channel.index, color) } inline fun write(x: Int, y: Int, channel: Int, color: Float) { @@ -57,7 +68,7 @@ class Image( } inline fun writeRed(index: Int, color: Float) { - r[index] = color + red[index] = color } inline fun writeRed(x: Int, y: Int, color: Float) { @@ -65,7 +76,7 @@ class Image( } inline fun writeGreen(index: Int, color: Float) { - g[index] = color + green[index] = color } inline fun writeGreen(x: Int, y: Int, color: Float) { @@ -73,7 +84,7 @@ class Image( } inline fun writeBlue(index: Int, color: Float) { - b[index] = color + blue[index] = color } inline fun writeBlue(x: Int, y: Int, color: Float) { @@ -81,11 +92,11 @@ class Image( } inline fun writeGray(index: Int, color: Float) { - r[index] = color + red[index] = color if (!mono) { - g[index] = color - b[index] = color + green[index] = color + blue[index] = color } } @@ -94,7 +105,7 @@ class Image( } inline fun read(index: Int, channel: ImageChannel): Float { - return read(index, channel.offset) + return read(index, channel.index) } inline fun read(index: Int, channel: Int): Float { @@ -102,7 +113,7 @@ class Image( } inline fun read(x: Int, y: Int, channel: ImageChannel): Float { - return read(x, y, channel.offset) + return read(x, y, channel.index) } inline fun read(x: Int, y: Int, channel: Int): Float { @@ -110,7 +121,7 @@ class Image( } inline fun readRed(index: Int): Float { - return r[index] + return red[index] } inline fun readRed(x: Int, y: Int): Float { @@ -118,7 +129,7 @@ class Image( } inline fun readGreen(index: Int): Float { - return g[index] + return green[index] } inline fun readGreen(x: Int, y: Int): Float { @@ -126,7 +137,7 @@ class Image( } inline fun readBlue(index: Int): Float { - return b[index] + return blue[index] } inline fun readBlue(x: Int, y: Int): Float { @@ -134,52 +145,17 @@ class Image( } inline fun readGray(index: Int): Float { - return if (mono) r[index] else (r[index] + g[index] + b[index]) / 3f + return if (mono) red[index] else (red[index] + green[index] + blue[index]) / 3f } inline fun readGrayBT709(index: Int): Float { - return if (mono) r[index] else (r[index] * 0.2125f + g[index] * 0.7154f + b[index] * 0.0721f) + return if (mono) red[index] else (red[index] * 0.2125f + green[index] * 0.7154f + blue[index] * 0.0721f) } inline fun readGray(x: Int, y: Int): Float { return readGray(indexAt(x, y)) } - fun writeImageData(channel: ImageChannel, data: ImageData) { - var idx = 0 - - when (data.bitpix) { - Bitpix.BYTE -> data.read { - while (it.hasRemaining()) { - write(idx++, channel, (it.get().toInt() and 0xFF) / 255f) - } - } - Bitpix.SHORT -> data.read { - while (it.hasRemaining()) { - write(idx++, channel, (it.getShort().toInt() + 32768) / 65535f) - } - } - Bitpix.INTEGER -> data.read { - while (it.hasRemaining()) { - write(idx++, channel, ((it.getInt().toLong() + 2147483648) / 4294967295.0).toFloat()) - } - } - Bitpix.FLOAT -> data.read { - while (it.hasRemaining()) { - write(idx++, channel, it.getFloat()) - } - } - Bitpix.DOUBLE -> data.read { - while (it.hasRemaining()) { - write(idx++, channel, it.getDouble().toFloat()) - } - } - Bitpix.LONG -> { - throw UnsupportedOperationException("BITPIX 64-bit integer is not supported") - } - } - } - fun writeTo(output: IntArray) { var idx = 0 @@ -188,13 +164,13 @@ class Image( val index = indexAt(x, y) if (mono) { - val c = (r[index] * 255f).toInt() + val c = (red[index] * 255f).toInt() val p = 0xFF000000.toInt() or (c shl 16) or (c shl 8) or c output[idx++] = p } else { - val ri = (r[index] * 255f).toInt() - val gi = (g[index] * 255f).toInt() - val bi = (b[index] * 255f).toInt() + val ri = (red[index] * 255f).toInt() + val gi = (green[index] * 255f).toInt() + val bi = (blue[index] * 255f).toInt() val p = 0xFF000000.toInt() or (ri shl 16) or (gi shl 8) or bi output[idx++] = p } @@ -202,72 +178,66 @@ class Image( } } - fun writeTo(sink: Sink) { - hdu().write(sink) - } - - fun hdu(): Hdu { - return ImageHdu(header, Array(numberOfChannels) { FloatImageData(width, height, data[it]) }) + fun writeTo(sink: Sink, format: ImageFormat) { + format.write(sink, listOf(hdu)) } /** * Creates a new [Image] and returns a mono version of this image. */ fun mono(grayscale: Grayscale = Grayscale.BT709): Image { - val image = Image(width, height, header.clone(), true) - - if (mono) { - r.copyInto(image.r) + return if (mono) { + Image(width, height, FitsHeader(header), red.clone()) + } else { + grayscale.transform(this) } - - return grayscale.transform(image) } /** * Creates a new [Image] and returns a RGB version of this image. */ fun color(): Image { - val image = Image(width, height, header.clone(), false) + val newHeader = FitsHeader(header) - if (mono) { - r.copyInto(image.r) - r.copyInto(image.g) - r.copyInto(image.b) + val image = if (mono) { + Image(width, height, newHeader, red.clone(), red.clone(), red.clone()) } else { - r.copyInto(image.r) - g.copyInto(image.g) - b.copyInto(image.b) + Image(width, height, newHeader, red.clone(), green.clone(), blue.clone()) } - with(image.header) { - add(Standard.NAXIS, 3) - add(Standard.NAXIS1, width) - add(Standard.NAXIS2, height) - add(Standard.NAXIS3, 3) + with(newHeader) { + add(FitsKeyword.NAXIS, 3) + add(FitsKeyword.NAXIS1, width) + add(FitsKeyword.NAXIS2, height) + add(FitsKeyword.NAXIS3, 3) } return image } - fun canLoad(hdu: ImageHdu, debayer: Boolean = true): Boolean { - return hdu.width == width && hdu.height == height && (isMono(hdu) || !debayer) == this.mono + fun canLoad(hdu: ImageHdu): Boolean { + return hdu.width == width && hdu.height == height && hdu.isMono == mono + } + + fun canLoad(image: ImageRepresentation): Boolean { + return canLoad(image.filterIsInstance().first()) } - fun canLoad(fits: Fits, debayer: Boolean = true): Boolean { - return canLoad(fits.filterIsInstance().first(), debayer) + fun load(image: ImageRepresentation): Image? { + return load(image.filterIsInstance().first()) } - fun load(fits: Fits, debayer: Boolean = true): Image? { - return load(fits.filterIsInstance().first(), debayer) + fun load(image: Image): Image? { + return load(image.hdu) } - fun load(hdu: ImageHdu, debayer: Boolean = true): Image? { - if (!canLoad(hdu, debayer)) return null - load(this, hdu, debayer) + fun load(hdu: ImageHdu): Image? { + if (!canLoad(hdu)) return null + load(this, hdu, false) return this } - fun clone() = if (mono) mono() else color() + public override fun clone() = if (mono) mono() else color() fun transform(vararg algorithms: TransformAlgorithm) = algorithms.transform(this) @@ -282,39 +252,61 @@ class Image( } @JvmStatic - internal fun raster(width: Int, height: Int, mono: Boolean): WritableRaster { + internal fun raster(width: Int, height: Int, mono: Boolean, red: FloatArray, green: FloatArray, blue: FloatArray): WritableRaster { val pixelStride = if (mono) 1 else 3 val bandOffsets = if (mono) intArrayOf(0) else intArrayOf(0, 1, 2) val sampleModel = PixelInterleavedSampleModel(DataBuffer.TYPE_BYTE, width, height, pixelStride, width * pixelStride, bandOffsets) - val size = width * height - - val buffer = if (mono) Float8bitsDataBuffer.mono(size) - else Float8bitsDataBuffer.rgb(size) - + val buffer = Float8bitsDataBuffer(mono, red, green, blue) return Raster.createWritableRaster(sampleModel, buffer, null) } @JvmStatic - fun open( - fits: Fits, - debayer: Boolean = true, - ) = open(fits.filterIsInstance().first(), debayer) + internal fun raster(hdu: ImageHdu, mono: Boolean): WritableRaster { + return if (mono || hdu.data.numberOfChannels >= 3) { + raster(hdu.width, hdu.height, mono, hdu.data.red, hdu.data.green, hdu.data.blue) + } else { + raster(hdu.width, hdu.height, false, hdu.data.red, FloatArray(hdu.data.numberOfPixels), FloatArray(hdu.data.numberOfPixels)) + } + } @JvmStatic - fun open( - hdu: ImageHdu, - debayer: Boolean = true, - ): Image { - val mono = isMono(hdu) || !debayer - val image = Image(hdu.width, hdu.height, hdu.header, mono) - load(image, hdu, debayer) + fun open(image: ImageRepresentation, debayer: Boolean = true): Image { + return open(image.filterIsInstance().first(), debayer) + } + + @JvmStatic + fun open(hdu: ImageHdu, debayer: Boolean = true): Image { + val image = Image(hdu.width, hdu.height, isMono(hdu) || !debayer, hdu) + + if (!image.mono && debayer) { + image.debayer() + } + return image } + private inline fun Image.debayer(bayer: CfaPattern? = CfaPattern.from(header)) { + if (bayer != null) { + Debayer(bayer).transform(this) + } + } + @JvmStatic private fun load(image: Image, hdu: ImageHdu, debayer: Boolean) { - val pixels = hdu.data + hdu.data.readChannelTo(ImageChannel.RED, image.red) + + if (!image.mono) { + if (debayer) { + image.debayer() + } else { + hdu.data.readChannelTo(ImageChannel.GREEN, image.green) + hdu.data.readChannelTo(ImageChannel.BLUE, image.blue) + } + } + } + @JvmStatic + private fun load(image: Image, debayer: Boolean) { fun rescaling() { for (p in 0 until image.numberOfChannels) { val minMax = floatArrayOf(Float.MAX_VALUE, Float.MIN_VALUE) @@ -339,19 +331,14 @@ class Image( // TODO: DATA[i] = BZERO + BSCALE * DATA[i] // Mono. - if (hdu.size == 1) { - val bayer = CfaPattern.from(hdu.header) - image.writeImageData(ImageChannel.GRAY, pixels[0]) - + if (image.mono) { rescaling() + } else { + val bayer = CfaPattern.from(image.header) if (debayer && bayer != null) { Debayer(bayer).transform(image) } - } else { - for (channel in ImageChannel.RGB) { - image.writeImageData(channel, pixels[channel.offset]) - } rescaling() } @@ -359,21 +346,21 @@ class Image( @JvmStatic fun open(bufferedImage: BufferedImage): Image { - val header = Header() + val header = FitsHeader() val width = bufferedImage.width val height = bufferedImage.height val mono = bufferedImage.type == TYPE_BYTE_GRAY - || bufferedImage.type == TYPE_USHORT_GRAY - - header.add(Standard.SIMPLE, true) - header.add(Standard.BITPIX, Bitpix.FLOAT.code) - header.add(Standard.NAXIS, if (mono) 2 else 3) - header.add(Standard.NAXISn.n(1), width) - header.add(Standard.NAXISn.n(2), height) - if (!mono) header.add(Standard.NAXISn.n(3), 3) - header.add(Standard.BSCALE, 1.0) - header.add(Standard.BZERO, 0.0) - header.add(Standard.EXTEND, true) + || bufferedImage.type == TYPE_USHORT_GRAY + + header.add(FitsKeyword.SIMPLE, true) + header.add(FitsKeyword.BITPIX, Bitpix.FLOAT.code) + header.add(FitsKeyword.NAXIS, if (mono) 2 else 3) + header.add(FitsKeyword.NAXISn.n(1), width) + header.add(FitsKeyword.NAXISn.n(2), height) + if (!mono) header.add(FitsKeyword.NAXISn.n(3), 3) + header.add(FitsKeyword.BSCALE, 1.0) + header.add(FitsKeyword.BZERO, 0.0) + header.add(FitsKeyword.EXTEND, true) val image = Image(width, height, header, mono) @@ -385,11 +372,11 @@ class Image( val rgb = bufferedImage.getRGB(x, y) if (mono) { - image.r[idx++] = (rgb and 0xff) / 255f + image.red[idx++] = (rgb and 0xff) / 255f } else { - image.r[idx] = (rgb ushr 16 and 0xff) / 255f - image.g[idx] = (rgb ushr 8 and 0xff) / 255f - image.b[idx++] = (rgb and 0xff) / 255f + image.red[idx] = (rgb ushr 16 and 0xff) / 255f + image.green[idx] = (rgb ushr 8 and 0xff) / 255f + image.blue[idx++] = (rgb and 0xff) / 255f } } } @@ -404,7 +391,7 @@ class Image( @JvmStatic fun isMono(hdu: ImageHdu): Boolean { - return hdu.size == 1 && !canDebayer(hdu) + return hdu.isMono && !canDebayer(hdu) } inline fun Image.forEach( diff --git a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/AlgorithmHelper.kt b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/AlgorithmHelper.kt similarity index 87% rename from nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/AlgorithmHelper.kt rename to nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/AlgorithmHelper.kt index d5d890e05..be556492d 100644 --- a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/AlgorithmHelper.kt +++ b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/AlgorithmHelper.kt @@ -1,6 +1,6 @@ -package nebulosa.imaging.algorithms +package nebulosa.image.algorithms -import nebulosa.imaging.Image +import nebulosa.image.Image @JvmName("apply") @Suppress("NOTHING_TO_INLINE") diff --git a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/ComputationAlgorithm.kt b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/ComputationAlgorithm.kt similarity index 55% rename from nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/ComputationAlgorithm.kt rename to nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/ComputationAlgorithm.kt index 4d8d03ec4..3872b862c 100644 --- a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/ComputationAlgorithm.kt +++ b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/ComputationAlgorithm.kt @@ -1,6 +1,6 @@ -package nebulosa.imaging.algorithms +package nebulosa.image.algorithms -import nebulosa.imaging.Image +import nebulosa.image.Image fun interface ComputationAlgorithm { diff --git a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/TransformAlgorithm.kt b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/TransformAlgorithm.kt similarity index 84% rename from nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/TransformAlgorithm.kt rename to nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/TransformAlgorithm.kt index b861062b9..53230446a 100644 --- a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/TransformAlgorithm.kt +++ b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/TransformAlgorithm.kt @@ -1,6 +1,6 @@ -package nebulosa.imaging.algorithms +package nebulosa.image.algorithms -import nebulosa.imaging.Image +import nebulosa.image.Image fun interface TransformAlgorithm { diff --git a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/computation/Histogram.kt b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/computation/Histogram.kt similarity index 73% rename from nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/computation/Histogram.kt rename to nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/computation/Histogram.kt index 18307233b..e439a8a82 100644 --- a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/computation/Histogram.kt +++ b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/computation/Histogram.kt @@ -1,9 +1,9 @@ -package nebulosa.imaging.algorithms.computation +package nebulosa.image.algorithms.computation -import nebulosa.imaging.Image -import nebulosa.imaging.Image.Companion.forEach -import nebulosa.imaging.ImageChannel -import nebulosa.imaging.algorithms.ComputationAlgorithm +import nebulosa.image.Image +import nebulosa.image.Image.Companion.forEach +import nebulosa.image.algorithms.ComputationAlgorithm +import nebulosa.image.format.ImageChannel import kotlin.math.max import kotlin.math.min diff --git a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/computation/Median.kt b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/computation/Median.kt similarity index 85% rename from nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/computation/Median.kt rename to nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/computation/Median.kt index d5b846ad1..77411184b 100644 --- a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/computation/Median.kt +++ b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/computation/Median.kt @@ -1,9 +1,9 @@ -package nebulosa.imaging.algorithms.computation +package nebulosa.image.algorithms.computation -import nebulosa.imaging.Image -import nebulosa.imaging.Image.Companion.forEach -import nebulosa.imaging.ImageChannel -import nebulosa.imaging.algorithms.ComputationAlgorithm +import nebulosa.image.Image +import nebulosa.image.Image.Companion.forEach +import nebulosa.image.algorithms.ComputationAlgorithm +import nebulosa.image.format.ImageChannel import kotlin.math.max import kotlin.math.min diff --git a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/computation/MedianAbsoluteDeviation.kt b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/computation/MedianAbsoluteDeviation.kt similarity index 82% rename from nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/computation/MedianAbsoluteDeviation.kt rename to nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/computation/MedianAbsoluteDeviation.kt index 49cb2a56c..b11c41688 100644 --- a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/computation/MedianAbsoluteDeviation.kt +++ b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/computation/MedianAbsoluteDeviation.kt @@ -1,9 +1,9 @@ -package nebulosa.imaging.algorithms.computation +package nebulosa.image.algorithms.computation -import nebulosa.imaging.Image -import nebulosa.imaging.Image.Companion.forEach -import nebulosa.imaging.ImageChannel -import nebulosa.imaging.algorithms.ComputationAlgorithm +import nebulosa.image.Image +import nebulosa.image.Image.Companion.forEach +import nebulosa.image.algorithms.ComputationAlgorithm +import nebulosa.image.format.ImageChannel import kotlin.math.abs import kotlin.math.min diff --git a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/computation/Statistics.kt b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/computation/Statistics.kt similarity index 93% rename from nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/computation/Statistics.kt rename to nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/computation/Statistics.kt index 1b0114b26..2a44ef99a 100644 --- a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/computation/Statistics.kt +++ b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/computation/Statistics.kt @@ -1,9 +1,9 @@ -package nebulosa.imaging.algorithms.computation +package nebulosa.image.algorithms.computation -import nebulosa.imaging.Image -import nebulosa.imaging.Image.Companion.forEach -import nebulosa.imaging.ImageChannel -import nebulosa.imaging.algorithms.ComputationAlgorithm +import nebulosa.image.Image +import nebulosa.image.Image.Companion.forEach +import nebulosa.image.algorithms.ComputationAlgorithm +import nebulosa.image.format.ImageChannel import kotlin.math.abs import kotlin.math.max import kotlin.math.min diff --git a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/computation/fwhm/FWHM.kt b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/computation/fwhm/FWHM.kt similarity index 93% rename from nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/computation/fwhm/FWHM.kt rename to nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/computation/fwhm/FWHM.kt index ee52e1524..c13b43c90 100644 --- a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/computation/fwhm/FWHM.kt +++ b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/computation/fwhm/FWHM.kt @@ -1,7 +1,7 @@ -package nebulosa.imaging.algorithms.computation.fwhm +package nebulosa.image.algorithms.computation.fwhm -import nebulosa.imaging.Image -import nebulosa.imaging.algorithms.ComputationAlgorithm +import nebulosa.image.Image +import nebulosa.image.algorithms.ComputationAlgorithm import kotlin.math.max import kotlin.math.min diff --git a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/computation/hfd/HFD.kt b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/computation/hfd/HFD.kt similarity index 98% rename from nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/computation/hfd/HFD.kt rename to nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/computation/hfd/HFD.kt index 1c93e5369..73dfa555e 100644 --- a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/computation/hfd/HFD.kt +++ b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/computation/hfd/HFD.kt @@ -1,7 +1,7 @@ -package nebulosa.imaging.algorithms.computation.hfd +package nebulosa.image.algorithms.computation.hfd -import nebulosa.imaging.Image -import nebulosa.imaging.algorithms.ComputationAlgorithm +import nebulosa.image.Image +import nebulosa.image.algorithms.ComputationAlgorithm import kotlin.math.* /** diff --git a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/computation/hfd/HFR.kt b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/computation/hfd/HFR.kt similarity index 95% rename from nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/computation/hfd/HFR.kt rename to nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/computation/hfd/HFR.kt index 5bb0d87ba..4df771850 100644 --- a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/computation/hfd/HFR.kt +++ b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/computation/hfd/HFR.kt @@ -1,4 +1,4 @@ -package nebulosa.imaging.algorithms.computation.hfd +package nebulosa.image.algorithms.computation.hfd import kotlin.math.sqrt diff --git a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/AutoScreenTransformFunction.kt b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/AutoScreenTransformFunction.kt similarity index 82% rename from nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/AutoScreenTransformFunction.kt rename to nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/AutoScreenTransformFunction.kt index b40346143..ddd031f63 100644 --- a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/AutoScreenTransformFunction.kt +++ b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/AutoScreenTransformFunction.kt @@ -1,10 +1,10 @@ -package nebulosa.imaging.algorithms.transformation +package nebulosa.image.algorithms.transformation -import nebulosa.imaging.Image -import nebulosa.imaging.algorithms.ComputationAlgorithm -import nebulosa.imaging.algorithms.TransformAlgorithm -import nebulosa.imaging.algorithms.computation.Median -import nebulosa.imaging.algorithms.computation.MedianAbsoluteDeviation +import nebulosa.image.Image +import nebulosa.image.algorithms.ComputationAlgorithm +import nebulosa.image.algorithms.TransformAlgorithm +import nebulosa.image.algorithms.computation.Median +import nebulosa.image.algorithms.computation.MedianAbsoluteDeviation import nebulosa.log.loggerFor import kotlin.math.max import kotlin.math.min diff --git a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/Binarize.kt b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/Binarize.kt similarity index 70% rename from nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/Binarize.kt rename to nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/Binarize.kt index 7debce20b..9de147801 100644 --- a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/Binarize.kt +++ b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/Binarize.kt @@ -1,7 +1,7 @@ -package nebulosa.imaging.algorithms.transformation +package nebulosa.image.algorithms.transformation -import nebulosa.imaging.Image -import nebulosa.imaging.algorithms.TransformAlgorithm +import nebulosa.image.Image +import nebulosa.image.algorithms.TransformAlgorithm data class Binarize(private val threshold: Float = 0.5f) : TransformAlgorithm { diff --git a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/CfaPattern.kt b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/CfaPattern.kt similarity index 86% rename from nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/CfaPattern.kt rename to nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/CfaPattern.kt index bfaeeb053..b650c546f 100644 --- a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/CfaPattern.kt +++ b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/CfaPattern.kt @@ -1,8 +1,8 @@ -package nebulosa.imaging.algorithms.transformation +package nebulosa.image.algorithms.transformation -import nebulosa.fits.Header import nebulosa.fits.cfaPattern -import nebulosa.imaging.ImageChannel +import nebulosa.image.format.ImageChannel +import nebulosa.image.format.ReadableHeader enum class CfaPattern(private val pattern: Array>) { RGGB(arrayOf(arrayOf(ImageChannel.RED, ImageChannel.GREEN), arrayOf(ImageChannel.GREEN, ImageChannel.BLUE))), @@ -19,7 +19,7 @@ enum class CfaPattern(private val pattern: Array>) { companion object { @JvmStatic - fun from(header: Header): CfaPattern? { + fun from(header: ReadableHeader): CfaPattern? { return header.cfaPattern?.let(CfaPattern::valueOf) } } diff --git a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/Debayer.kt b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/Debayer.kt similarity index 60% rename from nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/Debayer.kt rename to nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/Debayer.kt index e5fd85ee3..3f9451efc 100644 --- a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/Debayer.kt +++ b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/Debayer.kt @@ -1,7 +1,7 @@ -package nebulosa.imaging.algorithms.transformation +package nebulosa.image.algorithms.transformation -import nebulosa.imaging.Image -import nebulosa.imaging.algorithms.TransformAlgorithm +import nebulosa.image.Image +import nebulosa.image.algorithms.TransformAlgorithm data class Debayer(private val pattern: CfaPattern? = null) : TransformAlgorithm { @@ -31,7 +31,7 @@ data class Debayer(private val pattern: CfaPattern? = null) : TransformAlgorithm val startIndex = rowIndex - width for (x in 0 until width) { - source.r[startIndex + x] = cache[cacheIndex][x] + source.red[startIndex + x] = cache[cacheIndex][x] } } } @@ -46,60 +46,60 @@ data class Debayer(private val pattern: CfaPattern? = null) : TransformAlgorithm rgbCounters.fill(0) var bayerIndex = pattern[y and 1, x and 1] - rgbValues[bayerIndex.offset] += source.readRed(index) - rgbCounters[bayerIndex.offset]++ + rgbValues[bayerIndex.index] += source.readRed(index) + rgbCounters[bayerIndex.index]++ if (x != 0) { bayerIndex = pattern[y and 1, x - 1 and 1] - rgbValues[bayerIndex.offset] += source.readRed(index - 1) - rgbCounters[bayerIndex.offset]++ + rgbValues[bayerIndex.index] += source.readRed(index - 1) + rgbCounters[bayerIndex.index]++ } if (x != widthM1) { bayerIndex = pattern[y and 1, x + 1 and 1] - rgbValues[bayerIndex.offset] += source.readRed(index + 1) - rgbCounters[bayerIndex.offset]++ + rgbValues[bayerIndex.index] += source.readRed(index + 1) + rgbCounters[bayerIndex.index]++ } if (y != 0) { bayerIndex = pattern[y - 1 and 1, x and 1] - rgbValues[bayerIndex.offset] += source.readRed(index - source.stride) - rgbCounters[bayerIndex.offset]++ + rgbValues[bayerIndex.index] += source.readRed(index - source.stride) + rgbCounters[bayerIndex.index]++ if (x != 0) { bayerIndex = pattern[y - 1 and 1, x - 1 and 1] - rgbValues[bayerIndex.offset] += source.readRed(index - source.stride - 1) - rgbCounters[bayerIndex.offset]++ + rgbValues[bayerIndex.index] += source.readRed(index - source.stride - 1) + rgbCounters[bayerIndex.index]++ } if (x != widthM1) { bayerIndex = pattern[y - 1 and 1, x + 1 and 1] - rgbValues[bayerIndex.offset] += source.readRed(index - source.stride + 1) - rgbCounters[bayerIndex.offset]++ + rgbValues[bayerIndex.index] += source.readRed(index - source.stride + 1) + rgbCounters[bayerIndex.index]++ } } if (y != heightM1) { bayerIndex = pattern[y + 1 and 1, x and 1] - rgbValues[bayerIndex.offset] += source.readRed(index + source.stride) - rgbCounters[bayerIndex.offset]++ + rgbValues[bayerIndex.index] += source.readRed(index + source.stride) + rgbCounters[bayerIndex.index]++ if (x != 0) { bayerIndex = pattern[y + 1 and 1, x - 1 and 1] - rgbValues[bayerIndex.offset] += source.readRed(index + source.stride - 1) - rgbCounters[bayerIndex.offset]++ + rgbValues[bayerIndex.index] += source.readRed(index + source.stride - 1) + rgbCounters[bayerIndex.index]++ } if (x != widthM1) { bayerIndex = pattern[y + 1 and 1, x + 1 and 1] - rgbValues[bayerIndex.offset] += source.readRed(index + source.stride + 1) - rgbCounters[bayerIndex.offset]++ + rgbValues[bayerIndex.index] += source.readRed(index + source.stride + 1) + rgbCounters[bayerIndex.index]++ } } cache[y and 1][x] = rgbValues[0] / rgbCounters[0] - source.g[index] = rgbValues[1] / rgbCounters[1] - source.b[index] = rgbValues[2] / rgbCounters[2] + source.green[index] = rgbValues[1] / rgbCounters[1] + source.blue[index] = rgbValues[2] / rgbCounters[2] } copyCacheToRedChannel(rowIndex, y) diff --git a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/Draw.kt b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/Draw.kt similarity index 77% rename from nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/Draw.kt rename to nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/Draw.kt index f39a7c9bf..578790f3d 100644 --- a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/Draw.kt +++ b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/Draw.kt @@ -1,7 +1,7 @@ -package nebulosa.imaging.algorithms.transformation +package nebulosa.image.algorithms.transformation -import nebulosa.imaging.Image -import nebulosa.imaging.algorithms.TransformAlgorithm +import nebulosa.image.Image +import nebulosa.image.algorithms.TransformAlgorithm import java.awt.Graphics2D import java.awt.RenderingHints diff --git a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/Grayscale.kt b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/Grayscale.kt similarity index 57% rename from nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/Grayscale.kt rename to nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/Grayscale.kt index b31002c43..9d520f03e 100644 --- a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/Grayscale.kt +++ b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/Grayscale.kt @@ -1,9 +1,9 @@ -package nebulosa.imaging.algorithms.transformation +package nebulosa.image.algorithms.transformation -import nebulosa.fits.Standard -import nebulosa.fits.clone -import nebulosa.imaging.Image -import nebulosa.imaging.algorithms.TransformAlgorithm +import nebulosa.fits.FitsHeader +import nebulosa.fits.FitsKeyword +import nebulosa.image.Image +import nebulosa.image.algorithms.TransformAlgorithm import kotlin.math.max import kotlin.math.min @@ -16,13 +16,14 @@ data class Grayscale( override fun transform(source: Image): Image { if (source.mono) return source - val header = source.header.clone() - header.add(Standard.NAXIS, 2) - header.delete(Standard.NAXIS3) - val result = Image(source.width, source.height, header, true) + val newHeader = FitsHeader(source.header) + newHeader.add(FitsKeyword.NAXIS, 2) + newHeader.delete(FitsKeyword.NAXIS3) - for (i in source.r.indices) { - result.r[i] = max(0f, min(red * source.r[i] + green * source.g[i] + blue * source.b[i], 1f)) + val result = Image(source.width, source.height, newHeader, true) + + for (i in source.red.indices) { + result.red[i] = max(0f, min(red * source.red[i] + green * source.green[i] + blue * source.blue[i], 1f)) } return result diff --git a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/HorizontalFlip.kt b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/HorizontalFlip.kt similarity index 82% rename from nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/HorizontalFlip.kt rename to nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/HorizontalFlip.kt index 15dc72492..ca7e1b45f 100644 --- a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/HorizontalFlip.kt +++ b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/HorizontalFlip.kt @@ -1,7 +1,7 @@ -package nebulosa.imaging.algorithms.transformation +package nebulosa.image.algorithms.transformation -import nebulosa.imaging.Image -import nebulosa.imaging.algorithms.TransformAlgorithm +import nebulosa.image.Image +import nebulosa.image.algorithms.TransformAlgorithm data object HorizontalFlip : TransformAlgorithm { diff --git a/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/Invert.kt b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/Invert.kt new file mode 100644 index 000000000..327840db6 --- /dev/null +++ b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/Invert.kt @@ -0,0 +1,18 @@ +package nebulosa.image.algorithms.transformation + +import nebulosa.image.Image +import nebulosa.image.algorithms.TransformAlgorithm + +data object Invert : TransformAlgorithm { + + override fun transform(source: Image): Image { + for (i in source.red.indices) source.red[i] = 1f - source.red[i] + + if (!source.mono) { + for (i in source.green.indices) source.green[i] = 1f - source.green[i] + for (i in source.blue.indices) source.blue[i] = 1f - source.blue[i] + } + + return source + } +} diff --git a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/ProtectionMethod.kt b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/ProtectionMethod.kt similarity index 95% rename from nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/ProtectionMethod.kt rename to nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/ProtectionMethod.kt index 31405461a..72d2d60ef 100644 --- a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/ProtectionMethod.kt +++ b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/ProtectionMethod.kt @@ -1,4 +1,4 @@ -package nebulosa.imaging.algorithms.transformation +package nebulosa.image.algorithms.transformation import kotlin.math.max import kotlin.math.min diff --git a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/SaltAndPepperNoise.kt b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/SaltAndPepperNoise.kt similarity index 85% rename from nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/SaltAndPepperNoise.kt rename to nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/SaltAndPepperNoise.kt index fda8f9ff8..0f7882ce9 100644 --- a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/SaltAndPepperNoise.kt +++ b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/SaltAndPepperNoise.kt @@ -1,7 +1,7 @@ -package nebulosa.imaging.algorithms.transformation +package nebulosa.image.algorithms.transformation -import nebulosa.imaging.Image -import nebulosa.imaging.algorithms.TransformAlgorithm +import nebulosa.image.Image +import nebulosa.image.algorithms.TransformAlgorithm import java.util.* data class SaltAndPepperNoise( diff --git a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/ScreenTransformFunction.kt b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/ScreenTransformFunction.kt similarity index 81% rename from nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/ScreenTransformFunction.kt rename to nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/ScreenTransformFunction.kt index 3510220ea..8a09f240b 100644 --- a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/ScreenTransformFunction.kt +++ b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/ScreenTransformFunction.kt @@ -1,7 +1,7 @@ -package nebulosa.imaging.algorithms.transformation +package nebulosa.image.algorithms.transformation -import nebulosa.imaging.Image -import nebulosa.imaging.algorithms.TransformAlgorithm +import nebulosa.image.Image +import nebulosa.image.algorithms.TransformAlgorithm import kotlin.math.max import kotlin.math.min @@ -40,12 +40,12 @@ data class ScreenTransformFunction( lut.fill(Float.NaN) - for (i in source.r.indices) { - source.r[i] = source.r[i].df(midtone, shadow, highlight, k1, k2) + for (i in source.red.indices) { + source.red[i] = source.red[i].df(midtone, shadow, highlight, k1, k2) if (!source.mono) { - source.g[i] = source.g[i].df(midtone, shadow, highlight, k1, k2) - source.b[i] = source.b[i].df(midtone, shadow, highlight, k1, k2) + source.green[i] = source.green[i].df(midtone, shadow, highlight, k1, k2) + source.blue[i] = source.blue[i].df(midtone, shadow, highlight, k1, k2) } } diff --git a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/SigmaClip.kt b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/SigmaClip.kt similarity index 89% rename from nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/SigmaClip.kt rename to nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/SigmaClip.kt index 65982ff5a..197ddbf55 100644 --- a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/SigmaClip.kt +++ b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/SigmaClip.kt @@ -1,10 +1,10 @@ -package nebulosa.imaging.algorithms.transformation +package nebulosa.image.algorithms.transformation -import nebulosa.imaging.Image -import nebulosa.imaging.ImageChannel -import nebulosa.imaging.algorithms.ComputationAlgorithm -import nebulosa.imaging.algorithms.TransformAlgorithm -import nebulosa.imaging.algorithms.computation.Statistics +import nebulosa.image.Image +import nebulosa.image.algorithms.ComputationAlgorithm +import nebulosa.image.algorithms.TransformAlgorithm +import nebulosa.image.algorithms.computation.Statistics +import nebulosa.image.format.ImageChannel import kotlin.math.max import kotlin.math.min diff --git a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/SubFrame.kt b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/SubFrame.kt similarity index 77% rename from nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/SubFrame.kt rename to nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/SubFrame.kt index 115bad15c..aec94be6e 100644 --- a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/SubFrame.kt +++ b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/SubFrame.kt @@ -1,9 +1,9 @@ -package nebulosa.imaging.algorithms.transformation +package nebulosa.image.algorithms.transformation -import nebulosa.fits.Standard -import nebulosa.fits.clone -import nebulosa.imaging.Image -import nebulosa.imaging.algorithms.TransformAlgorithm +import nebulosa.fits.FitsHeader +import nebulosa.fits.FitsKeyword +import nebulosa.image.Image +import nebulosa.image.algorithms.TransformAlgorithm data class SubFrame( private val x: Int, private val y: Int, @@ -21,10 +21,10 @@ data class SubFrame( require(x + width <= source.width) { "subframe.width < source.width: ${x + width} > ${source.width}" } require(y + height <= source.height) { "subframe.height < source.height: ${y + height} > ${source.height}" } - val header = source.header.clone() - header.add(Standard.NAXIS1, width) - header.add(Standard.NAXIS2, height) - val subframe = Image(width, height, header, source.mono) + val newHeader = FitsHeader(source.header) + newHeader.add(FitsKeyword.NAXIS1, width) + newHeader.add(FitsKeyword.NAXIS2, height) + val subframe = Image(width, height, newHeader, source.mono) var index = 0 diff --git a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/SubtractiveChromaticNoiseReduction.kt b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/SubtractiveChromaticNoiseReduction.kt similarity index 75% rename from nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/SubtractiveChromaticNoiseReduction.kt rename to nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/SubtractiveChromaticNoiseReduction.kt index d0c68aced..9a2ea4666 100644 --- a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/SubtractiveChromaticNoiseReduction.kt +++ b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/SubtractiveChromaticNoiseReduction.kt @@ -1,8 +1,8 @@ -package nebulosa.imaging.algorithms.transformation +package nebulosa.image.algorithms.transformation -import nebulosa.imaging.Image -import nebulosa.imaging.ImageChannel -import nebulosa.imaging.algorithms.TransformAlgorithm +import nebulosa.image.Image +import nebulosa.image.algorithms.TransformAlgorithm +import nebulosa.image.format.ImageChannel /** * The Subtractive Chromatic Noise Reduction (SCNR) technique @@ -31,12 +31,12 @@ data class SubtractiveChromaticNoiseReduction( override fun transform(source: Image): Image { if (source.mono || channel == ImageChannel.GRAY) return source - val p0 = (channel.offset + 2) % 3 - val p1 = (channel.offset + 1) % 3 + val p0 = (channel.index + 2) % 3 + val p1 = (channel.index + 1) % 3 - for (i in source.r.indices) { - source.data[channel.offset][i] = protectionMethod - .compute(source.data[p0][i], source.data[p1][i], source.data[channel.offset][i], amount) + for (i in source.red.indices) { + source.data[channel.index][i] = protectionMethod + .compute(source.data[p0][i], source.data[p1][i], source.data[channel.index][i], amount) } return source diff --git a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/VerticalFlip.kt b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/VerticalFlip.kt similarity index 82% rename from nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/VerticalFlip.kt rename to nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/VerticalFlip.kt index a7448fd16..cb0261b17 100644 --- a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/VerticalFlip.kt +++ b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/VerticalFlip.kt @@ -1,7 +1,7 @@ -package nebulosa.imaging.algorithms.transformation +package nebulosa.image.algorithms.transformation -import nebulosa.imaging.Image -import nebulosa.imaging.algorithms.TransformAlgorithm +import nebulosa.image.Image +import nebulosa.image.algorithms.TransformAlgorithm data object VerticalFlip : TransformAlgorithm { diff --git a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/convolution/Blur.kt b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/convolution/Blur.kt similarity index 75% rename from nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/convolution/Blur.kt rename to nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/convolution/Blur.kt index d65160672..cd5ec4d22 100644 --- a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/convolution/Blur.kt +++ b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/convolution/Blur.kt @@ -1,4 +1,4 @@ -package nebulosa.imaging.algorithms.transformation.convolution +package nebulosa.image.algorithms.transformation.convolution data object Blur : Convolution( floatArrayOf( diff --git a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/convolution/Convolution.kt b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/convolution/Convolution.kt similarity index 95% rename from nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/convolution/Convolution.kt rename to nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/convolution/Convolution.kt index 019fa2bba..a9022c0ee 100644 --- a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/convolution/Convolution.kt +++ b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/convolution/Convolution.kt @@ -1,7 +1,7 @@ -package nebulosa.imaging.algorithms.transformation.convolution +package nebulosa.image.algorithms.transformation.convolution -import nebulosa.imaging.Image -import nebulosa.imaging.algorithms.TransformAlgorithm +import nebulosa.image.Image +import nebulosa.image.algorithms.TransformAlgorithm import kotlin.math.max import kotlin.math.min diff --git a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/convolution/ConvolutionKernel.kt b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/convolution/ConvolutionKernel.kt similarity index 69% rename from nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/convolution/ConvolutionKernel.kt rename to nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/convolution/ConvolutionKernel.kt index 46c5c2e00..c0979fb2f 100644 --- a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/convolution/ConvolutionKernel.kt +++ b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/convolution/ConvolutionKernel.kt @@ -1,4 +1,4 @@ -package nebulosa.imaging.algorithms.transformation.convolution +package nebulosa.image.algorithms.transformation.convolution interface ConvolutionKernel { diff --git a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/convolution/Edges.kt b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/convolution/Edges.kt similarity index 66% rename from nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/convolution/Edges.kt rename to nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/convolution/Edges.kt index 938ad6acd..abc2f56c0 100644 --- a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/convolution/Edges.kt +++ b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/convolution/Edges.kt @@ -1,4 +1,4 @@ -package nebulosa.imaging.algorithms.transformation.convolution +package nebulosa.image.algorithms.transformation.convolution data object Edges : Convolution( floatArrayOf( diff --git a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/convolution/Emboss.kt b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/convolution/Emboss.kt similarity index 65% rename from nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/convolution/Emboss.kt rename to nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/convolution/Emboss.kt index 942016324..553b8c9a0 100644 --- a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/convolution/Emboss.kt +++ b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/convolution/Emboss.kt @@ -1,4 +1,4 @@ -package nebulosa.imaging.algorithms.transformation.convolution +package nebulosa.image.algorithms.transformation.convolution data object Emboss : Convolution( floatArrayOf( diff --git a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/convolution/GaussianBlur.kt b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/convolution/GaussianBlur.kt similarity index 94% rename from nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/convolution/GaussianBlur.kt rename to nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/convolution/GaussianBlur.kt index e2eb4af0b..0601d084d 100644 --- a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/convolution/GaussianBlur.kt +++ b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/convolution/GaussianBlur.kt @@ -1,4 +1,4 @@ -package nebulosa.imaging.algorithms.transformation.convolution +package nebulosa.image.algorithms.transformation.convolution import kotlin.math.exp diff --git a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/convolution/MatrixConvolutionKernel.kt b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/convolution/MatrixConvolutionKernel.kt similarity index 84% rename from nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/convolution/MatrixConvolutionKernel.kt rename to nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/convolution/MatrixConvolutionKernel.kt index 927eda989..2d7022d32 100644 --- a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/convolution/MatrixConvolutionKernel.kt +++ b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/convolution/MatrixConvolutionKernel.kt @@ -1,4 +1,4 @@ -package nebulosa.imaging.algorithms.transformation.convolution +package nebulosa.image.algorithms.transformation.convolution import kotlin.math.sqrt diff --git a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/convolution/Mean.kt b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/convolution/Mean.kt similarity index 65% rename from nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/convolution/Mean.kt rename to nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/convolution/Mean.kt index 47605e0e6..cbb07ac9a 100644 --- a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/convolution/Mean.kt +++ b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/convolution/Mean.kt @@ -1,4 +1,4 @@ -package nebulosa.imaging.algorithms.transformation.convolution +package nebulosa.image.algorithms.transformation.convolution data object Mean : Convolution( floatArrayOf( diff --git a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/convolution/Sharpen.kt b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/convolution/Sharpen.kt similarity index 66% rename from nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/convolution/Sharpen.kt rename to nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/convolution/Sharpen.kt index 07f08d63a..70260b2c2 100644 --- a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/convolution/Sharpen.kt +++ b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/convolution/Sharpen.kt @@ -1,4 +1,4 @@ -package nebulosa.imaging.algorithms.transformation.convolution +package nebulosa.image.algorithms.transformation.convolution data object Sharpen : Convolution( floatArrayOf( diff --git a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/correction/BiasSubtraction.kt b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/correction/BiasSubtraction.kt similarity index 80% rename from nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/correction/BiasSubtraction.kt rename to nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/correction/BiasSubtraction.kt index a0d686aaa..236c3d2c2 100644 --- a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/correction/BiasSubtraction.kt +++ b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/correction/BiasSubtraction.kt @@ -1,8 +1,8 @@ -package nebulosa.imaging.algorithms.transformation.correction +package nebulosa.image.algorithms.transformation.correction -import nebulosa.imaging.Image -import nebulosa.imaging.ImageChannel -import nebulosa.imaging.algorithms.TransformAlgorithm +import nebulosa.image.Image +import nebulosa.image.algorithms.TransformAlgorithm +import nebulosa.image.format.ImageChannel import kotlin.math.max data class BiasSubtraction(private val biasFrame: Image) : TransformAlgorithm { diff --git a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/correction/DarkSubtraction.kt b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/correction/DarkSubtraction.kt similarity index 80% rename from nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/correction/DarkSubtraction.kt rename to nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/correction/DarkSubtraction.kt index 91832d845..7a092333d 100644 --- a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/correction/DarkSubtraction.kt +++ b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/correction/DarkSubtraction.kt @@ -1,8 +1,8 @@ -package nebulosa.imaging.algorithms.transformation.correction +package nebulosa.image.algorithms.transformation.correction -import nebulosa.imaging.Image -import nebulosa.imaging.ImageChannel -import nebulosa.imaging.algorithms.TransformAlgorithm +import nebulosa.image.Image +import nebulosa.image.algorithms.TransformAlgorithm +import nebulosa.image.format.ImageChannel import kotlin.math.max data class DarkSubtraction(private val darkFrame: Image) : TransformAlgorithm { diff --git a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/correction/FlatCorrection.kt b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/correction/FlatCorrection.kt similarity index 78% rename from nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/correction/FlatCorrection.kt rename to nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/correction/FlatCorrection.kt index 7eae74606..785d7029f 100644 --- a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/correction/FlatCorrection.kt +++ b/nebulosa-image/src/main/kotlin/nebulosa/image/algorithms/transformation/correction/FlatCorrection.kt @@ -1,9 +1,9 @@ -package nebulosa.imaging.algorithms.transformation.correction +package nebulosa.image.algorithms.transformation.correction -import nebulosa.imaging.Image -import nebulosa.imaging.ImageChannel -import nebulosa.imaging.algorithms.TransformAlgorithm -import nebulosa.imaging.algorithms.computation.Statistics +import nebulosa.image.Image +import nebulosa.image.algorithms.TransformAlgorithm +import nebulosa.image.algorithms.computation.Statistics +import nebulosa.image.format.ImageChannel data class FlatCorrection(private val flatFrame: Image) : TransformAlgorithm { diff --git a/nebulosa-imaging/src/test/kotlin/ComputationAlgorithmTest.kt b/nebulosa-image/src/test/kotlin/ComputationAlgorithmTest.kt similarity index 86% rename from nebulosa-imaging/src/test/kotlin/ComputationAlgorithmTest.kt rename to nebulosa-image/src/test/kotlin/ComputationAlgorithmTest.kt index 45dea772d..1ade07c95 100644 --- a/nebulosa-imaging/src/test/kotlin/ComputationAlgorithmTest.kt +++ b/nebulosa-image/src/test/kotlin/ComputationAlgorithmTest.kt @@ -2,21 +2,22 @@ import io.kotest.matchers.floats.plusOrMinus import io.kotest.matchers.floats.shouldBeExactly import io.kotest.matchers.ints.shouldBeExactly import io.kotest.matchers.shouldBe -import nebulosa.imaging.Image -import nebulosa.imaging.ImageChannel -import nebulosa.imaging.algorithms.computation.MedianAbsoluteDeviation -import nebulosa.imaging.algorithms.computation.Statistics -import nebulosa.test.FitsStringSpec +import nebulosa.fits.fits +import nebulosa.image.Image +import nebulosa.image.algorithms.computation.MedianAbsoluteDeviation +import nebulosa.image.algorithms.computation.Statistics +import nebulosa.image.format.ImageChannel +import nebulosa.test.AbstractFitsAndXisfTest -class ComputationAlgorithmTest : FitsStringSpec() { +class ComputationAlgorithmTest : AbstractFitsAndXisfTest() { init { "mono:median absolute deviation" { - val mImage = Image.open(NGC3344_MONO_F32) + val mImage = Image.open(NGC3344_MONO_F32_FITS.fits()) mImage.compute(MedianAbsoluteDeviation()) shouldBe (0.0862f plusOrMinus 1e-4f) } "mono:statistics" { - val mImage = Image.open(NGC3344_MONO_F32) + val mImage = Image.open(NGC3344_MONO_F32_FITS.fits()) val statistics = mImage.compute(Statistics.GRAY) statistics.count shouldBeExactly 65536 @@ -31,13 +32,13 @@ class ComputationAlgorithmTest : FitsStringSpec() { statistics.maximum shouldBeExactly 1f } "color:median absolute deviation" { - val cImage = Image.open(NGC3344_COLOR_F32) + val cImage = Image.open(NGC3344_COLOR_F32_FITS.fits()) cImage.compute(MedianAbsoluteDeviation(channel = ImageChannel.RED)) shouldBe (0.0823f plusOrMinus 1e-4f) cImage.compute(MedianAbsoluteDeviation(channel = ImageChannel.GREEN)) shouldBe (0.0745f plusOrMinus 1e-4f) cImage.compute(MedianAbsoluteDeviation(channel = ImageChannel.BLUE)) shouldBe (0.0705f plusOrMinus 1e-4f) } "color:statistics" { - val cImage = Image.open(NGC3344_COLOR_F32) + val cImage = Image.open(NGC3344_COLOR_F32_FITS.fits()) run { val statistics = cImage.compute(Statistics.RED) diff --git a/nebulosa-image/src/test/kotlin/FitsTransformAlgorithmTest.kt b/nebulosa-image/src/test/kotlin/FitsTransformAlgorithmTest.kt new file mode 100644 index 000000000..855fc06ea --- /dev/null +++ b/nebulosa-image/src/test/kotlin/FitsTransformAlgorithmTest.kt @@ -0,0 +1,303 @@ +import io.kotest.matchers.booleans.shouldBeFalse +import io.kotest.matchers.booleans.shouldBeTrue +import io.kotest.matchers.ints.shouldBeExactly +import io.kotest.matchers.nulls.shouldBeNull +import io.kotest.matchers.nulls.shouldNotBeNull +import io.kotest.matchers.shouldBe +import nebulosa.fits.fits +import nebulosa.image.Image +import nebulosa.image.algorithms.transformation.* +import nebulosa.image.algorithms.transformation.convolution.* +import nebulosa.image.format.ImageChannel +import nebulosa.test.AbstractFitsAndXisfTest + +class FitsTransformAlgorithmTest : AbstractFitsAndXisfTest() { + + init { + "mono:raw" { + val mImage = Image.open(NGC3344_MONO_8_FITS.fits()) + mImage.save("fits-mono-raw").second shouldBe "e17cfc29c3b343409cd8617b6913330e" + } + "mono:vertical flip" { + val mImage = Image.open(NGC3344_MONO_8_FITS.fits()) + mImage.transform(VerticalFlip) + mImage.save("fits-mono-vertical-flip").second shouldBe "262260dfe719726c0e7829a088279a21" + } + "mono:horizontal flip" { + val mImage = Image.open(NGC3344_MONO_8_FITS.fits()) + mImage.transform(HorizontalFlip) + mImage.save("fits-mono-horizontal-flip").second shouldBe "daf0f05db5de3750962f338527564b27" + } + "mono:vertical & horizontal flip" { + val mImage = Image.open(NGC3344_MONO_8_FITS.fits()) + mImage.transform(VerticalFlip, HorizontalFlip) + mImage.save("fits-mono-vertical-horizontal-flip").second shouldBe "3bc81f579a0e34ce9312c3b242209166" + } + "mono:subframe" { + val mImage = Image.open(NGC3344_MONO_8_FITS.fits()) + val nImage = mImage.transform(SubFrame(45, 70, 16, 16)) + nImage.width shouldBeExactly 16 + nImage.height shouldBeExactly 16 + nImage.mono.shouldBeTrue() + nImage.save("fits-mono-subframe").second shouldBe "4d9984e778f82dde10b9aeeee7a29fe0" + } + "mono:sharpen" { + val mImage = Image.open(NGC3344_MONO_8_FITS.fits()) + mImage.transform(Sharpen) + mImage.save("fits-mono-sharpen").second shouldBe "0b162242a4e673f6480b5206cf49ca50" + } + "mono:mean" { + val mImage = Image.open(NGC3344_MONO_8_FITS.fits()) + mImage.transform(Mean) + mImage.save("fits-mono-mean").second shouldBe "cf866292f657c379ae3965931dd8eeea" + } + "mono:invert" { + val mImage = Image.open(NGC3344_MONO_8_FITS.fits()) + mImage.transform(Invert) + mImage.save("fits-mono-invert").second shouldBe "6e94463bb5b9561de1f0ee0a154db53e" + } + "mono:emboss" { + val mImage = Image.open(NGC3344_MONO_8_FITS.fits()) + mImage.transform(Emboss) + mImage.save("fits-mono-emboss").second shouldBe "94a8ef5e4573e392d087cf10c905ba12" + } + "mono:edges" { + val mImage = Image.open(NGC3344_MONO_8_FITS.fits()) + mImage.transform(Edges) + mImage.save("fits-mono-edges").second shouldBe "27ccd5f5e6098d0cae27e7495e18dd72" + } + "mono:blur" { + val mImage = Image.open(NGC3344_MONO_8_FITS.fits()) + mImage.transform(Blur) + mImage.save("fits-mono-blur").second shouldBe "f2c5466dccf71b5c4bee86c5fbbb95fc" + } + "mono:gaussian blur" { + val mImage = Image.open(NGC3344_MONO_8_FITS.fits()) + mImage.transform(GaussianBlur(sigma = 5.0, size = 9)) + mImage.save("fits-mono-gaussian-blur").second shouldBe "69057b0c4461fb0d55b779da9e72fd69" + } + "mono:STF:midtone = 0.1, shadow = 0.0, highlight = 1.0" { + val mImage = Image.open(NGC3344_MONO_8_FITS.fits()) + mImage.transform(ScreenTransformFunction(0.1f)) + mImage.save("fits-mono-stf-01-00-10").second shouldBe "22c0bd985e70a01330722d912869d6ee" + } + "mono:STF:midtone = 0.9, shadow = 0.0, highlight = 1.0" { + val mImage = Image.open(NGC3344_MONO_8_FITS.fits()) + mImage.transform(ScreenTransformFunction(0.9f)) + mImage.save("fits-mono-stf-09-00-10").second shouldBe "553ccb7546dce3a8f742d5e8f7c58a3f" + } + "mono:STF:midtone = 0.1, shadow = 0.5, highlight = 1.0" { + val mImage = Image.open(NGC3344_MONO_8_FITS.fits()) + mImage.transform(ScreenTransformFunction(0.1f, shadow = 0.5f)) + mImage.save("fits-mono-stf-01-05-10").second shouldBe "f31db854fab72033dce2f8c572ec6783" + } + "mono:STF:midtone = 0.9, shadow = 0.5, highlight = 1.0" { + val mImage = Image.open(NGC3344_MONO_8_FITS.fits()) + mImage.transform(ScreenTransformFunction(0.9f, shadow = 0.5f)) + mImage.save("fits-mono-stf-09-05-10").second shouldBe "633b49c4a1dbb5ad8e6a9d74f330636d" + } + "mono:STF:midtone = 0.1, shadow = 0.0, highlight = 0.5" { + val mImage = Image.open(NGC3344_MONO_8_FITS.fits()) + mImage.transform(ScreenTransformFunction(0.1f, highlight = 0.5f)) + mImage.save("fits-mono-stf-01-00-05").second shouldBe "26036937eb3e5f99cd6129f709ce4b31" + } + "mono:STF:midtone = 0.9, shadow = 0.0, highlight = 0.5" { + val mImage = Image.open(NGC3344_MONO_8_FITS.fits()) + mImage.transform(ScreenTransformFunction(0.9f, highlight = 0.5f)) + mImage.save("fits-mono-stf-09-00-05").second shouldBe "e8f694dae666ac15ce2f8a169eb84024" + } + "mono:STF:midtone = 0.1, shadow = 0.4, highlight = 0.6" { + val mImage = Image.open(NGC3344_MONO_8_FITS.fits()) + mImage.transform(ScreenTransformFunction(0.1f, 0.4f, 0.6f)) + mImage.save("fits-mono-stf-01-04-06").second shouldBe "5226aba21669a24f985703b3e7220568" + } + "mono:STF:midtone = 0.9, shadow = 0.4, highlight = 0.6" { + val mImage = Image.open(NGC3344_MONO_8_FITS.fits()) + mImage.transform(ScreenTransformFunction(0.9f, 0.4f, 0.6f)) + mImage.save("fits-mono-stf-09-04-06").second shouldBe "c2acb25ef7be92a51f63e673ec9a850f" + } + "mono:auto STF" { + val mImage = Image.open(NGC3344_MONO_8_FITS.fits()) + mImage.transform(AutoScreenTransformFunction) + mImage.save("fits-mono-auto-stf").second shouldBe "e17cfc29c3b343409cd8617b6913330e" + } + "!mono:reload" { + val mImage0 = Image.open(NGC3344_MONO_8_FITS.fits()) + + val mImage1 = Image.open(NGC3344_MONO_8_FITS.fits()) + mImage1.transform(Invert) + + mImage0.load(mImage1.hdu) + mImage0.save("fits-mono-reload").second shouldBe "6e94463bb5b9561de1f0ee0a154db53e" + } + "color:raw" { + val mImage = Image.open(NGC3344_COLOR_32_FITS.fits()) + mImage.save("fits-color-raw").second shouldBe "18fb83e240bc7a4cbafbc1aba2741db6" + } + "color:vertical flip" { + val mImage = Image.open(NGC3344_COLOR_32_FITS.fits()) + mImage.transform(VerticalFlip) + mImage.save("fits-color-vertical-flip").second shouldBe "b717ecda5c5bba50cfa06304ef2bca88" + } + "color:horizontal flip" { + val mImage = Image.open(NGC3344_COLOR_32_FITS.fits()) + mImage.transform(HorizontalFlip) + mImage.save("fits-color-horizontal-flip").second shouldBe "f70228600c77551473008ed4b9986439" + } + "color:vertical & horizontal flip" { + val mImage = Image.open(NGC3344_COLOR_32_FITS.fits()) + mImage.transform(VerticalFlip, HorizontalFlip) + mImage.save("fits-color-vertical-horizontal-flip").second shouldBe "1237314044f20307b76203148af855e3" + } + "color:subframe" { + val mImage = Image.open(NGC3344_COLOR_32_FITS.fits()) + val nImage = mImage.transform(SubFrame(45, 70, 16, 16)) + nImage.width shouldBeExactly 16 + nImage.height shouldBeExactly 16 + nImage.mono.shouldBeFalse() + nImage.save("fits-color-subframe").second shouldBe "282fc4fdf9142fcb4b18e1df1eef4caa" + } + "color:sharpen" { + val mImage = Image.open(NGC3344_COLOR_32_FITS.fits()) + mImage.transform(Sharpen) + mImage.save("fits-color-sharpen").second shouldBe "e562282bdafdeba6ce88981bb9c3ba61" + } + "color:mean" { + val mImage = Image.open(NGC3344_COLOR_32_FITS.fits()) + mImage.transform(Mean) + mImage.save("fits-color-mean").second shouldBe "a8380d928aaa756e202ba43bd3a2f207" + } + "color:invert" { + val mImage = Image.open(NGC3344_COLOR_32_FITS.fits()) + mImage.transform(Invert) + mImage.save("fits-color-invert").second shouldBe "decad269ec26450aebeaf7546867b5f8" + } + "color:emboss" { + val mImage = Image.open(NGC3344_COLOR_32_FITS.fits()) + mImage.transform(Emboss) + mImage.save("fits-color-emboss").second shouldBe "58d69250f1233055aa33f9ec7ca40af1" + } + "color:edges" { + val mImage = Image.open(NGC3344_COLOR_32_FITS.fits()) + mImage.transform(Edges) + mImage.save("fits-color-edges").second shouldBe "091f2955740a8edcd2401dc416d19d51" + } + "color:blur" { + val mImage = Image.open(NGC3344_COLOR_32_FITS.fits()) + mImage.transform(Blur) + mImage.save("fits-color-blur").second shouldBe "0fca440b763de5380fa29de736f3c792" + } + "color:gaussian blur" { + val mImage = Image.open(NGC3344_COLOR_32_FITS.fits()) + mImage.transform(GaussianBlur(sigma = 5.0, size = 9)) + mImage.save("fits-color-gaussian-blur").second shouldBe "394d1a4f136f15c802dd73004c421d64" + } + "color:STF:midtone = 0.1, shadow = 0.0, highlight = 1.0" { + val mImage = Image.open(NGC3344_COLOR_32_FITS.fits()) + mImage.transform(ScreenTransformFunction(0.1f)) + mImage.save("fits-color-stf-01-00-10").second shouldBe "e952bd263df6fd275b9a80aca554cb4b" + } + "color:STF:midtone = 0.9, shadow = 0.0, highlight = 1.0" { + val mImage = Image.open(NGC3344_COLOR_32_FITS.fits()) + mImage.transform(ScreenTransformFunction(0.9f)) + mImage.save("fits-color-stf-09-00-10").second shouldBe "038809d7612018e2e5c19d5e1f551abd" + } + "color:STF:midtone = 0.1, shadow = 0.5, highlight = 1.0" { + val mImage = Image.open(NGC3344_COLOR_32_FITS.fits()) + mImage.transform(ScreenTransformFunction(0.1f, shadow = 0.5f)) + mImage.save("fits-color-stf-01-05-10").second shouldBe "70e812260f56f8621002327575611f31" + } + "color:STF:midtone = 0.9, shadow = 0.5, highlight = 1.0" { + val mImage = Image.open(NGC3344_COLOR_32_FITS.fits()) + mImage.transform(ScreenTransformFunction(0.9f, shadow = 0.5f)) + mImage.save("fits-color-stf-09-05-10").second shouldBe "6ca400f617f466a9eb02a3a6f2985d99" + } + "color:STF:midtone = 0.1, shadow = 0.0, highlight = 0.5" { + val mImage = Image.open(NGC3344_COLOR_32_FITS.fits()) + mImage.transform(ScreenTransformFunction(0.1f, highlight = 0.5f)) + mImage.save("fits-color-stf-01-00-05").second shouldBe "3cd98ee9a8949d5100295acccd77010b" + } + "color:STF:midtone = 0.9, shadow = 0.0, highlight = 0.5" { + val mImage = Image.open(NGC3344_COLOR_32_FITS.fits()) + mImage.transform(ScreenTransformFunction(0.9f, highlight = 0.5f)) + mImage.save("fits-color-stf-09-00-05").second shouldBe "2cfeffc88c893cc5883d8a2221f29b91" + } + "color:STF:midtone = 0.1, shadow = 0.4, highlight = 0.6" { + val mImage = Image.open(NGC3344_COLOR_32_FITS.fits()) + mImage.transform(ScreenTransformFunction(0.1f, 0.4f, 0.6f)) + mImage.save("fits-color-stf-01-04-06").second shouldBe "532a07a1a166eb007c2e40651aec2097" + } + "color:STF:midtone = 0.9, shadow = 0.4, highlight = 0.6" { + val mImage = Image.open(NGC3344_COLOR_32_FITS.fits()) + mImage.transform(ScreenTransformFunction(0.9f, 0.4f, 0.6f)) + mImage.save("fits-color-stf-09-04-06").second shouldBe "eb3d940d9fd2c8814e930715e89897c4" + } + "color:auto STF" { + val mImage = Image.open(NGC3344_COLOR_32_FITS.fits()) + mImage.transform(AutoScreenTransformFunction) + mImage.save("fits-color-auto-stf").second shouldBe "a9c3657d8597b927607eb438e666d3a0" + } + "color:SCNR Maximum Mask" { + val mImage = Image.open(NGC3344_COLOR_32_FITS.fits()) + mImage.transform(SubtractiveChromaticNoiseReduction(ImageChannel.RED, 1f, ProtectionMethod.MAXIMUM_MASK)) + mImage.save("fits-color-scnr-maximum-mask").second shouldBe "e7d2155e18ff1e3172f4e849ae983145" + } + "color:SCNR Additive Mask" { + val mImage = Image.open(NGC3344_COLOR_32_FITS.fits()) + mImage.transform(SubtractiveChromaticNoiseReduction(ImageChannel.RED, 1f, ProtectionMethod.ADDITIVE_MASK)) + mImage.save("fits-color-scnr-additive-mask").second shouldBe "a458c44cedcda704de16d80053fd87eb" + } + "color:SCNR Average Neutral" { + val mImage = Image.open(NGC3344_COLOR_32_FITS.fits()) + mImage.transform(SubtractiveChromaticNoiseReduction(ImageChannel.RED, 1f, ProtectionMethod.AVERAGE_NEUTRAL)) + mImage.save("fits-color-scnr-average-neutral").second shouldBe "e07345ffc4982a62301c95c76d3efb35" + } + "color:SCNR Maximum Neutral" { + val mImage = Image.open(NGC3344_COLOR_32_FITS.fits()) + mImage.transform(SubtractiveChromaticNoiseReduction(ImageChannel.RED, 1f, ProtectionMethod.MAXIMUM_NEUTRAL)) + mImage.save("fits-color-scnr-maximum-neutral").second shouldBe "a1d4b04f57b001ba4a996bab0407fd7e" + } + "color:SCNR Minimum Neutral" { + val mImage = Image.open(NGC3344_COLOR_32_FITS.fits()) + mImage.transform(SubtractiveChromaticNoiseReduction(ImageChannel.RED, 1f, ProtectionMethod.MINIMUM_NEUTRAL)) + mImage.save("fits-color-scnr-minimum-neutral").second shouldBe "8b7be57ff38da9c97b35d7888047c0f9" + } + "color:grayscale BT-709" { + val mImage = Image.open(NGC3344_COLOR_32_FITS.fits()) + val nImage = mImage.transform(Grayscale.BT709) + nImage.save("fits-color-grayscale-bt709").second shouldBe "cab675aa35390a2d58cd48555d91054f" + } + "color:grayscale RMY" { + val mImage = Image.open(NGC3344_COLOR_32_FITS.fits()) + val nImage = mImage.transform(Grayscale.RMY) + nImage.save("fits-color-grayscale-rmy").second shouldBe "e113627002a4178d1010a2f6246e325f" + } + "color:grayscale Y" { + val mImage = Image.open(NGC3344_COLOR_32_FITS.fits()) + val nImage = mImage.transform(Grayscale.Y) + nImage.save("fits-color-grayscale-y").second shouldBe "24dd4a7e0fa9e4be34c53c924a78a940" + } + "color:debayer" { + val mImage = Image.open(DEBAYER_FITS.fits()) + val nImage = mImage.transform(AutoScreenTransformFunction) + nImage.save("fits-color-debayer").second shouldBe "86b5bdd67dfd6bbf5495afae4bf2bc04" + } + "color:no-debayer" { + val mImage = Image.open(DEBAYER_FITS.fits(), false) + val nImage = mImage.transform(AutoScreenTransformFunction) + nImage.save("fits-color-no-debayer").second shouldBe "958ccea020deec1f0c075042a9ba37c3" + } + "color:reload" { + val mImage0 = Image.open(NGC3344_COLOR_32_FITS.fits()) + var mImage1 = Image.open(DEBAYER_FITS.fits()) + + mImage1.load(mImage0.hdu).shouldNotBeNull() + mImage1.save("fits-color-reload").second shouldBe "18fb83e240bc7a4cbafbc1aba2741db6" + + mImage1 = Image.open(DEBAYER_FITS.fits(), false) + + mImage1.load(mImage0.hdu).shouldBeNull() + mImage0.load(mImage1.hdu).shouldBeNull() + } + } +} diff --git a/nebulosa-imaging/src/test/kotlin/HFDTest.kt b/nebulosa-image/src/test/kotlin/HFDTest.kt similarity index 86% rename from nebulosa-imaging/src/test/kotlin/HFDTest.kt rename to nebulosa-image/src/test/kotlin/HFDTest.kt index 5d80bc958..c5f4305a8 100644 --- a/nebulosa-imaging/src/test/kotlin/HFDTest.kt +++ b/nebulosa-image/src/test/kotlin/HFDTest.kt @@ -1,10 +1,11 @@ import io.kotest.matchers.floats.plusOrMinus import io.kotest.matchers.shouldBe -import nebulosa.imaging.Image -import nebulosa.imaging.algorithms.computation.hfd.HFD -import nebulosa.test.FitsStringSpec +import nebulosa.fits.fits +import nebulosa.image.Image +import nebulosa.image.algorithms.computation.hfd.HFD +import nebulosa.test.AbstractFitsAndXisfTest -class HFDTest : FitsStringSpec() { +class HFDTest : AbstractFitsAndXisfTest() { init { "focus" { @@ -29,7 +30,7 @@ class HFDTest : FitsStringSpec() { ) for ((first, second) in starFocus) { - val focusImage = Image.open(first) + val focusImage = Image.open(closeAfterEach(first.fits())) val star = focusImage.compute(HFD(focusImage.width / 2, focusImage.height / 2, 50)) star.hfd shouldBe (second[0] plusOrMinus 0.1f) star.snr shouldBe (second[1] plusOrMinus 0.1f) diff --git a/nebulosa-image/src/test/kotlin/XisfTransformAlgorithmTest.kt b/nebulosa-image/src/test/kotlin/XisfTransformAlgorithmTest.kt new file mode 100644 index 000000000..a50872f8a --- /dev/null +++ b/nebulosa-image/src/test/kotlin/XisfTransformAlgorithmTest.kt @@ -0,0 +1,303 @@ +import io.kotest.matchers.booleans.shouldBeFalse +import io.kotest.matchers.booleans.shouldBeTrue +import io.kotest.matchers.ints.shouldBeExactly +import io.kotest.matchers.nulls.shouldBeNull +import io.kotest.matchers.nulls.shouldNotBeNull +import io.kotest.matchers.shouldBe +import nebulosa.image.Image +import nebulosa.image.algorithms.transformation.* +import nebulosa.image.algorithms.transformation.convolution.* +import nebulosa.image.format.ImageChannel +import nebulosa.test.AbstractFitsAndXisfTest +import nebulosa.xisf.xisf + +class XisfTransformAlgorithmTest : AbstractFitsAndXisfTest() { + + init { + "mono:raw" { + val mImage = Image.open(M82_MONO_8_XISF.xisf()) + mImage.save("xisf-mono-raw").second shouldBe "0dca7efedef5b3525f8037f401518b0b" + } + "mono:vertical flip" { + val mImage = Image.open(M82_MONO_8_XISF.xisf()) + mImage.transform(VerticalFlip) + mImage.save("xisf-mono-vertical-flip").second shouldBe "d8250e5ac45d9a6ec04bed2a583a70b2" + } + "mono:horizontal flip" { + val mImage = Image.open(M82_MONO_8_XISF.xisf()) + mImage.transform(HorizontalFlip) + mImage.save("xisf-mono-horizontal-flip").second shouldBe "9e2a05c331a5daeff20671a365e8b74c" + } + "mono:vertical & horizontal flip" { + val mImage = Image.open(M82_MONO_8_XISF.xisf()) + mImage.transform(VerticalFlip, HorizontalFlip) + mImage.save("xisf-mono-vertical-horizontal-flip").second shouldBe "c7d55e870850c10619f389e3f9ec1243" + } + "mono:subframe" { + val mImage = Image.open(M82_MONO_8_XISF.xisf()) + val nImage = mImage.transform(SubFrame(45, 70, 16, 16)) + nImage.width shouldBeExactly 16 + nImage.height shouldBeExactly 16 + nImage.mono.shouldBeTrue() + nImage.save("xisf-mono-subframe").second shouldBe "dc0ca19c5d40f90e4daac87fbab8f449" + } + "mono:sharpen" { + val mImage = Image.open(M82_MONO_8_XISF.xisf()) + mImage.transform(Sharpen) + mImage.save("xisf-mono-sharpen").second shouldBe "08421f6afef422cdaa9f464a860808ce" + } + "mono:mean" { + val mImage = Image.open(M82_MONO_8_XISF.xisf()) + mImage.transform(Mean) + mImage.save("xisf-mono-mean").second shouldBe "4127027d467ce9537049dc5f25f23ede" + } + "mono:invert" { + val mImage = Image.open(M82_MONO_8_XISF.xisf()) + mImage.transform(Invert) + mImage.save("xisf-mono-invert").second shouldBe "a6ec4a55225cb18f004e159a60137fe9" + } + "mono:emboss" { + val mImage = Image.open(M82_MONO_8_XISF.xisf()) + mImage.transform(Emboss) + mImage.save("xisf-mono-emboss").second shouldBe "2f07b3964b52f6b141b8cc45639b2287" + } + "mono:edges" { + val mImage = Image.open(M82_MONO_8_XISF.xisf()) + mImage.transform(Edges) + mImage.save("xisf-mono-edges").second shouldBe "897af72d536bca57cce77f09e396adb7" + } + "mono:blur" { + val mImage = Image.open(M82_MONO_8_XISF.xisf()) + mImage.transform(Blur) + mImage.save("xisf-mono-blur").second shouldBe "5a850ef20c0ebd461e676523823ff6ea" + } + "mono:gaussian blur" { + val mImage = Image.open(M82_MONO_8_XISF.xisf()) + mImage.transform(GaussianBlur(sigma = 5.0, size = 9)) + mImage.save("xisf-mono-gaussian-blur").second shouldBe "cb7489cb1948e802ea4d92bba24e0739" + } + "mono:STF:midtone = 0.1, shadow = 0.0, highlight = 1.0" { + val mImage = Image.open(M82_MONO_8_XISF.xisf()) + mImage.transform(ScreenTransformFunction(0.1f)) + mImage.save("xisf-mono-stf-01-00-10").second shouldBe "91621dba5a58081347d156f2152bd8c6" + } + "mono:STF:midtone = 0.9, shadow = 0.0, highlight = 1.0" { + val mImage = Image.open(M82_MONO_8_XISF.xisf()) + mImage.transform(ScreenTransformFunction(0.9f)) + mImage.save("xisf-mono-stf-09-00-10").second shouldBe "9a67728cfc4f871ea8ab6557f381949e" + } + "mono:STF:midtone = 0.1, shadow = 0.5, highlight = 1.0" { + val mImage = Image.open(M82_MONO_8_XISF.xisf()) + mImage.transform(ScreenTransformFunction(0.1f, shadow = 0.5f)) + mImage.save("xisf-mono-stf-01-05-10").second shouldBe "c70b9caaaf88bba9c64891a2b3ba8033" + } + "mono:STF:midtone = 0.9, shadow = 0.5, highlight = 1.0" { + val mImage = Image.open(M82_MONO_8_XISF.xisf()) + mImage.transform(ScreenTransformFunction(0.9f, shadow = 0.5f)) + mImage.save("xisf-mono-stf-09-05-10").second shouldBe "4f4c49b96bd9aa417f22c59b8224ea90" + } + "mono:STF:midtone = 0.1, shadow = 0.0, highlight = 0.5" { + val mImage = Image.open(M82_MONO_8_XISF.xisf()) + mImage.transform(ScreenTransformFunction(0.1f, highlight = 0.5f)) + mImage.save("xisf-mono-stf-01-00-05").second shouldBe "b0c9598e3003d72a5fba617c30dc1821" + } + "mono:STF:midtone = 0.9, shadow = 0.0, highlight = 0.5" { + val mImage = Image.open(M82_MONO_8_XISF.xisf()) + mImage.transform(ScreenTransformFunction(0.9f, highlight = 0.5f)) + mImage.save("xisf-mono-stf-09-00-05").second shouldBe "5824ac8c2d44c2c8ff8121e0904bb77b" + } + "mono:STF:midtone = 0.1, shadow = 0.4, highlight = 0.6" { + val mImage = Image.open(M82_MONO_8_XISF.xisf()) + mImage.transform(ScreenTransformFunction(0.1f, 0.4f, 0.6f)) + mImage.save("xisf-mono-stf-01-04-06").second shouldBe "20417dfc43fc4c5cb425875614d8066c" + } + "mono:STF:midtone = 0.9, shadow = 0.4, highlight = 0.6" { + val mImage = Image.open(M82_MONO_8_XISF.xisf()) + mImage.transform(ScreenTransformFunction(0.9f, 0.4f, 0.6f)) + mImage.save("xisf-mono-stf-09-04-06").second shouldBe "13d13ad164a952a29f7ad76e1e51e7d0" + } + "mono:auto STF" { + val mImage = Image.open(M82_MONO_8_XISF.xisf()) + mImage.transform(AutoScreenTransformFunction) + mImage.save("xisf-mono-auto-stf").second shouldBe "9204a71df3770e8fe5ca49e3420eed72" + } + "!mono:reload" { + val mImage0 = Image.open(M82_MONO_8_XISF.xisf()) + + val mImage1 = Image.open(M82_MONO_8_XISF.xisf()) + mImage1.transform(Invert) + + mImage0.load(mImage1.hdu) + mImage0.save("xisf-mono-reload").second shouldBe "6e94463bb5b9561de1f0ee0a154db53e" + } + "color:raw" { + val mImage = Image.open(M82_COLOR_32_XISF.xisf()) + mImage.save("xisf-color-raw").second shouldBe "764e326cc5260d81f3761112ad6a1969" + } + "color:vertical flip" { + val mImage = Image.open(M82_COLOR_32_XISF.xisf()) + mImage.transform(VerticalFlip) + mImage.save("xisf-color-vertical-flip").second shouldBe "595d8d3e46e91d7adf7591e591a7a98d" + } + "color:horizontal flip" { + val mImage = Image.open(M82_COLOR_32_XISF.xisf()) + mImage.transform(HorizontalFlip) + mImage.save("xisf-color-horizontal-flip").second shouldBe "b3d9609ef88db9b9215b4e21fdd4992a" + } + "color:vertical & horizontal flip" { + val mImage = Image.open(M82_COLOR_32_XISF.xisf()) + mImage.transform(VerticalFlip, HorizontalFlip) + mImage.save("xisf-color-vertical-horizontal-flip").second shouldBe "1c9be1a7e5a66a989f6d0715c7ff30e4" + } + "color:subframe" { + val mImage = Image.open(M82_COLOR_32_XISF.xisf()) + val nImage = mImage.transform(SubFrame(45, 70, 16, 16)) + nImage.width shouldBeExactly 16 + nImage.height shouldBeExactly 16 + nImage.mono.shouldBeFalse() + nImage.save("xisf-color-subframe").second shouldBe "dcf5bc8908ea6a32a5e98f14152f47b9" + } + "color:sharpen" { + val mImage = Image.open(M82_COLOR_32_XISF.xisf()) + mImage.transform(Sharpen) + mImage.save("xisf-color-sharpen").second shouldBe "1017a88ff2caeb83a650d94d96c59347" + } + "color:mean" { + val mImage = Image.open(M82_COLOR_32_XISF.xisf()) + mImage.transform(Mean) + mImage.save("xisf-color-mean").second shouldBe "eb948cab18442d008381f392bf43542a" + } + "color:invert" { + val mImage = Image.open(M82_COLOR_32_XISF.xisf()) + mImage.transform(Invert) + mImage.save("xisf-color-invert").second shouldBe "bbc97cdcde240873439bc29ff1adf169" + } + "color:emboss" { + val mImage = Image.open(M82_COLOR_32_XISF.xisf()) + mImage.transform(Emboss) + mImage.save("xisf-color-emboss").second shouldBe "fba6827f204df93f4aaf2f99b113a8f7" + } + "color:edges" { + val mImage = Image.open(M82_COLOR_32_XISF.xisf()) + mImage.transform(Edges) + mImage.save("xisf-color-edges").second shouldBe "71d6b5c936ab8165c7c1b63514d2da7b" + } + "color:blur" { + val mImage = Image.open(M82_COLOR_32_XISF.xisf()) + mImage.transform(Blur) + mImage.save("xisf-color-blur").second shouldBe "5c9f738a309fc86956d124f0f109eea2" + } + "color:gaussian blur" { + val mImage = Image.open(M82_COLOR_32_XISF.xisf()) + mImage.transform(GaussianBlur(sigma = 5.0, size = 9)) + mImage.save("xisf-color-gaussian-blur").second shouldBe "648beabcea0b486efc3f0c4ded632a06" + } + "color:STF:midtone = 0.1, shadow = 0.0, highlight = 1.0" { + val mImage = Image.open(M82_COLOR_32_XISF.xisf()) + mImage.transform(ScreenTransformFunction(0.1f)) + mImage.save("xisf-color-stf-01-00-10").second shouldBe "d84577785e44179f7af7c00807be5260" + } + "color:STF:midtone = 0.9, shadow = 0.0, highlight = 1.0" { + val mImage = Image.open(M82_COLOR_32_XISF.xisf()) + mImage.transform(ScreenTransformFunction(0.9f)) + mImage.save("xisf-color-stf-09-00-10").second shouldBe "11771bfe0e180e1efea4568902109013" + } + "color:STF:midtone = 0.1, shadow = 0.5, highlight = 1.0" { + val mImage = Image.open(M82_COLOR_32_XISF.xisf()) + mImage.transform(ScreenTransformFunction(0.1f, shadow = 0.5f)) + mImage.save("xisf-color-stf-01-05-10").second shouldBe "4e3b204d8a7ed06dfd05b7d010ef267b" + } + "color:STF:midtone = 0.9, shadow = 0.5, highlight = 1.0" { + val mImage = Image.open(M82_COLOR_32_XISF.xisf()) + mImage.transform(ScreenTransformFunction(0.9f, shadow = 0.5f)) + mImage.save("xisf-color-stf-09-05-10").second shouldBe "95c5b801978abdbb51afc9d0de12c218" + } + "color:STF:midtone = 0.1, shadow = 0.0, highlight = 0.5" { + val mImage = Image.open(M82_COLOR_32_XISF.xisf()) + mImage.transform(ScreenTransformFunction(0.1f, highlight = 0.5f)) + mImage.save("xisf-color-stf-01-00-05").second shouldBe "08322042c9e57102fec77a06b28c263d" + } + "color:STF:midtone = 0.9, shadow = 0.0, highlight = 0.5" { + val mImage = Image.open(M82_COLOR_32_XISF.xisf()) + mImage.transform(ScreenTransformFunction(0.9f, highlight = 0.5f)) + mImage.save("xisf-color-stf-09-00-05").second shouldBe "c99990d3a4bc6fc3aa7a8ac90d452419" + } + "color:STF:midtone = 0.1, shadow = 0.4, highlight = 0.6" { + val mImage = Image.open(M82_COLOR_32_XISF.xisf()) + mImage.transform(ScreenTransformFunction(0.1f, 0.4f, 0.6f)) + mImage.save("xisf-color-stf-01-04-06").second shouldBe "33bce2d7f7cde67d0ee618439f438ee7" + } + "color:STF:midtone = 0.9, shadow = 0.4, highlight = 0.6" { + val mImage = Image.open(M82_COLOR_32_XISF.xisf()) + mImage.transform(ScreenTransformFunction(0.9f, 0.4f, 0.6f)) + mImage.save("xisf-color-stf-09-04-06").second shouldBe "923e56840bcea4462160e36f2e801f5e" + } + "color:auto STF" { + val mImage = Image.open(M82_COLOR_32_XISF.xisf()) + mImage.transform(AutoScreenTransformFunction) + mImage.save("xisf-color-auto-stf").second shouldBe "b1460451ad0f0580802d3d6d3a6750ba" + } + "color:SCNR Maximum Mask" { + val mImage = Image.open(M82_COLOR_32_XISF.xisf()) + mImage.transform(SubtractiveChromaticNoiseReduction(ImageChannel.RED, 1f, ProtectionMethod.MAXIMUM_MASK)) + mImage.save("xisf-color-scnr-maximum-mask").second shouldBe "e465a2fc0814055e089a3180c0235c8b" + } + "color:SCNR Additive Mask" { + val mImage = Image.open(M82_COLOR_32_XISF.xisf()) + mImage.transform(SubtractiveChromaticNoiseReduction(ImageChannel.RED, 1f, ProtectionMethod.ADDITIVE_MASK)) + mImage.save("xisf-color-scnr-additive-mask").second shouldBe "1016ec07253f869097d2d9c67194b3e3" + } + "color:SCNR Average Neutral" { + val mImage = Image.open(M82_COLOR_32_XISF.xisf()) + mImage.transform(SubtractiveChromaticNoiseReduction(ImageChannel.RED, 1f, ProtectionMethod.AVERAGE_NEUTRAL)) + mImage.save("xisf-color-scnr-average-neutral").second shouldBe "2f2583bfb2ae4a9e4441dc9b827196f7" + } + "color:SCNR Maximum Neutral" { + val mImage = Image.open(M82_COLOR_32_XISF.xisf()) + mImage.transform(SubtractiveChromaticNoiseReduction(ImageChannel.RED, 1f, ProtectionMethod.MAXIMUM_NEUTRAL)) + mImage.save("xisf-color-scnr-maximum-neutral").second shouldBe "dabd995db4fba052617b148b3700378d" + } + "color:SCNR Minimum Neutral" { + val mImage = Image.open(M82_COLOR_32_XISF.xisf()) + mImage.transform(SubtractiveChromaticNoiseReduction(ImageChannel.RED, 1f, ProtectionMethod.MINIMUM_NEUTRAL)) + mImage.save("xisf-color-scnr-minimum-neutral").second shouldBe "b92e5130ec2a44c0afd1ca3782261e47" + } + "color:grayscale BT-709" { + val mImage = Image.open(M82_COLOR_32_XISF.xisf()) + val nImage = mImage.transform(Grayscale.BT709) + nImage.save("xisf-color-grayscale-bt709").second shouldBe "bf78482866a0b3a216fa5262f28b0e5e" + } + "color:grayscale RMY" { + val mImage = Image.open(M82_COLOR_32_XISF.xisf()) + val nImage = mImage.transform(Grayscale.RMY) + nImage.save("xisf-color-grayscale-rmy").second shouldBe "e75085eea073811aef41624aab318b48" + } + "color:grayscale Y" { + val mImage = Image.open(M82_COLOR_32_XISF.xisf()) + val nImage = mImage.transform(Grayscale.Y) + nImage.save("xisf-color-grayscale-y").second shouldBe "7a2bef966d460742533a1c8c3a74f1c5" + } + "!color:debayer" { + val mImage = Image.open(DEBAYER_FITS.xisf()) + val nImage = mImage.transform(AutoScreenTransformFunction) + nImage.save("xisf-color-debayer").second shouldBe "86b5bdd67dfd6bbf5495afae4bf2bc04" + } + "!color:no-debayer" { + val mImage = Image.open(DEBAYER_FITS.xisf(), false) + val nImage = mImage.transform(AutoScreenTransformFunction) + nImage.save("xisf-color-no-debayer").second shouldBe "958ccea020deec1f0c075042a9ba37c3" + } + "!color:reload" { + val mImage0 = Image.open(M82_COLOR_32_XISF.xisf()) + var mImage1 = Image.open(DEBAYER_FITS.xisf()) + + mImage1.load(mImage0.hdu).shouldNotBeNull() + mImage1.save("xisf-color-reload").second shouldBe "18fb83e240bc7a4cbafbc1aba2741db6" + + mImage1 = Image.open(DEBAYER_FITS.xisf(), false) + + mImage1.load(mImage0.hdu).shouldBeNull() + mImage0.load(mImage1.hdu).shouldBeNull() + } + } +} diff --git a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/Invert.kt b/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/Invert.kt deleted file mode 100644 index 403595497..000000000 --- a/nebulosa-imaging/src/main/kotlin/nebulosa/imaging/algorithms/transformation/Invert.kt +++ /dev/null @@ -1,18 +0,0 @@ -package nebulosa.imaging.algorithms.transformation - -import nebulosa.imaging.Image -import nebulosa.imaging.algorithms.TransformAlgorithm - -data object Invert : TransformAlgorithm { - - override fun transform(source: Image): Image { - for (i in source.r.indices) source.r[i] = 1f - source.r[i] - - if (!source.mono) { - for (i in source.g.indices) source.g[i] = 1f - source.g[i] - for (i in source.b.indices) source.b[i] = 1f - source.b[i] - } - - return source - } -} diff --git a/nebulosa-imaging/src/test/kotlin/TransformAlgorithmTest.kt b/nebulosa-imaging/src/test/kotlin/TransformAlgorithmTest.kt deleted file mode 100644 index 954045d31..000000000 --- a/nebulosa-imaging/src/test/kotlin/TransformAlgorithmTest.kt +++ /dev/null @@ -1,283 +0,0 @@ -import io.kotest.matchers.booleans.shouldBeFalse -import io.kotest.matchers.booleans.shouldBeTrue -import io.kotest.matchers.ints.shouldBeExactly -import io.kotest.matchers.shouldBe -import nebulosa.fits.fits -import nebulosa.imaging.Image -import nebulosa.imaging.ImageChannel -import nebulosa.imaging.algorithms.transformation.* -import nebulosa.imaging.algorithms.transformation.convolution.* -import nebulosa.test.FitsStringSpec -import java.io.File - -class TransformAlgorithmTest : FitsStringSpec() { - - init { - "mono:raw" { - val mImage = Image.open(NGC3344_MONO_8) - mImage.save("mono-raw").second shouldBe "e17cfc29c3b343409cd8617b6913330e" - } - "mono:vertical flip" { - val mImage = Image.open(NGC3344_MONO_8) - mImage.transform(VerticalFlip) - mImage.save("mono-vertical-flip").second shouldBe "262260dfe719726c0e7829a088279a21" - } - "mono:horizontal flip" { - val mImage = Image.open(NGC3344_MONO_8) - mImage.transform(HorizontalFlip) - mImage.save("mono-horizontal-flip").second shouldBe "daf0f05db5de3750962f338527564b27" - } - "mono:vertical & horizontal flip" { - val mImage = Image.open(NGC3344_MONO_8) - mImage.transform(VerticalFlip, HorizontalFlip) - mImage.save("mono-vertical-horizontal-flip").second shouldBe "3bc81f579a0e34ce9312c3b242209166" - } - "mono:subframe" { - val mImage = Image.open(NGC3344_MONO_8) - val nImage = mImage.transform(SubFrame(45, 70, 16, 16)) - nImage.width shouldBeExactly 16 - nImage.height shouldBeExactly 16 - nImage.mono.shouldBeTrue() - nImage.save("mono-subframe").second shouldBe "4d9984e778f82dde10b9aeeee7a29fe0" - } - "mono:sharpen" { - val mImage = Image.open(NGC3344_MONO_8) - mImage.transform(Sharpen) - mImage.save("mono-sharpen").second shouldBe "0b162242a4e673f6480b5206cf49ca50" - } - "mono:mean" { - val mImage = Image.open(NGC3344_MONO_8) - mImage.transform(Mean) - mImage.save("mono-mean").second shouldBe "cf866292f657c379ae3965931dd8eeea" - } - "mono:invert" { - val mImage = Image.open(NGC3344_MONO_8) - mImage.transform(Invert) - mImage.save("mono-invert").second shouldBe "6e94463bb5b9561de1f0ee0a154db53e" - } - "mono:emboss" { - val mImage = Image.open(NGC3344_MONO_8) - mImage.transform(Emboss) - mImage.save("mono-emboss").second shouldBe "94a8ef5e4573e392d087cf10c905ba12" - } - "mono:edges" { - val mImage = Image.open(NGC3344_MONO_8) - mImage.transform(Edges) - mImage.save("mono-edges").second shouldBe "27ccd5f5e6098d0cae27e7495e18dd72" - } - "mono:blur" { - val mImage = Image.open(NGC3344_MONO_8) - mImage.transform(Blur) - mImage.save("mono-blur").second shouldBe "f2c5466dccf71b5c4bee86c5fbbb95fc" - } - "mono:gaussian blur" { - val mImage = Image.open(NGC3344_MONO_8) - mImage.transform(GaussianBlur(sigma = 5.0, size = 9)) - mImage.save("mono-gaussian-blur").second shouldBe "69057b0c4461fb0d55b779da9e72fd69" - } - "mono:STF:midtone = 0.1, shadow = 0.0, highlight = 1.0" { - val mImage = Image.open(NGC3344_MONO_8) - mImage.transform(ScreenTransformFunction(0.1f)) - mImage.save("mono-stf-01-00-10").second shouldBe "22c0bd985e70a01330722d912869d6ee" - } - "mono:STF:midtone = 0.9, shadow = 0.0, highlight = 1.0" { - val mImage = Image.open(NGC3344_MONO_8) - mImage.transform(ScreenTransformFunction(0.9f)) - mImage.save("mono-stf-09-00-10").second shouldBe "553ccb7546dce3a8f742d5e8f7c58a3f" - } - "mono:STF:midtone = 0.1, shadow = 0.5, highlight = 1.0" { - val mImage = Image.open(NGC3344_MONO_8) - mImage.transform(ScreenTransformFunction(0.1f, shadow = 0.5f)) - mImage.save("mono-stf-01-05-10").second shouldBe "f31db854fab72033dce2f8c572ec6783" - } - "mono:STF:midtone = 0.9, shadow = 0.5, highlight = 1.0" { - val mImage = Image.open(NGC3344_MONO_8) - mImage.transform(ScreenTransformFunction(0.9f, shadow = 0.5f)) - mImage.save("mono-stf-09-05-10").second shouldBe "633b49c4a1dbb5ad8e6a9d74f330636d" - } - "mono:STF:midtone = 0.1, shadow = 0.0, highlight = 0.5" { - val mImage = Image.open(NGC3344_MONO_8) - mImage.transform(ScreenTransformFunction(0.1f, highlight = 0.5f)) - mImage.save("mono-stf-01-00-05").second shouldBe "26036937eb3e5f99cd6129f709ce4b31" - } - "mono:STF:midtone = 0.9, shadow = 0.0, highlight = 0.5" { - val mImage = Image.open(NGC3344_MONO_8) - mImage.transform(ScreenTransformFunction(0.9f, highlight = 0.5f)) - mImage.save("mono-stf-09-00-05").second shouldBe "e8f694dae666ac15ce2f8a169eb84024" - } - "mono:STF:midtone = 0.1, shadow = 0.4, highlight = 0.6" { - val mImage = Image.open(NGC3344_MONO_8) - mImage.transform(ScreenTransformFunction(0.1f, 0.4f, 0.6f)) - mImage.save("mono-stf-01-04-06").second shouldBe "5226aba21669a24f985703b3e7220568" - } - "mono:STF:midtone = 0.9, shadow = 0.4, highlight = 0.6" { - val mImage = Image.open(NGC3344_MONO_8) - mImage.transform(ScreenTransformFunction(0.9f, 0.4f, 0.6f)) - mImage.save("mono-stf-09-04-06").second shouldBe "c2acb25ef7be92a51f63e673ec9a850f" - } - "mono:auto STF" { - val mImage = Image.open(NGC3344_MONO_8) - mImage.transform(AutoScreenTransformFunction) - mImage.save("mono-auto-stf").second shouldBe "e17cfc29c3b343409cd8617b6913330e" - } - "color:raw" { - val mImage = Image.open(NGC3344_COLOR_32) - mImage.save("color-raw").second shouldBe "18fb83e240bc7a4cbafbc1aba2741db6" - } - "color:vertical flip" { - val mImage = Image.open(NGC3344_COLOR_32) - mImage.transform(VerticalFlip) - mImage.save("color-vertical-flip").second shouldBe "b717ecda5c5bba50cfa06304ef2bca88" - } - "color:horizontal flip" { - val mImage = Image.open(NGC3344_COLOR_32) - mImage.transform(HorizontalFlip) - mImage.save("color-horizontal-flip").second shouldBe "f70228600c77551473008ed4b9986439" - } - "color:vertical & horizontal flip" { - val mImage = Image.open(NGC3344_COLOR_32) - mImage.transform(VerticalFlip, HorizontalFlip) - mImage.save("color-vertical-horizontal-flip").second shouldBe "1237314044f20307b76203148af855e3" - } - "color:subframe" { - val mImage = Image.open(NGC3344_COLOR_32) - val nImage = mImage.transform(SubFrame(45, 70, 16, 16)) - nImage.width shouldBeExactly 16 - nImage.height shouldBeExactly 16 - nImage.mono.shouldBeFalse() - nImage.save("color-subframe").second shouldBe "282fc4fdf9142fcb4b18e1df1eef4caa" - } - "color:sharpen" { - val mImage = Image.open(NGC3344_COLOR_32) - mImage.transform(Sharpen) - mImage.save("color-sharpen").second shouldBe "e562282bdafdeba6ce88981bb9c3ba61" - } - "color:mean" { - val mImage = Image.open(NGC3344_COLOR_32) - mImage.transform(Mean) - mImage.save("color-mean").second shouldBe "a8380d928aaa756e202ba43bd3a2f207" - } - "color:invert" { - val mImage = Image.open(NGC3344_COLOR_32) - mImage.transform(Invert) - mImage.save("color-invert").second shouldBe "decad269ec26450aebeaf7546867b5f8" - } - "color:emboss" { - val mImage = Image.open(NGC3344_COLOR_32) - mImage.transform(Emboss) - mImage.save("color-emboss").second shouldBe "58d69250f1233055aa33f9ec7ca40af1" - } - "color:edges" { - val mImage = Image.open(NGC3344_COLOR_32) - mImage.transform(Edges) - mImage.save("color-edges").second shouldBe "091f2955740a8edcd2401dc416d19d51" - } - "color:blur" { - val mImage = Image.open(NGC3344_COLOR_32) - mImage.transform(Blur) - mImage.save("color-blur").second shouldBe "0fca440b763de5380fa29de736f3c792" - } - "color:gaussian blur" { - val mImage = Image.open(NGC3344_COLOR_32) - mImage.transform(GaussianBlur(sigma = 5.0, size = 9)) - mImage.save("color-gaussian-blur").second shouldBe "394d1a4f136f15c802dd73004c421d64" - } - "color:STF:midtone = 0.1, shadow = 0.0, highlight = 1.0" { - val mImage = Image.open(NGC3344_COLOR_32) - mImage.transform(ScreenTransformFunction(0.1f)) - mImage.save("color-stf-01-00-10").second shouldBe "e952bd263df6fd275b9a80aca554cb4b" - } - "color:STF:midtone = 0.9, shadow = 0.0, highlight = 1.0" { - val mImage = Image.open(NGC3344_COLOR_32) - mImage.transform(ScreenTransformFunction(0.9f)) - mImage.save("color-stf-09-00-10").second shouldBe "038809d7612018e2e5c19d5e1f551abd" - } - "color:STF:midtone = 0.1, shadow = 0.5, highlight = 1.0" { - val mImage = Image.open(NGC3344_COLOR_32) - mImage.transform(ScreenTransformFunction(0.1f, shadow = 0.5f)) - mImage.save("color-stf-01-05-10").second shouldBe "70e812260f56f8621002327575611f31" - } - "color:STF:midtone = 0.9, shadow = 0.5, highlight = 1.0" { - val mImage = Image.open(NGC3344_COLOR_32) - mImage.transform(ScreenTransformFunction(0.9f, shadow = 0.5f)) - mImage.save("color-stf-09-05-10").second shouldBe "6ca400f617f466a9eb02a3a6f2985d99" - } - "color:STF:midtone = 0.1, shadow = 0.0, highlight = 0.5" { - val mImage = Image.open(NGC3344_COLOR_32) - mImage.transform(ScreenTransformFunction(0.1f, highlight = 0.5f)) - mImage.save("color-stf-01-00-05").second shouldBe "3cd98ee9a8949d5100295acccd77010b" - } - "color:STF:midtone = 0.9, shadow = 0.0, highlight = 0.5" { - val mImage = Image.open(NGC3344_COLOR_32) - mImage.transform(ScreenTransformFunction(0.9f, highlight = 0.5f)) - mImage.save("color-stf-09-00-05").second shouldBe "2cfeffc88c893cc5883d8a2221f29b91" - } - "color:STF:midtone = 0.1, shadow = 0.4, highlight = 0.6" { - val mImage = Image.open(NGC3344_COLOR_32) - mImage.transform(ScreenTransformFunction(0.1f, 0.4f, 0.6f)) - mImage.save("color-stf-01-04-06").second shouldBe "532a07a1a166eb007c2e40651aec2097" - } - "color:STF:midtone = 0.9, shadow = 0.4, highlight = 0.6" { - val mImage = Image.open(NGC3344_COLOR_32) - mImage.transform(ScreenTransformFunction(0.9f, 0.4f, 0.6f)) - mImage.save("color-stf-09-04-06").second shouldBe "eb3d940d9fd2c8814e930715e89897c4" - } - "color:auto STF" { - val mImage = Image.open(NGC3344_COLOR_32) - mImage.transform(AutoScreenTransformFunction) - mImage.save("color-auto-stf").second shouldBe "a9c3657d8597b927607eb438e666d3a0" - } - "color:SCNR Maximum Mask" { - val mImage = Image.open(NGC3344_COLOR_32) - mImage.transform(SubtractiveChromaticNoiseReduction(ImageChannel.RED, 1f, ProtectionMethod.MAXIMUM_MASK)) - mImage.save("color-scnr-maximum-mask").second shouldBe "e7d2155e18ff1e3172f4e849ae983145" - } - "color:SCNR Additive Mask" { - val mImage = Image.open(NGC3344_COLOR_32) - mImage.transform(SubtractiveChromaticNoiseReduction(ImageChannel.RED, 1f, ProtectionMethod.ADDITIVE_MASK)) - mImage.save("color-scnr-additive-mask").second shouldBe "a458c44cedcda704de16d80053fd87eb" - } - "color:SCNR Average Neutral" { - val mImage = Image.open(NGC3344_COLOR_32) - mImage.transform(SubtractiveChromaticNoiseReduction(ImageChannel.RED, 1f, ProtectionMethod.AVERAGE_NEUTRAL)) - mImage.save("color-scnr-average-neutral").second shouldBe "e07345ffc4982a62301c95c76d3efb35" - } - "color:SCNR Maximum Neutral" { - val mImage = Image.open(NGC3344_COLOR_32) - mImage.transform(SubtractiveChromaticNoiseReduction(ImageChannel.RED, 1f, ProtectionMethod.MAXIMUM_NEUTRAL)) - mImage.save("color-scnr-maximum-neutral").second shouldBe "a1d4b04f57b001ba4a996bab0407fd7e" - } - "color:SCNR Minimum Neutral" { - val mImage = Image.open(NGC3344_COLOR_32) - mImage.transform(SubtractiveChromaticNoiseReduction(ImageChannel.RED, 1f, ProtectionMethod.MINIMUM_NEUTRAL)) - mImage.save("color-scnr-minimum-neutral").second shouldBe "8b7be57ff38da9c97b35d7888047c0f9" - } - "color:grayscale BT-709" { - val mImage = Image.open(NGC3344_COLOR_32) - val nImage = mImage.transform(Grayscale.BT709) - nImage.save("color-grayscale-bt709").second shouldBe "cab675aa35390a2d58cd48555d91054f" - } - "color:grayscale RMY" { - val mImage = Image.open(NGC3344_COLOR_32) - val nImage = mImage.transform(Grayscale.RMY) - nImage.save("color-grayscale-rmy").second shouldBe "e113627002a4178d1010a2f6246e325f" - } - "color:grayscale Y" { - val mImage = Image.open(NGC3344_COLOR_32) - val nImage = mImage.transform(Grayscale.Y) - nImage.save("color-grayscale-y").second shouldBe "24dd4a7e0fa9e4be34c53c924a78a940" - } - "color:debayer" { - val fits = File("src/test/resources/Debayer.fits").fits() - val mImage = Image.open(fits) - val nImage = mImage.transform(AutoScreenTransformFunction) - nImage.save("color-debayer").second shouldBe "86b5bdd67dfd6bbf5495afae4bf2bc04" - } - "color:no-debayer" { - val fits = File("src/test/resources/Debayer.fits").fits() - val mImage = Image.open(fits, false) - val nImage = mImage.transform(AutoScreenTransformFunction) - nImage.save("color-no-debayer").second shouldBe "958ccea020deec1f0c075042a9ba37c3" - } - } -} diff --git a/nebulosa-imaging/src/test/resources/Debayer.fits b/nebulosa-imaging/src/test/resources/Debayer.fits deleted file mode 100644 index 03ada23d6..000000000 Binary files a/nebulosa-imaging/src/test/resources/Debayer.fits and /dev/null differ diff --git a/nebulosa-indi-client/build.gradle.kts b/nebulosa-indi-client/build.gradle.kts index 523dab9a5..52957c1a7 100644 --- a/nebulosa-indi-client/build.gradle.kts +++ b/nebulosa-indi-client/build.gradle.kts @@ -6,7 +6,8 @@ plugins { dependencies { api(project(":nebulosa-io")) api(project(":nebulosa-nova")) - api(project(":nebulosa-imaging")) + api(project(":nebulosa-image")) + api(project(":nebulosa-xisf")) api(project(":nebulosa-indi-device")) implementation(project(":nebulosa-log")) testImplementation(project(":nebulosa-test")) diff --git a/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/GPSDevice.kt b/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/GPSDevice.kt index f9616ba1d..37c82ab5b 100644 --- a/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/GPSDevice.kt +++ b/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/GPSDevice.kt @@ -18,15 +18,10 @@ internal open class GPSDevice( ) : INDIDevice(), GPS { @Volatile final override var hasGPS = true - private set @Volatile final override var longitude = 0.0 - private set @Volatile final override var latitude = 0.0 - private set @Volatile final override var elevation = 0.0 - private set @Volatile final override var dateTime = OffsetDateTime.MIN!! - private set override fun handleMessage(message: INDIProtocol) { when (message) { @@ -63,6 +58,6 @@ internal open class GPSDevice( override fun toString(): String { return "GPS(hasGPS=$hasGPS, longitude=$longitude, latitude=$latitude," + - " elevation=$elevation, dateTime=$dateTime)" + " elevation=$elevation, dateTime=$dateTime)" } } diff --git a/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/INDIDevice.kt b/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/INDIDevice.kt index d8abf136e..4c02e94da 100644 --- a/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/INDIDevice.kt +++ b/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/INDIDevice.kt @@ -3,11 +3,6 @@ package nebulosa.indi.client.device import nebulosa.indi.client.INDIClient import nebulosa.indi.client.device.cameras.INDICamera import nebulosa.indi.device.* -import nebulosa.indi.device.camera.Camera -import nebulosa.indi.device.filterwheel.FilterWheel -import nebulosa.indi.device.focuser.Focuser -import nebulosa.indi.device.mount.Mount -import nebulosa.indi.device.rotator.Rotator import nebulosa.indi.protocol.* import nebulosa.indi.protocol.Vector import nebulosa.log.loggerFor @@ -25,6 +20,8 @@ internal abstract class INDIDevice : Device { @Volatile override var connected = false protected set + override val snoopedDevices = ArrayList(4) + private fun addMessageAndFireEvent(text: String) { synchronized(messages) { messages.addFirst(text) @@ -183,23 +180,10 @@ internal abstract class INDIDevice : Device { } override fun snoop(devices: Iterable) { - val ccd = devices.firstOrNull { it is Camera }?.name ?: "" - val telescope = devices.firstOrNull { it is Mount }?.name ?: "" - val focuser = devices.firstOrNull { it is Focuser }?.name ?: "" - val filter = devices.firstOrNull { it is FilterWheel }?.name ?: "" - val rotator = devices.firstOrNull { it is Rotator }?.name ?: "" - - LOG.info( - "$name is snooping devices. ccd={}, telescope={}, focuser={}, filter={}, rotator={}", - ccd, telescope, focuser, filter, rotator - ) - - if (this is Camera) { - sendNewText( - "ACTIVE_DEVICES", - "ACTIVE_TELESCOPE" to telescope, "ACTIVE_ROTATOR" to rotator, - "ACTIVE_FOCUSER" to focuser, "ACTIVE_FILTER" to filter, - ) + snoopedDevices.clear() + + for (device in devices) { + device?.also(snoopedDevices::add) } } diff --git a/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/INDIDeviceProtocolHandler.kt b/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/INDIDeviceProtocolHandler.kt index 824c40ee4..0da39ca34 100644 --- a/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/INDIDeviceProtocolHandler.kt +++ b/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/INDIDeviceProtocolHandler.kt @@ -4,6 +4,7 @@ import nebulosa.indi.device.* import nebulosa.indi.device.camera.Camera import nebulosa.indi.device.camera.CameraAttached import nebulosa.indi.device.camera.CameraDetached +import nebulosa.indi.device.camera.GuideHead import nebulosa.indi.device.filterwheel.FilterWheel import nebulosa.indi.device.filterwheel.FilterWheelAttached import nebulosa.indi.device.filterwheel.FilterWheelDetached @@ -86,11 +87,25 @@ abstract class INDIDeviceProtocolHandler : MessageSender, INDIProtocolParser, Cl internal fun unregisterGPS(device: GPS) { if (device.name in gps) { - guideOutputs.remove(device.name) + gps.remove(device.name) fireOnEventReceived(GPSDetached(device)) } } + internal fun registerGuideHead(device: GuideHead) { + if (device.name !in cameras) { + cameras[device.name] = device + fireOnEventReceived(CameraAttached(device)) + } + } + + internal fun unregisterGuiderHead(device: GuideHead) { + if (device.name in cameras) { + cameras.remove(device.name) + fireOnEventReceived(CameraDetached(device)) + } + } + internal fun registerGuideOutput(device: GuideOutput) { if (device.name !in guideOutputs) { guideOutputs[device.name] = device @@ -287,7 +302,7 @@ abstract class INDIDeviceProtocolHandler : MessageSender, INDIProtocolParser, Cl if (device == null) { val text = "[%s]: %s\n".format(message.timestamp, message.message) fireOnEventReceived(DeviceMessageReceived(null, text)) - } else { + } else if (message.name.isNotEmpty()) { device.handleMessage(message) } diff --git a/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/cameras/INDICamera.kt b/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/cameras/INDICamera.kt index 30cafe4b6..c633a3d7d 100644 --- a/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/cameras/INDICamera.kt +++ b/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/cameras/INDICamera.kt @@ -1,11 +1,18 @@ package nebulosa.indi.client.device.cameras -import nebulosa.imaging.algorithms.transformation.CfaPattern +import nebulosa.fits.FitsHeaderCard +import nebulosa.image.algorithms.transformation.CfaPattern +import nebulosa.image.format.HeaderCard import nebulosa.indi.client.INDIClient import nebulosa.indi.client.device.INDIDevice +import nebulosa.indi.device.Device import nebulosa.indi.device.camera.* -import nebulosa.indi.device.camera.Camera.Companion.NANO_SECONDS +import nebulosa.indi.device.camera.Camera.Companion.NANO_TO_SECONDS +import nebulosa.indi.device.filterwheel.FilterWheel +import nebulosa.indi.device.focuser.Focuser import nebulosa.indi.device.guide.GuideOutputPulsingChanged +import nebulosa.indi.device.mount.Mount +import nebulosa.indi.device.rotator.Rotator import nebulosa.indi.protocol.* import nebulosa.io.Base64InputStream import nebulosa.log.loggerFor @@ -14,122 +21,77 @@ import java.time.Duration // https://github.com/indilib/indi/blob/master/libs/indibase/indiccd.cpp internal open class INDICamera( - override val sender: INDIClient, - override val name: String, + final override val sender: INDIClient, + final override val name: String, ) : INDIDevice(), Camera { @Volatile final override var exposuring = false - private set @Volatile final override var hasCoolerControl = false - private set @Volatile final override var coolerPower = 0.0 - private set @Volatile final override var cooler = false - private set @Volatile final override var hasDewHeater = false - private set @Volatile final override var dewHeater = false - private set @Volatile final override var frameFormats = emptyList() - private set @Volatile final override var canAbort = false - private set @Volatile final override var cfaOffsetX = 0 - private set @Volatile final override var cfaOffsetY = 0 - private set @Volatile final override var cfaType = CfaPattern.RGGB - private set @Volatile final override var exposureMin: Duration = Duration.ZERO - private set @Volatile final override var exposureMax: Duration = Duration.ZERO - private set @Volatile final override var exposureState = PropertyState.IDLE - private set @Volatile final override var exposureTime: Duration = Duration.ZERO - private set @Volatile final override var hasCooler = false - private set @Volatile final override var canSetTemperature = false - private set @Volatile final override var canSubFrame = false - private set @Volatile final override var x = 0 - private set @Volatile final override var minX = 0 - private set @Volatile final override var maxX = 0 - private set @Volatile final override var y = 0 - private set @Volatile final override var minY = 0 - private set @Volatile final override var maxY = 0 - private set @Volatile final override var width = 0 - private set @Volatile final override var minWidth = 0 - private set @Volatile final override var maxWidth = 0 - private set @Volatile final override var height = 0 - private set @Volatile final override var minHeight = 0 - private set @Volatile final override var maxHeight = 0 - private set @Volatile final override var canBin = false - private set @Volatile final override var maxBinX = 1 - private set @Volatile final override var maxBinY = 1 - private set @Volatile final override var binX = 1 - private set @Volatile final override var binY = 1 - private set @Volatile final override var gain = 0 - private set @Volatile final override var gainMin = 0 - private set @Volatile final override var gainMax = 0 - private set @Volatile final override var offset = 0 - private set @Volatile final override var offsetMin = 0 - private set @Volatile final override var offsetMax = 0 - private set - @Volatile final override var hasGuiderHead = false // TODO: Handle guider head. - private set @Volatile final override var pixelSizeX = 0.0 - private set @Volatile final override var pixelSizeY = 0.0 - private set @Volatile final override var hasThermometer = false - private set @Volatile final override var temperature = 0.0 - private set @Volatile final override var canPulseGuide = false - private set @Volatile final override var pulseGuiding = false + + final override var guideHead: GuideHeadCamera? = null private set override fun handleMessage(message: INDIProtocol) { + val isGuider = message.name[0] == 'G' + val isGuideHead = this is GuideHead + when (message) { is SwitchVector<*> -> { when (message.name) { "CCD_COOLER" -> { if (message is DefSwitchVector) { hasCoolerControl = true - sender.fireOnEventReceived(CameraCoolerControlChanged(this)) } cooler = message["COOLER_ON"]?.value ?: false - sender.fireOnEventReceived(CameraCoolerChanged(this)) } "CCD_CAPTURE_FORMAT" -> { @@ -138,8 +100,9 @@ internal open class INDICamera( sender.fireOnEventReceived(CameraFrameFormatsChanged(this)) } } - "CCD_ABORT_EXPOSURE" -> { - if (message is DefSwitchVector) { + "CCD_ABORT_EXPOSURE", + "GUIDER_ABORT_EXPOSURE" -> { + if (isGuider == isGuideHead && message is DefSwitchVector) { canAbort = message.isNotReadOnly sender.fireOnEventReceived(CameraCanAbortChanged(this)) } @@ -158,47 +121,53 @@ internal open class INDICamera( } is NumberVector<*> -> { when (message.name) { - "CCD_INFO" -> { - pixelSizeX = message["CCD_PIXEL_SIZE_X"]?.value ?: 0.0 - pixelSizeY = message["CCD_PIXEL_SIZE_Y"]?.value ?: 0.0 - - sender.fireOnEventReceived(CameraPixelSizeChanged(this)) - } - "CCD_EXPOSURE" -> { - val element = message["CCD_EXPOSURE_VALUE"]!! + "CCD_INFO", + "GUIDER_INFO" -> { + if (isGuider == isGuideHead) { + pixelSizeX = message["CCD_PIXEL_SIZE_X"]?.value ?: 0.0 + pixelSizeY = message["CCD_PIXEL_SIZE_Y"]?.value ?: 0.0 - if (element is DefNumber) { - exposureMin = Duration.ofNanos((element.min * NANO_SECONDS).toLong()) - exposureMax = Duration.ofNanos((element.max * NANO_SECONDS).toLong()) - sender.fireOnEventReceived(CameraExposureMinMaxChanged(this)) + sender.fireOnEventReceived(CameraPixelSizeChanged(this)) } + } + "CCD_EXPOSURE", + "GUIDER_EXPOSURE" -> { + if (isGuider == isGuideHead) { + val element = message[if (isGuider) "GUIDER_EXPOSURE_VALUE" else "CCD_EXPOSURE_VALUE"]!! + + if (element is DefNumber) { + exposureMin = Duration.ofNanos((element.min * NANO_TO_SECONDS).toLong()) + exposureMax = Duration.ofNanos((element.max * NANO_TO_SECONDS).toLong()) + sender.fireOnEventReceived(CameraExposureMinMaxChanged(this)) + } - val prevExposureState = exposureState - exposureState = message.state + val prevExposureState = exposureState + exposureState = message.state - if (exposureState == PropertyState.BUSY || exposureState == PropertyState.OK) { - exposureTime = Duration.ofNanos((element.value * NANO_SECONDS).toLong()) + if (exposureState == PropertyState.BUSY || exposureState == PropertyState.OK) { + exposureTime = Duration.ofNanos((element.value * NANO_TO_SECONDS).toLong()) - sender.fireOnEventReceived(CameraExposureProgressChanged(this)) - } + sender.fireOnEventReceived(CameraExposureProgressChanged(this)) + } - val prevIsExposuring = exposuring - exposuring = exposureState == PropertyState.BUSY + val prevIsExposuring = exposuring + exposuring = exposureState == PropertyState.BUSY - if (prevIsExposuring != exposuring) { - sender.fireOnEventReceived(CameraExposuringChanged(this)) - } + if (prevIsExposuring != exposuring) { + sender.fireOnEventReceived(CameraExposuringChanged(this)) + } - if (exposureState == PropertyState.IDLE && (prevExposureState == PropertyState.BUSY || exposuring)) { - sender.fireOnEventReceived(CameraExposureAborted(this)) - } else if (exposureState == PropertyState.OK && prevExposureState == PropertyState.BUSY) { - sender.fireOnEventReceived(CameraExposureFinished(this)) - } else if (exposureState == PropertyState.ALERT && prevExposureState != PropertyState.ALERT) { - sender.fireOnEventReceived(CameraExposureFailed(this)) - } + if (exposureState == PropertyState.IDLE && (prevExposureState == PropertyState.BUSY || exposuring)) { + sender.fireOnEventReceived(CameraExposureAborted(this)) + } else if (exposureState == PropertyState.OK && prevExposureState == PropertyState.BUSY) { + sender.fireOnEventReceived(CameraExposureFinished(this)) + } else if (exposureState == PropertyState.ALERT && prevExposureState != PropertyState.ALERT) { + sender.fireOnEventReceived(CameraExposureFailed(this)) + } - if (prevExposureState != exposureState) { - sender.fireOnEventReceived(CameraExposureStateChanged(this, prevExposureState)) + if (prevExposureState != exposureState) { + sender.fireOnEventReceived(CameraExposureStateChanged(this, prevExposureState)) + } } } "CCD_COOLER_POWER" -> { @@ -213,7 +182,7 @@ internal open class INDICamera( sender.fireOnEventReceived(CameraHasCoolerChanged(this)) sender.fireOnEventReceived(CameraCanSetTemperatureChanged(this)) - if (!hasThermometer) { + if (!hasThermometer && !isGuideHead) { hasThermometer = true sender.registerThermometer(this) } @@ -222,92 +191,104 @@ internal open class INDICamera( temperature = message["CCD_TEMPERATURE_VALUE"]!!.value sender.fireOnEventReceived(CameraTemperatureChanged(this)) } - "CCD_FRAME" -> { - if (message is DefNumberVector) { - canSubFrame = message.isNotReadOnly - sender.fireOnEventReceived(CameraCanSubFrameChanged(this)) - - val minX = message["X"]!!.min.toInt() - val maxX = message["X"]!!.max.toInt() - val minY = message["Y"]!!.min.toInt() - val maxY = message["Y"]!!.max.toInt() - val minWidth = message["WIDTH"]!!.min.toInt() - val maxWidth = message["WIDTH"]!!.max.toInt() - val minHeight = message["HEIGHT"]!!.min.toInt() - val maxHeight = message["HEIGHT"]!!.max.toInt() - - this.minX = minX - this.maxX = maxX - this.minY = minY - this.maxY = maxY - this.minWidth = minWidth - this.maxWidth = maxWidth - this.minHeight = minHeight - this.maxHeight = maxHeight - } - - val x = message["X"]!!.value.toInt() - val y = message["Y"]!!.value.toInt() - val width = message["WIDTH"]!!.value.toInt() - val height = message["HEIGHT"]!!.value.toInt() + "CCD_FRAME", + "GUIDER_FRAME" -> { + if (isGuider == isGuideHead) { + if (message is DefNumberVector) { + canSubFrame = message.isNotReadOnly + sender.fireOnEventReceived(CameraCanSubFrameChanged(this)) + + minX = message["X"]!!.min.toInt() + maxX = message["X"]!!.max.toInt() + minY = message["Y"]!!.min.toInt() + maxY = message["Y"]!!.max.toInt() + minWidth = message["WIDTH"]!!.min.toInt() + maxWidth = message["WIDTH"]!!.max.toInt() + minHeight = message["HEIGHT"]!!.min.toInt() + maxHeight = message["HEIGHT"]!!.max.toInt() + } - this.x = x - this.y = y - this.width = width - this.height = height + x = message["X"]!!.value.toInt() + y = message["Y"]!!.value.toInt() + width = message["WIDTH"]!!.value.toInt() + height = message["HEIGHT"]!!.value.toInt() - sender.fireOnEventReceived(CameraFrameChanged(this)) + sender.fireOnEventReceived(CameraFrameChanged(this)) + } } - "CCD_BINNING" -> { - if (message is DefNumberVector) { - canBin = message.isNotReadOnly - maxBinX = message["HOR_BIN"]!!.max.toInt() - maxBinY = message["VER_BIN"]!!.max.toInt() + "CCD_BINNING", + "GUIDER_BINNING" -> { + if (isGuider == isGuideHead) { + if (message is DefNumberVector) { + canBin = message.isNotReadOnly + maxBinX = message["HOR_BIN"]!!.max.toInt() + maxBinY = message["VER_BIN"]!!.max.toInt() + sender.fireOnEventReceived(CameraCanBinChanged(this)) + } - sender.fireOnEventReceived(CameraCanBinChanged(this)) + binX = message["HOR_BIN"]!!.value.toInt() + binY = message["VER_BIN"]!!.value.toInt() + sender.fireOnEventReceived(CameraBinChanged(this)) } - - binX = message["HOR_BIN"]!!.value.toInt() - binY = message["VER_BIN"]!!.value.toInt() - - sender.fireOnEventReceived(CameraBinChanged(this)) } "TELESCOPE_TIMED_GUIDE_NS", "TELESCOPE_TIMED_GUIDE_WE" -> { - if (!canPulseGuide && message is DefNumberVector) { - canPulseGuide = true + if (!isGuideHead) { + if (!canPulseGuide && message is DefNumberVector) { + canPulseGuide = true - sender.registerGuideOutput(this) + sender.registerGuideOutput(this) - LOG.info("guide output attached: {}", name) - } else { - val prevIsPulseGuiding = pulseGuiding - pulseGuiding = message.isBusy + LOG.info("guide output attached: {}", name) + } else { + val prevIsPulseGuiding = pulseGuiding + pulseGuiding = message.isBusy - if (pulseGuiding != prevIsPulseGuiding) { - sender.fireOnEventReceived(GuideOutputPulsingChanged(this)) + if (pulseGuiding != prevIsPulseGuiding) { + sender.fireOnEventReceived(GuideOutputPulsingChanged(this)) + } } + + return } } } } + is DefBLOBVector -> { + if (!isGuideHead && message.name == "CCD2" && guideHead == null) { + guideHead = GuideHeadCamera(this) + sender.registerGuideHead(guideHead!!) + + LOG.info("guide head attached: {}", name) + + return + } + } is SetBLOBVector -> { - when (message.name) { - "CCD1" -> { - val ccd1 = message["CCD1"]!! - val fits = Base64InputStream(ccd1.value) - val compressed = COMPRESSION_FORMATS.any { ccd1.format.endsWith(it, true) } - sender.fireOnEventReceived(CameraFrameCaptured(this, fits, null, compressed)) - } - "CCD2" -> { - // TODO: Handle Guider Head frame. + // Main camera handles both messages. + if (!isGuideHead) { + val ccd = message[message.name]!! + + if (ccd.format.contains("fits", true)) { + val compressed = COMPRESSION_FORMATS.any { ccd.format.endsWith(it, true) } + + if (!compressed) { + val stream = Base64InputStream(ccd.value) + val camera = if (message.name == "CCD2") guideHead!! else this + sender.fireOnEventReceived(CameraFrameCaptured(camera, stream = stream)) + } else { + LOG.warn("compressed FITS is not supported yet") + } } + + return } } else -> Unit } super.handleMessage(message) + guideHead?.handleMessage(message) } override fun cooler(enabled: Boolean) { @@ -331,7 +312,8 @@ internal open class INDICamera( } override fun frameType(type: FrameType) { - sendNewSwitch("CCD_FRAME_TYPE", "FRAME_$type" to true) + val name = if (this is GuideHead) "GUIDER_FRAME_TYPE" else "CCD_FRAME_TYPE" + sendNewSwitch(name, "FRAME_$type" to true) } override fun frame(x: Int, y: Int, width: Int, height: Int) { @@ -352,13 +334,21 @@ internal open class INDICamera( override fun offset(value: Int) = Unit override fun startCapture(exposureTime: Duration) { - val exposureInSeconds = exposureTime.toNanos() / NANO_SECONDS - sendNewNumber("CCD_EXPOSURE", "CCD_EXPOSURE_VALUE" to exposureInSeconds) + sendNewSwitch("CCD_TRANSFER_FORMAT", "FORMAT_FITS" to true) + + val exposureInSeconds = exposureTime.toNanos() / NANO_TO_SECONDS + + if (this is GuideHead) { + sendNewNumber("GUIDER_EXPOSURE", "GUIDER_EXPOSURE_VALUE" to exposureInSeconds) + } else { + sendNewNumber("CCD_EXPOSURE", "CCD_EXPOSURE_VALUE" to exposureInSeconds) + } } override fun abortCapture() { if (canAbort) { - sendNewSwitch("CCD_ABORT_EXPOSURE", "ABORT" to true) + val name = if (this is GuideHead) "GUIDER_ABORT_EXPOSURE" else "CCD_ABORT_EXPOSURE" + sendNewSwitch(name, "ABORT" to true) } } @@ -386,6 +376,30 @@ internal open class INDICamera( } } + override fun snoop(devices: Iterable) { + super.snoop(devices) + + val telescope = devices.firstOrNull { it is Mount }?.name ?: "" + val focuser = devices.firstOrNull { it is Focuser }?.name ?: "" + val filter = devices.firstOrNull { it is FilterWheel }?.name ?: "" + val rotator = devices.firstOrNull { it is Rotator }?.name ?: "" + + sendNewText( + "ACTIVE_DEVICES", + "ACTIVE_TELESCOPE" to telescope, "ACTIVE_ROTATOR" to rotator, + "ACTIVE_FOCUSER" to focuser, "ACTIVE_FILTER" to filter, + ) + } + + private fun sendFITSKeyword(card: HeaderCard) { + sendNewText("FITS_HEADER", "KEYWORD_NAME" to card.key, "KEYWORD_VALUE" to card.value, "KEYWORD_COMMENT" to card.comment) + } + + override fun fitsKeywords(vararg cards: HeaderCard) { + sendFITSKeyword(INDI_CLEAR) + cards.forEach(::sendFITSKeyword) + } + override fun close() { if (hasThermometer) { sender.unregisterThermometer(this) @@ -398,6 +412,12 @@ internal open class INDICamera( canPulseGuide = false LOG.info("guide output detached: {}", name) } + + if (guideHead != null) { + guideHead?.also(sender::unregisterGuiderHead) + guideHead = null + LOG.info("guide head detached: {}", name) + } } protected fun processGain(message: NumberVector<*>, element: NumberElement) { @@ -427,26 +447,79 @@ internal open class INDICamera( } override fun toString() = "Camera(name=$name, connected=$connected, exposuring=$exposuring," + - " hasCoolerControl=$hasCoolerControl, cooler=$cooler," + - " hasDewHeater=$hasDewHeater, dewHeater=$dewHeater," + - " frameFormats=$frameFormats, canAbort=$canAbort," + - " cfaOffsetX=$cfaOffsetX, cfaOffsetY=$cfaOffsetY, cfaType=$cfaType," + - " exposureMin=$exposureMin, exposureMax=$exposureMax," + - " exposureState=$exposureState, exposureTime=$exposureTime," + - " hasCooler=$hasCooler, hasThermometer=$hasThermometer, canSetTemperature=$canSetTemperature," + - " temperature=$temperature, canSubFrame=$canSubFrame," + - " x=$x, minX=$minX, maxX=$maxX, y=$y, minY=$minY, maxY=$maxY," + - " width=$width, minWidth=$minWidth, maxWidth=$maxWidth, height=$height," + - " minHeight=$minHeight, maxHeight=$maxHeight," + - " canBin=$canBin, maxBinX=$maxBinX, maxBinY=$maxBinY," + - " binX=$binX, binY=$binY, gain=$gain, gainMin=$gainMin," + - " gainMax=$gainMax, offset=$offset, offsetMin=$offsetMin," + - " offsetMax=$offsetMax, hasGuiderHead=$hasGuiderHead," + - " canPulseGuide=$canPulseGuide, pulseGuiding=$pulseGuiding)" + " hasCoolerControl=$hasCoolerControl, cooler=$cooler," + + " hasDewHeater=$hasDewHeater, dewHeater=$dewHeater," + + " frameFormats=$frameFormats, canAbort=$canAbort," + + " cfaOffsetX=$cfaOffsetX, cfaOffsetY=$cfaOffsetY, cfaType=$cfaType," + + " exposureMin=$exposureMin, exposureMax=$exposureMax," + + " exposureState=$exposureState, exposureTime=$exposureTime," + + " hasCooler=$hasCooler, hasThermometer=$hasThermometer, canSetTemperature=$canSetTemperature," + + " temperature=$temperature, canSubFrame=$canSubFrame," + + " x=$x, minX=$minX, maxX=$maxX, y=$y, minY=$minY, maxY=$maxY," + + " width=$width, minWidth=$minWidth, maxWidth=$maxWidth, height=$height," + + " minHeight=$minHeight, maxHeight=$maxHeight," + + " canBin=$canBin, maxBinX=$maxBinX, maxBinY=$maxBinY," + + " binX=$binX, binY=$binY, gain=$gain, gainMin=$gainMin," + + " gainMax=$gainMax, offset=$offset, offsetMin=$offsetMin," + + " offsetMax=$offsetMax, canPulseGuide=$canPulseGuide, pulseGuiding=$pulseGuiding)" + + internal data class GuideHeadCamera(override val main: INDICamera) : GuideHead, INDICamera(main.sender, main.name + " $GUIDE_HEAD_SUFFIX") { + + init { + exposuring = main.exposuring + hasCoolerControl = main.hasCoolerControl + coolerPower = main.coolerPower + cooler = main.cooler + hasDewHeater = main.hasDewHeater + dewHeater = main.dewHeater + frameFormats = main.frameFormats + canAbort = main.canAbort + cfaOffsetX = main.cfaOffsetX + cfaOffsetY = main.cfaOffsetY + cfaType = main.cfaType + exposureMin = main.exposureMin + exposureMax = main.exposureMax + exposureState = main.exposureState + exposureTime = main.exposureTime + hasCooler = main.hasCooler + canSetTemperature = main.canSetTemperature + canSubFrame = main.canSubFrame + x = main.x + minX = main.minX + maxX = main.maxX + y = main.y + minY = main.minY + maxY = main.maxY + width = main.width + minWidth = main.minWidth + maxWidth = main.maxWidth + height = main.height + minHeight = main.minHeight + maxHeight = main.maxHeight + canBin = main.canBin + maxBinX = main.maxBinX + maxBinY = main.maxBinY + binX = main.binX + binY = main.binY + gain = main.gain + gainMin = main.gainMin + gainMax = main.gainMax + offset = main.offset + offsetMin = main.offsetMin + offsetMax = main.offsetMax + pixelSizeX = main.pixelSizeX + pixelSizeY = main.pixelSizeY + } + + override fun toString() = "GuideHead(guideHead=${super.toString()}, main=$main)" + } companion object { + const val GUIDE_HEAD_SUFFIX = "(Guide Head)" + @JvmStatic private val COMPRESSION_FORMATS = arrayOf(".fz", ".gz") @JvmStatic private val LOG = loggerFor() + @JvmStatic private val INDI_CLEAR = FitsHeaderCard.create("INDI_CLEAR", "", "") } } diff --git a/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/focusers/INDIFocuser.kt b/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/focusers/INDIFocuser.kt index c3f85c2b9..fc167a083 100644 --- a/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/focusers/INDIFocuser.kt +++ b/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/focusers/INDIFocuser.kt @@ -16,30 +16,18 @@ internal open class INDIFocuser( ) : INDIDevice(), Focuser { @Volatile final override var moving = false - private set @Volatile final override var position = 0 - private set @Volatile final override var canAbsoluteMove = false - private set @Volatile final override var canRelativeMove = false - private set @Volatile final override var canAbort = false - private set @Volatile final override var canReverse = false - private set @Volatile final override var reversed = false - private set @Volatile final override var canSync = false - private set @Volatile final override var hasBacklash = false - private set @Volatile final override var maxPosition = 0 - private set @Volatile final override var hasThermometer = false - private set @Volatile final override var temperature = 0.0 - private set override fun handleMessage(message: INDIProtocol) { when (message) { @@ -200,10 +188,10 @@ internal open class INDIFocuser( override fun toString(): String { return "Focuser(name=$name, moving=$moving, position=$position," + - " canAbsoluteMove=$canAbsoluteMove, canRelativeMove=$canRelativeMove," + - " canAbort=$canAbort, canReverse=$canReverse, reversed=$reversed," + - " canSync=$canSync, hasBacklash=$hasBacklash," + - " maxPosition=$maxPosition, hasThermometer=$hasThermometer," + - " temperature=$temperature)" + " canAbsoluteMove=$canAbsoluteMove, canRelativeMove=$canRelativeMove," + + " canAbort=$canAbort, canReverse=$canReverse, reversed=$reversed," + + " canSync=$canSync, hasBacklash=$hasBacklash," + + " maxPosition=$maxPosition, hasThermometer=$hasThermometer," + + " temperature=$temperature)" } } diff --git a/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/mounts/INDIMount.kt b/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/mounts/INDIMount.kt index 630f44325..25c2ba6c7 100644 --- a/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/mounts/INDIMount.kt +++ b/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/mounts/INDIMount.kt @@ -23,59 +23,34 @@ internal open class INDIMount( ) : INDIDevice(), Mount { @Volatile final override var slewing = false - private set @Volatile final override var tracking = false - private set @Volatile final override var parking = false - private set @Volatile final override var parked = false - private set @Volatile final override var canAbort = false - private set @Volatile final override var canSync = false - private set @Volatile final override var canGoTo = false - private set @Volatile final override var canPark = false - private set @Volatile final override var canHome = false protected set @Volatile final override var slewRates = emptyList() - private set @Volatile final override var slewRate: SlewRate? = null - private set @Volatile final override var mountType = MountType.EQ_GEM // TODO: Ver os telescópios possui tipos. - private set @Volatile final override var trackModes = emptyList() - private set @Volatile final override var trackMode = TrackMode.SIDEREAL - private set @Volatile final override var pierSide = PierSide.NEITHER - private set @Volatile final override var guideRateWE = 0.0 // TODO: Tratar para cada driver. iOptronV3 tem RA/DE. LX200 tem 1.0x, 0.8x, 0.6x, 0.4x. - private set @Volatile final override var guideRateNS = 0.0 - private set @Volatile final override var rightAscension = 0.0 - private set @Volatile final override var declination = 0.0 - private set @Volatile final override var canPulseGuide = false - private set @Volatile final override var pulseGuiding = false - private set @Volatile final override var hasGPS = false - private set @Volatile final override var longitude = 0.0 - private set @Volatile final override var latitude = 0.0 - private set @Volatile final override var elevation = 0.0 - private set @Volatile final override var dateTime = OffsetDateTime.now()!! - private set override fun handleMessage(message: INDIProtocol) { when (message) { @@ -356,13 +331,13 @@ internal open class INDIMount( override fun toString(): String { return "Mount(name=$name, connected=$connected, slewing=$slewing, tracking=$tracking," + - " parking=$parking, parked=$parked, canAbort=$canAbort," + - " canSync=$canSync, canPark=$canPark, slewRates=$slewRates," + - " slewRate=$slewRate, mountType=$mountType, trackModes=$trackModes," + - " trackMode=$trackMode, pierSide=$pierSide, guideRateWE=$guideRateWE," + - " guideRateNS=$guideRateNS, rightAscension=$rightAscension," + - " declination=$declination, canPulseGuide=$canPulseGuide," + - " pulseGuiding=$pulseGuiding)" + " parking=$parking, parked=$parked, canAbort=$canAbort," + + " canSync=$canSync, canPark=$canPark, slewRates=$slewRates," + + " slewRate=$slewRate, mountType=$mountType, trackModes=$trackModes," + + " trackMode=$trackMode, pierSide=$pierSide, guideRateWE=$guideRateWE," + + " guideRateNS=$guideRateNS, rightAscension=$rightAscension," + + " declination=$declination, canPulseGuide=$canPulseGuide," + + " pulseGuiding=$pulseGuiding)" } companion object { diff --git a/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/wheels/INDIFilterWheel.kt b/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/wheels/INDIFilterWheel.kt index bd95e4c43..c7ce30b1e 100644 --- a/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/wheels/INDIFilterWheel.kt +++ b/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/wheels/INDIFilterWheel.kt @@ -13,11 +13,8 @@ internal open class INDIFilterWheel( ) : INDIDevice(), FilterWheel { @Volatile final override var count = 0 - private set @Volatile final override var position = 0 - private set @Volatile final override var moving = false - private set final override val names = ArrayList(12) @@ -90,6 +87,6 @@ internal open class INDIFilterWheel( override fun toString(): String { return "FilterWheel(name=$name, slotCount=$count, position=$position," + - " moving=$moving)" + " moving=$moving)" } } diff --git a/nebulosa-indi-device/build.gradle.kts b/nebulosa-indi-device/build.gradle.kts index 6f80f7aff..4ef1807dd 100644 --- a/nebulosa-indi-device/build.gradle.kts +++ b/nebulosa-indi-device/build.gradle.kts @@ -4,7 +4,7 @@ plugins { } dependencies { - api(project(":nebulosa-imaging")) + api(project(":nebulosa-image")) api(project(":nebulosa-nova")) api(project(":nebulosa-indi-protocol")) implementation(project(":nebulosa-log")) diff --git a/nebulosa-indi-device/src/main/kotlin/nebulosa/indi/device/CompanionDevice.kt b/nebulosa-indi-device/src/main/kotlin/nebulosa/indi/device/CompanionDevice.kt new file mode 100644 index 000000000..1b5385bb2 --- /dev/null +++ b/nebulosa-indi-device/src/main/kotlin/nebulosa/indi/device/CompanionDevice.kt @@ -0,0 +1,6 @@ +package nebulosa.indi.device + +interface CompanionDevice : Device { + + val main: Device +} diff --git a/nebulosa-indi-device/src/main/kotlin/nebulosa/indi/device/Device.kt b/nebulosa-indi-device/src/main/kotlin/nebulosa/indi/device/Device.kt index c936a63ab..60757ac91 100644 --- a/nebulosa-indi-device/src/main/kotlin/nebulosa/indi/device/Device.kt +++ b/nebulosa-indi-device/src/main/kotlin/nebulosa/indi/device/Device.kt @@ -18,6 +18,8 @@ interface Device : INDIProtocolHandler, Closeable, Comparable { val messages: List + val snoopedDevices: List + fun connect() fun disconnect() @@ -52,7 +54,7 @@ interface Device : INDIProtocolHandler, Closeable, Comparable { elements: Iterable>, ) { val vector = NewSwitchVector() - vector.device = this.name + vector.device = if (this is CompanionDevice) main.name else this.name vector.name = name for ((first, second) in elements) { @@ -77,7 +79,7 @@ interface Device : INDIProtocolHandler, Closeable, Comparable { elements: Iterable>, ) { val vector = NewNumberVector() - vector.device = this.name + vector.device = if (this is CompanionDevice) main.name else this.name vector.name = name for ((first, second) in elements) { @@ -102,7 +104,7 @@ interface Device : INDIProtocolHandler, Closeable, Comparable { elements: Iterable>, ) { val vector = NewTextVector() - vector.device = this.name + vector.device = if (this is CompanionDevice) main.name else this.name vector.name = name for ((first, second) in elements) { diff --git a/nebulosa-indi-device/src/main/kotlin/nebulosa/indi/device/camera/Camera.kt b/nebulosa-indi-device/src/main/kotlin/nebulosa/indi/device/camera/Camera.kt index 6ec7efae8..3ec33dcb5 100644 --- a/nebulosa-indi-device/src/main/kotlin/nebulosa/indi/device/camera/Camera.kt +++ b/nebulosa-indi-device/src/main/kotlin/nebulosa/indi/device/camera/Camera.kt @@ -1,6 +1,7 @@ package nebulosa.indi.device.camera -import nebulosa.imaging.algorithms.transformation.CfaPattern +import nebulosa.image.algorithms.transformation.CfaPattern +import nebulosa.image.format.HeaderCard import nebulosa.indi.device.guide.GuideOutput import nebulosa.indi.device.thermometer.Thermometer import nebulosa.indi.protocol.PropertyState @@ -90,7 +91,7 @@ interface Camera : GuideOutput, Thermometer { val offsetMax: Int - val hasGuiderHead: Boolean + val guideHead: GuideHead? val pixelSizeX: Double @@ -118,9 +119,11 @@ interface Camera : GuideOutput, Thermometer { fun abortCapture() + fun fitsKeywords(vararg cards: HeaderCard) + companion object { - const val NANO_SECONDS = 1_000_000_000.0 + const val NANO_TO_SECONDS = 1_000_000_000.0 @JvmStatic val DRIVERS = setOf( "indi_altair_ccd", diff --git a/nebulosa-indi-device/src/main/kotlin/nebulosa/indi/device/camera/CameraFrameCaptured.kt b/nebulosa-indi-device/src/main/kotlin/nebulosa/indi/device/camera/CameraFrameCaptured.kt index d75cce06d..73a022c70 100644 --- a/nebulosa-indi-device/src/main/kotlin/nebulosa/indi/device/camera/CameraFrameCaptured.kt +++ b/nebulosa-indi-device/src/main/kotlin/nebulosa/indi/device/camera/CameraFrameCaptured.kt @@ -5,7 +5,6 @@ import java.io.InputStream data class CameraFrameCaptured( override val device: Camera, - @JvmField val stream: InputStream?, - @JvmField val fits: Fits?, - @JvmField val compressed: Boolean, + @JvmField val stream: InputStream? = null, + @JvmField val image: Fits? = null, ) : CameraEvent diff --git a/nebulosa-indi-device/src/main/kotlin/nebulosa/indi/device/camera/GuideHead.kt b/nebulosa-indi-device/src/main/kotlin/nebulosa/indi/device/camera/GuideHead.kt new file mode 100644 index 000000000..62b309530 --- /dev/null +++ b/nebulosa-indi-device/src/main/kotlin/nebulosa/indi/device/camera/GuideHead.kt @@ -0,0 +1,8 @@ +package nebulosa.indi.device.camera + +import nebulosa.indi.device.CompanionDevice + +interface GuideHead : Camera, CompanionDevice { + + override val main: Camera +} diff --git a/nebulosa-indi-protocol/build.gradle.kts b/nebulosa-indi-protocol/build.gradle.kts index b09dc36e3..05cfa1300 100644 --- a/nebulosa-indi-protocol/build.gradle.kts +++ b/nebulosa-indi-protocol/build.gradle.kts @@ -4,7 +4,7 @@ plugins { } dependencies { - implementation(libs.xml) + api(project(":nebulosa-xml")) implementation(project(":nebulosa-log")) testImplementation(project(":nebulosa-test")) } diff --git a/nebulosa-indi-protocol/src/main/kotlin/nebulosa/indi/protocol/parser/INDIXmlInputStream.kt b/nebulosa-indi-protocol/src/main/kotlin/nebulosa/indi/protocol/parser/INDIXmlInputStream.kt index d63fa5d82..2536c377a 100644 --- a/nebulosa-indi-protocol/src/main/kotlin/nebulosa/indi/protocol/parser/INDIXmlInputStream.kt +++ b/nebulosa-indi-protocol/src/main/kotlin/nebulosa/indi/protocol/parser/INDIXmlInputStream.kt @@ -3,11 +3,11 @@ package nebulosa.indi.protocol.parser import com.fasterxml.aalto.stax.InputFactoryImpl import nebulosa.indi.protocol.* import nebulosa.indi.protocol.io.INDIInputStream +import nebulosa.xml.attribute import java.io.InputStream import javax.xml.stream.XMLStreamConstants -import javax.xml.stream.XMLStreamReader -class INDIXmlInputStream(private val source: InputStream) : INDIInputStream { +class INDIXmlInputStream(source: InputStream) : INDIInputStream { private val reader = XML_INPUT_FACTORY.createXMLStreamReader(source) @@ -300,7 +300,7 @@ class INDIXmlInputStream(private val source: InputStream) : INDIInputStream { } override fun close() { - source.close() + reader.close() } companion object { @@ -341,16 +341,5 @@ class INDIXmlInputStream(private val source: InputStream) : INDIInputStream { private const val MAX_ATTR_NAME = "max" private const val STEP_ATTR_NAME = "step" private const val MESSAGE_ATTR_NAME = "message" - - @JvmStatic - private fun XMLStreamReader.attribute(name: String): String? { - for (i in 0 until attributeCount) { - if (getAttributeLocalName(i) == name) { - return getAttributeValue(i) - } - } - - return null - } } } diff --git a/nebulosa-io/src/main/kotlin/nebulosa/io/AbstractSeekableSink.kt b/nebulosa-io/src/main/kotlin/nebulosa/io/AbstractSeekableSink.kt new file mode 100644 index 000000000..aade67cdf --- /dev/null +++ b/nebulosa-io/src/main/kotlin/nebulosa/io/AbstractSeekableSink.kt @@ -0,0 +1,66 @@ +package nebulosa.io + +import okio.Buffer +import okio.Timeout +import java.io.EOFException +import kotlin.math.max +import kotlin.math.min + +abstract class AbstractSeekableSink : SeekableSink { + + private val cursor = Buffer.UnsafeCursor() + + abstract val size: Long + abstract val timeout: Timeout + + override var position = 0L + protected set + + override val exhausted + get() = position >= size + + override fun seek(position: Long) { + val newPos = if (position < 0) size + position else position + this.position = max(0L, min(newPos, size)) + } + + protected abstract fun transfer(input: ByteArray, start: Int, length: Int): Int + + protected open fun computeTransferedSize(unsafeCursor: Buffer.UnsafeCursor, byteCount: Long): Long { + return min(min(size - position, unsafeCursor.remaining.toLong()), byteCount) + } + + override fun write(source: Buffer, byteCount: Long) { + if (byteCount == 0L) return + + // if (exhausted) throw EOFException("exhausted") + + var remaining = byteCount + + source.readUnsafe(cursor).use { + while (remaining > 0L) { + timeout.throwIfReached() + + it.seek(0L) + + val length = computeTransferedSize(it, remaining) + + if (length > 0L) { + val currentPosition = position + val transferedSize = transfer(it.data!!, it.start, length.toInt()).toLong() + position = currentPosition + transferedSize + remaining -= transferedSize + source.skip(transferedSize) + } else { + throw EOFException("exhausted") + } + } + } + } + + override fun timeout() = timeout + + override fun flush() = Unit + + override fun close() = Unit +} diff --git a/nebulosa-io/src/main/kotlin/nebulosa/io/AbstractSeekableSource.kt b/nebulosa-io/src/main/kotlin/nebulosa/io/AbstractSeekableSource.kt new file mode 100644 index 000000000..2c8338b95 --- /dev/null +++ b/nebulosa-io/src/main/kotlin/nebulosa/io/AbstractSeekableSource.kt @@ -0,0 +1,59 @@ +package nebulosa.io + +import okio.Buffer +import okio.Timeout +import kotlin.math.max +import kotlin.math.min + +abstract class AbstractSeekableSource : SeekableSource { + + private val cursor = Buffer.UnsafeCursor() + + abstract val size: Long + abstract val timeout: Timeout + + override var position = 0L + protected set + + override val exhausted + get() = position >= size + + override fun seek(position: Long) { + val newPos = if (position < 0) size + position else position + this.position = max(0L, min(newPos, size)) + } + + protected abstract fun transfer(output: ByteArray, start: Int, length: Int): Int + + protected open fun computeTransferedSize(unsafeCursor: Buffer.UnsafeCursor, byteCount: Long): Long { + return min(min(size - position, 8192L), byteCount) + } + + override fun read(sink: Buffer, byteCount: Long): Long { + if (exhausted) return -1L + + return sink.readAndWriteUnsafe(cursor).use { + timeout.throwIfReached() + + val length = computeTransferedSize(it, byteCount) + val sinkSize = sink.size + + if (length > 0L) { + cursor.expandBuffer(length.toInt()) + + val currentPosition = position + val transferedSize = transfer(it.data!!, it.start, length.toInt()).toLong() + cursor.resizeBuffer(sinkSize + transferedSize) + position = currentPosition + transferedSize + transferedSize + } else { + cursor.resizeBuffer(sinkSize) + -1L + } + } + } + + override fun timeout() = timeout + + override fun close() = Unit +} diff --git a/nebulosa-io/src/main/kotlin/nebulosa/io/ByteArraySink.kt b/nebulosa-io/src/main/kotlin/nebulosa/io/ByteArraySink.kt index 8857d28cd..6e4319e07 100644 --- a/nebulosa-io/src/main/kotlin/nebulosa/io/ByteArraySink.kt +++ b/nebulosa-io/src/main/kotlin/nebulosa/io/ByteArraySink.kt @@ -1,66 +1,22 @@ package nebulosa.io -import okio.Buffer import okio.Timeout -import java.io.EOFException -import kotlin.math.max -import kotlin.math.min -internal class ByteArraySink( +@Suppress("ArrayInDataClass") +internal data class ByteArraySink( private val data: ByteArray, private val offset: Int = 0, - private val byteCount: Int = data.size - offset, - private val timeout: Timeout = Timeout.NONE, -) : SeekableSink { - - private val cursor = Buffer.UnsafeCursor() - - override var position = 0L - private set - - override val exhausted - get() = position >= byteCount + override val size: Long = (data.size - offset).toLong(), + override val timeout: Timeout = Timeout.NONE, +) : AbstractSeekableSink() { init { - require(byteCount > 0) { "byteCount <= 0: $byteCount" } - checkOffsetAndCount(data.size, offset, byteCount) + require(size > 0) { "size <= 0: $size" } + checkOffsetAndCount(data.size, offset, size.toInt()) } - @Synchronized - override fun seek(position: Long) { - val newPos = if (position < 0) byteCount + position else position - this.position = max(0L, min(newPos, byteCount - 1L)) + override fun transfer(input: ByteArray, start: Int, length: Int): Int { + input.copyInto(data, (offset + position).toInt(), start, start + length) + return length } - - @Synchronized - override fun write(source: Buffer, byteCount: Long) { - if (byteCount == 0L) return - - var remaining = byteCount - - while (remaining > 0) { - timeout.throwIfReached() - - source.readUnsafe(cursor).use { - it.seek(0L) - - val length = min(min(this.byteCount - position, it.remaining.toLong()), remaining) - - if (length > 0) { - it.data!!.copyInto(data, (offset + position).toInt(), it.start, length.toInt()) - remaining -= length - position += length - source.skip(length) - } else { - throw EOFException("exhausted") - } - } - } - } - - override fun timeout() = timeout - - override fun flush() = Unit - - override fun close() = Unit } diff --git a/nebulosa-io/src/main/kotlin/nebulosa/io/ByteArraySource.kt b/nebulosa-io/src/main/kotlin/nebulosa/io/ByteArraySource.kt index 38abe68f4..99d98fac3 100644 --- a/nebulosa-io/src/main/kotlin/nebulosa/io/ByteArraySource.kt +++ b/nebulosa-io/src/main/kotlin/nebulosa/io/ByteArraySource.kt @@ -1,59 +1,23 @@ package nebulosa.io -import okio.Buffer import okio.Timeout -import kotlin.math.max -import kotlin.math.min -internal class ByteArraySource( +@Suppress("ArrayInDataClass") +internal data class ByteArraySource( private val data: ByteArray, private val offset: Int = 0, - private val byteCount: Int = data.size - offset, - private val timeout: Timeout = Timeout.NONE, -) : SeekableSource { - - private val cursor = Buffer.UnsafeCursor() - - override var position = 0L - private set - - override val exhausted - get() = position >= byteCount + override val size: Long = (data.size - offset).toLong(), + override val timeout: Timeout = Timeout.NONE, +) : AbstractSeekableSource() { init { - require(byteCount > 0) { "byteCount <= 0: $byteCount" } - checkOffsetAndCount(data.size, offset, byteCount) + require(size > 0) { "size <= 0: $size" } + checkOffsetAndCount(data.size, offset, size.toInt()) } - @Synchronized - override fun seek(position: Long) { - val newPos = if (position < 0) byteCount + position else position - this.position = max(0L, min(newPos, byteCount - 1L)) + override fun transfer(output: ByteArray, start: Int, length: Int): Int { + val startIndex = (offset + position).toInt() + data.copyInto(output, start, startIndex, startIndex + length) + return length } - - @Synchronized - override fun read(sink: Buffer, byteCount: Long): Long { - return sink.readAndWriteUnsafe(cursor).use { - timeout.throwIfReached() - - val size = sink.size - val length = min(min(this.byteCount - position, 8192L), byteCount) - - if (length > 0) { - it.expandBuffer(length.toInt()) - val startIndex = offset + position - data.copyInto(it.data!!, it.start, startIndex.toInt(), (startIndex + length).toInt()) - it.resizeBuffer(size + length) - position += length - length - } else { - it.resizeBuffer(size) - -1L - } - } - } - - override fun timeout() = timeout - - override fun close() = Unit } diff --git a/nebulosa-io/src/main/kotlin/nebulosa/io/ByteBufferSink.kt b/nebulosa-io/src/main/kotlin/nebulosa/io/ByteBufferSink.kt index 409717873..355ce5d0b 100644 --- a/nebulosa-io/src/main/kotlin/nebulosa/io/ByteBufferSink.kt +++ b/nebulosa-io/src/main/kotlin/nebulosa/io/ByteBufferSink.kt @@ -1,69 +1,24 @@ package nebulosa.io -import okio.Buffer import okio.Timeout -import java.io.EOFException import java.nio.ByteBuffer -import kotlin.math.max -import kotlin.math.min -internal class ByteBufferSink( +internal data class ByteBufferSink( private val data: ByteBuffer, private val offset: Int = 0, - private val byteCount: Int = data.capacity() - offset, - private val timeout: Timeout = Timeout.NONE, -) : SeekableSink { + override val size: Long = (data.remaining() - offset).toLong(), + override val timeout: Timeout = Timeout.NONE, +) : AbstractSeekableSink() { - private val cursor = Buffer.UnsafeCursor() - - override var position - get() = data.position().toLong() - private set(value) { - data.position(value.toInt()) - } - - override val exhausted - get() = position >= byteCount + private val initialPosition = data.position() init { - require(byteCount > 0) { "byteCount <= 0: $byteCount" } - checkOffsetAndCount(data.capacity(), offset, byteCount) - } - - @Synchronized - override fun seek(position: Long) { - val newPos = if (position < 0) byteCount + position else position - this.position = max(0L, min(newPos, byteCount - 1L)) + require(size > 0) { "size <= 0: $size" } + checkOffsetAndCount(data.remaining(), offset, size.toInt()) } - @Synchronized - override fun write(source: Buffer, byteCount: Long) { - if (byteCount == 0L) return - - var remaining = byteCount - - while (remaining > 0) { - timeout.throwIfReached() - - source.readUnsafe(cursor).use { - it.seek(0L) - - val length = min(min(this.byteCount - position, it.remaining.toLong()), remaining) - - if (length > 0) { - data.put(it.data!!, it.start, length.toInt()) - remaining -= length - source.skip(length) - } else { - throw EOFException("exhausted") - } - } - } + override fun transfer(input: ByteArray, start: Int, length: Int): Int { + data.put(initialPosition + offset + position.toInt(), input, start, length) + return length } - - override fun timeout() = timeout - - override fun flush() = Unit - - override fun close() = Unit } diff --git a/nebulosa-io/src/main/kotlin/nebulosa/io/ByteBufferSource.kt b/nebulosa-io/src/main/kotlin/nebulosa/io/ByteBufferSource.kt index 5c54ccca1..1423f3ca2 100644 --- a/nebulosa-io/src/main/kotlin/nebulosa/io/ByteBufferSource.kt +++ b/nebulosa-io/src/main/kotlin/nebulosa/io/ByteBufferSource.kt @@ -1,61 +1,24 @@ package nebulosa.io -import okio.Buffer import okio.Timeout import java.nio.ByteBuffer -import kotlin.math.max -import kotlin.math.min -internal class ByteBufferSource( +internal data class ByteBufferSource( private val data: ByteBuffer, private val offset: Int = 0, - private val byteCount: Int = data.capacity() - offset, - private val timeout: Timeout = Timeout.NONE, -) : SeekableSource { + override val size: Long = (data.remaining() - offset).toLong(), + override val timeout: Timeout = Timeout.NONE, +) : AbstractSeekableSource() { - private val cursor = Buffer.UnsafeCursor() - - override var position - get() = data.position().toLong() - private set(value) { - data.position(value.toInt()) - } - - override val exhausted - get() = position >= byteCount + private val initialPosition = data.position() init { - require(byteCount > 0) { "byteCount <= 0: $byteCount" } - checkOffsetAndCount(data.capacity(), offset, byteCount) - } - - @Synchronized - override fun seek(position: Long) { - val newPos = if (position < 0) byteCount + position else position - this.position = max(0L, min(newPos, byteCount - 1L)) + require(size > 0) { "size <= 0: $size" } + checkOffsetAndCount(data.remaining(), offset, size.toInt()) } - @Synchronized - override fun read(sink: Buffer, byteCount: Long): Long { - return sink.readAndWriteUnsafe(cursor).use { - timeout.throwIfReached() - - val size = sink.size - val length = min(min(this.byteCount - position, 8192L), byteCount) - - if (length > 0) { - it.expandBuffer(length.toInt()) - data.get(it.data!!, it.start, length.toInt()) - it.resizeBuffer(size + length) - length - } else { - it.resizeBuffer(size) - -1L - } - } + override fun transfer(output: ByteArray, start: Int, length: Int): Int { + data.get(initialPosition + offset + position.toInt(), output, start, length) + return length } - - override fun timeout() = timeout - - override fun close() = Unit } diff --git a/nebulosa-io/src/main/kotlin/nebulosa/io/Io.kt b/nebulosa-io/src/main/kotlin/nebulosa/io/Io.kt index 73893ff4a..bca1fda39 100644 --- a/nebulosa-io/src/main/kotlin/nebulosa/io/Io.kt +++ b/nebulosa-io/src/main/kotlin/nebulosa/io/Io.kt @@ -13,8 +13,6 @@ import java.nio.ByteBuffer import java.nio.file.Path import java.util.* -val EMPTY_BYTE_ARRAY = ByteArray(0) - inline fun BufferedSource.readSignedByte() = readByte().toInt() inline fun BufferedSource.readUnsignedByte() = readSignedByte() and 0xFF @@ -63,13 +61,24 @@ inline fun BufferedSource.readLatin1() = readString(Charsets.ISO_8859_1) inline fun BufferedSource.readLatin1(byteCount: Long) = readString(byteCount, Charsets.ISO_8859_1) -inline fun BufferedSink.writeFloat(f: Float) = writeInt(f.toBits()) +inline fun BufferedSink.writeShort(value: Int, order: ByteOrder) = if (order.isBigEndian) writeShort(value) else writeShortLe(value) + +inline fun BufferedSink.writeInt(value: Int, order: ByteOrder) = if (order.isBigEndian) writeInt(value) else writeIntLe(value) + +inline fun BufferedSink.writeLong(value: Long, order: ByteOrder) = if (order.isBigEndian) writeLong(value) else writeLongLe(value) + +inline fun BufferedSink.writeFloat(value: Float) = writeInt(value.toBits()) + +inline fun BufferedSink.writeFloatLe(value: Float) = writeIntLe(value.toBits()) -inline fun BufferedSink.writeFloatLe(f: Float) = writeIntLe(f.toBits()) +inline fun BufferedSink.writeFloat(value: Float, order: ByteOrder) = if (order.isBigEndian) writeInt(value.toBits()) else writeIntLe(value.toBits()) -inline fun BufferedSink.writeDouble(d: Double) = writeLong(d.toBits()) +inline fun BufferedSink.writeDouble(value: Double) = writeLong(value.toBits()) -inline fun BufferedSink.writeDoubleLe(d: Double) = writeLongLe(d.toBits()) +inline fun BufferedSink.writeDoubleLe(value: Double) = writeLongLe(value.toBits()) + +inline fun BufferedSink.writeDouble(value: Double, order: ByteOrder) = + if (order.isBigEndian) writeLong(value.toBits()) else writeLongLe(value.toBits()) inline fun ClassLoader.resource(name: String): InputStream? = getResourceAsStream(name) @@ -94,19 +103,25 @@ fun ByteArray.source( offset: Int = 0, byteCount: Int = size - offset, timeout: Timeout = Timeout.NONE, -): SeekableSource = ByteArraySource(this, offset, byteCount, timeout) +): SeekableSource = ByteArraySource(this, offset, byteCount.toLong(), timeout) fun ByteArray.sink( offset: Int = 0, byteCount: Int = size - offset, timeout: Timeout = Timeout.NONE, -): SeekableSink = ByteArraySink(this, offset, byteCount, timeout) +): SeekableSink = ByteArraySink(this, offset, byteCount.toLong(), timeout) + +fun ByteBuffer.sink( + offset: Int = 0, + byteCount: Int = remaining() - offset, + timeout: Timeout = Timeout.NONE, +): SeekableSink = ByteBufferSink(this, offset, byteCount.toLong(), timeout) fun ByteBuffer.source( offset: Int = 0, - byteCount: Int = capacity() - offset, + byteCount: Int = remaining() - offset, timeout: Timeout = Timeout.NONE, -): SeekableSource = ByteBufferSource(this, offset, byteCount, timeout) +): SeekableSource = ByteBufferSource(this, offset, byteCount.toLong(), timeout) fun Random.source( maxSize: Long = Long.MAX_VALUE, @@ -179,7 +194,7 @@ fun Buffer.transferFully(source: Source, sink: Sink, byteCount: Long) { while (remainingCount > 0L) { val size = source.read(this, remainingCount) - require(size > 0) { "unexpected end of file" } + if (size < 0L) throw EOFException("unexpected end of file") sink.write(this, size) remainingCount -= size } diff --git a/nebulosa-io/src/main/kotlin/nebulosa/io/RandomAccessFileSink.kt b/nebulosa-io/src/main/kotlin/nebulosa/io/RandomAccessFileSink.kt index 726de9fdd..e7667779b 100644 --- a/nebulosa-io/src/main/kotlin/nebulosa/io/RandomAccessFileSink.kt +++ b/nebulosa-io/src/main/kotlin/nebulosa/io/RandomAccessFileSink.kt @@ -6,51 +6,31 @@ import java.io.RandomAccessFile import kotlin.math.max import kotlin.math.min -internal class RandomAccessFileSink( +internal data class RandomAccessFileSink( private val file: RandomAccessFile, - private val timeout: Timeout = Timeout.NONE, -) : SeekableSink { + override val timeout: Timeout = Timeout.NONE, +) : AbstractSeekableSink() { - private val cursor = Buffer.UnsafeCursor() + override val size + get() = file.length() - override val position + override var position get() = file.filePointer + set(value) { + file.seek(max(0L, min(value, size))) + } - override val exhausted - get() = position >= file.length() + override fun computeTransferedSize(unsafeCursor: Buffer.UnsafeCursor, byteCount: Long): Long { + return min(unsafeCursor.remaining.toLong(), byteCount) + } - @Synchronized - override fun seek(position: Long) { - val size = file.length() - if (size <= 0) return - val newPos = if (position < 0) size + position else position - file.seek(max(0L, min(newPos, size - 1L))) + override fun transfer(input: ByteArray, start: Int, length: Int): Int { + file.write(input, start, length) + return length } - @Synchronized override fun write(source: Buffer, byteCount: Long) { - if (!file.channel.isOpen) throw IllegalStateException("closed") - - if (byteCount == 0L) return - - var remaining = byteCount - - while (remaining > 0) { - timeout.throwIfReached() - - source.readUnsafe(cursor).use { - it.seek(0L) - val length = min(it.remaining.toLong(), remaining) - file.write(it.data!!, it.start, length.toInt()) - remaining -= length - source.skip(length) - } - } + check(file.channel.isOpen) { "closed" } + super.write(source, byteCount) } - - override fun timeout() = timeout - - override fun flush() = Unit - - override fun close() = Unit } diff --git a/nebulosa-io/src/main/kotlin/nebulosa/io/RandomAccessFileSource.kt b/nebulosa-io/src/main/kotlin/nebulosa/io/RandomAccessFileSource.kt index 4c1d11f88..9e4bf5c1c 100644 --- a/nebulosa-io/src/main/kotlin/nebulosa/io/RandomAccessFileSource.kt +++ b/nebulosa-io/src/main/kotlin/nebulosa/io/RandomAccessFileSource.kt @@ -2,54 +2,38 @@ package nebulosa.io import okio.Buffer import okio.Timeout -import java.io.Closeable import java.io.RandomAccessFile -import kotlin.math.max import kotlin.math.min -internal class RandomAccessFileSource( +internal data class RandomAccessFileSource( private val file: RandomAccessFile, - private val timeout: Timeout = Timeout.NONE, -) : SeekableSource, Closeable by file { + override val timeout: Timeout = Timeout.NONE, +) : AbstractSeekableSource() { - private val cursor = Buffer.UnsafeCursor() + override val size + get() = file.length() - override val position + override var position get() = file.filePointer + set(value) { + file.seek(value) + } - override val exhausted - get() = position >= file.length() + override fun computeTransferedSize(unsafeCursor: Buffer.UnsafeCursor, byteCount: Long): Long { + return min(8192L, byteCount) + } - @Synchronized - override fun seek(position: Long) { - val size = file.length() - if (size <= 0) return - val newPos = if (position < 0) size + position else position - file.seek(max(0L, min(newPos, size - 1L))) + override fun transfer(output: ByteArray, start: Int, length: Int): Int { + return file.read(output, start, length) } - @Synchronized override fun read(sink: Buffer, byteCount: Long): Long { - if (!file.channel.isOpen) throw IllegalStateException("closed") - - return sink.readAndWriteUnsafe(cursor).use { - timeout.throwIfReached() - - val size = sink.size - val length = min(8192L, byteCount) - - it.expandBuffer(length.toInt()) - val readCount = file.read(it.data!!, it.start, length.toInt()) - - if (readCount == -1) { - it.resizeBuffer(size) - -1L - } else { - cursor.resizeBuffer(size + readCount) - return readCount.toLong() - } - } + check(file.channel.isOpen) { "closed" } + return super.read(sink, byteCount) } - override fun timeout() = timeout + override fun close() { + super.close() + file.close() + } } diff --git a/nebulosa-io/src/main/kotlin/nebulosa/io/RandomSource.kt b/nebulosa-io/src/main/kotlin/nebulosa/io/RandomSource.kt index 8f2f97d2b..24fbe4a70 100644 --- a/nebulosa-io/src/main/kotlin/nebulosa/io/RandomSource.kt +++ b/nebulosa-io/src/main/kotlin/nebulosa/io/RandomSource.kt @@ -1,74 +1,34 @@ package nebulosa.io -import okio.Buffer import okio.Timeout import java.util.* -import kotlin.math.max import kotlin.math.min -internal class RandomSource( +internal data class RandomSource( private val random: Random, - private val maxSize: Long = Long.MAX_VALUE, - private val timeout: Timeout = Timeout.NONE, -) : SeekableSource { - - private val cursor = Buffer.UnsafeCursor() - - override var position = 0L - private set - - override val exhausted - get() = maxSize in 0L..position + override val size: Long = Long.MAX_VALUE, + override val timeout: Timeout = Timeout.NONE, +) : AbstractSeekableSource() { init { - require(maxSize > 0) { "maxSize <= 0: $maxSize" } + require(size > 0) { "size <= 0: $size" } } - @Synchronized - override fun seek(position: Long) { - val newPos = if (position < 0) maxSize + position else position - this.position = max(0L, min(newPos, maxSize - 1L)) + override fun transfer(output: ByteArray, start: Int, length: Int): Int { + random.nextBytes(output, start, length) + return length } - @Synchronized - override fun read(sink: Buffer, byteCount: Long): Long { - return sink.readAndWriteUnsafe(cursor).use { - timeout.throwIfReached() - - val size = sink.size - val length = min(min(maxSize - position, 8192L), byteCount) - - if (length > 0) { - cursor.expandBuffer(length.toInt()) - random.nextBytes(it.data!!, it.start, length.toInt()) - cursor.resizeBuffer(size + length) - position += length - length - } else { - cursor.resizeBuffer(size) - -1L - } - } - } - - override fun timeout() = timeout - - override fun close() = Unit - companion object { - private fun Random.nextBytes( - bytes: ByteArray, - offset: Int = 0, - byteCount: Int = bytes.size - offset, - ) { + @JvmStatic + private fun Random.nextBytes(bytes: ByteArray, offset: Int = 0, byteCount: Int = bytes.size - offset) { var i = 0 while (i < byteCount) { var rnd = nextInt() - var n = min(byteCount - i, 4) - while (n-- > 0) { + repeat(min(byteCount - i, 4)) { bytes[offset + i++] = rnd.toByte() rnd = rnd shr 8 } diff --git a/nebulosa-io/src/test/kotlin/AbstractSeekableSinkAndSourceTest.kt b/nebulosa-io/src/test/kotlin/AbstractSeekableSinkAndSourceTest.kt new file mode 100644 index 000000000..d7c219a92 --- /dev/null +++ b/nebulosa-io/src/test/kotlin/AbstractSeekableSinkAndSourceTest.kt @@ -0,0 +1,293 @@ +import io.kotest.core.spec.style.StringSpec +import io.kotest.matchers.booleans.shouldBeFalse +import io.kotest.matchers.booleans.shouldBeTrue +import io.kotest.matchers.ints.shouldBeExactly +import io.kotest.matchers.longs.shouldBeExactly +import io.kotest.matchers.shouldBe +import nebulosa.io.SeekableSink +import nebulosa.io.SeekableSource +import okio.Buffer + +abstract class AbstractSeekableSinkAndSourceTest : StringSpec() { + + abstract val sink: SeekableSink + abstract val source: SeekableSource + + init { + afterEach { + sink.seek(0) + source.seek(0) + } + + "byte" { + val buffer = Buffer() + buffer.writeByte(-12) + sink.seek(0) + sink.write(buffer, 1) + sink.exhausted.shouldBeFalse() + sink.position shouldBeExactly 1 + + source.seek(0) + source.read(buffer, 1) + source.exhausted.shouldBeFalse() + source.position shouldBeExactly 1 + buffer.readByte().toInt() shouldBeExactly -12 + } + "short-le" { + val buffer = Buffer() + buffer.writeShortLe(-23975) + sink.seek(0) + sink.write(buffer, 2) + sink.exhausted.shouldBeFalse() + sink.position shouldBeExactly 2 + + source.seek(0) + source.read(buffer, 2) + source.exhausted.shouldBeFalse() + source.position shouldBeExactly 2 + buffer.readShortLe().toInt() shouldBeExactly -23975 + } + "short" { + val buffer = Buffer() + buffer.writeShort(-23975) + sink.seek(0) + sink.write(buffer, 2) + sink.exhausted.shouldBeFalse() + sink.position shouldBeExactly 2 + + source.seek(0) + source.read(buffer, 2) + source.exhausted.shouldBeFalse() + source.position shouldBeExactly 2 + buffer.readShort().toInt() shouldBeExactly -23975 + } + "int-le" { + val buffer = Buffer() + buffer.writeIntLe(-145983) + sink.seek(0) + sink.write(buffer, 4) + sink.exhausted.shouldBeFalse() + sink.position shouldBeExactly 4 + + source.seek(0) + source.read(buffer, 4) + source.exhausted.shouldBeFalse() + source.position shouldBeExactly 4 + buffer.readIntLe() shouldBeExactly -145983 + } + "int" { + val buffer = Buffer() + buffer.writeInt(-145983) + sink.seek(0) + sink.write(buffer, 4) + sink.exhausted.shouldBeFalse() + sink.position shouldBeExactly 4 + + source.seek(0) + source.read(buffer, 4) + source.exhausted.shouldBeFalse() + source.position shouldBeExactly 4 + buffer.readInt() shouldBeExactly -145983 + } + "long-le" { + val buffer = Buffer() + buffer.writeLongLe(-3534545345345) + sink.seek(0) + sink.write(buffer, 8) + sink.exhausted.shouldBeTrue() + sink.position shouldBeExactly 8 + + source.seek(0) + source.read(buffer, 8) + source.exhausted.shouldBeTrue() + source.position shouldBeExactly 8 + buffer.readLongLe() shouldBeExactly -3534545345345 + } + "long" { + val buffer = Buffer() + buffer.writeLong(-3534545345345) + sink.seek(0) + sink.write(buffer, 8) + sink.exhausted.shouldBeTrue() + sink.position shouldBeExactly 8 + + source.seek(0) + source.read(buffer, 8) + source.exhausted.shouldBeTrue() + source.position shouldBeExactly 8 + buffer.readLong() shouldBeExactly -3534545345345 + } + "ascii" { + val buffer = Buffer() + buffer.writeString("Gê", Charsets.ISO_8859_1) + sink.seek(0) + sink.write(buffer, 2) + sink.exhausted.shouldBeFalse() + sink.position shouldBeExactly 2 + + source.seek(0) + source.read(buffer, 2) + source.exhausted.shouldBeFalse() + source.position shouldBeExactly 2 + buffer.readString(Charsets.ISO_8859_1) shouldBe "Gê" + } + "utf-8" { + val buffer = Buffer() + buffer.writeUtf8("\uD83D\uDE0A") + sink.seek(0) + sink.write(buffer, 4) + sink.exhausted.shouldBeFalse() + sink.position shouldBeExactly 4 + + source.seek(0) + source.read(buffer, 4) + source.exhausted.shouldBeFalse() + source.position shouldBeExactly 4 + buffer.readUtf8() shouldBe "\uD83D\uDE0A" + } + "seek and exhausted" { + val buffer = Buffer() + buffer.writeByte(99) + sink.seek(7) + sink.exhausted.shouldBeFalse() + sink.position shouldBeExactly 7 + sink.write(buffer, 1) + sink.exhausted.shouldBeTrue() + sink.position shouldBeExactly 8 + + source.seek(7) + source.exhausted.shouldBeFalse() + source.position shouldBeExactly 7 + source.read(buffer, 1) + source.exhausted.shouldBeTrue() + source.position shouldBeExactly 8 + buffer.readByte() shouldBe 99 + } + "seek and not exhausted" { + val buffer = Buffer() + buffer.writeByte(99) + sink.seek(6) + sink.exhausted.shouldBeFalse() + sink.position shouldBeExactly 6 + sink.write(buffer, 1) + sink.exhausted.shouldBeFalse() + sink.position shouldBeExactly 7 + + source.seek(6) + source.exhausted.shouldBeFalse() + source.position shouldBeExactly 6 + source.read(buffer, 1) + source.exhausted.shouldBeFalse() + source.position shouldBeExactly 7 + buffer.readByte() shouldBe 99 + } + "negative seek and exhausted" { + val buffer = Buffer() + buffer.writeByte(99) + sink.seek(-1) + sink.exhausted.shouldBeFalse() + sink.position shouldBeExactly 7 + sink.write(buffer, 1) + sink.exhausted.shouldBeTrue() + sink.position shouldBeExactly 8 + + source.seek(-1) + source.exhausted.shouldBeFalse() + source.position shouldBeExactly 7 + source.read(buffer, 1) + source.exhausted.shouldBeTrue() + source.position shouldBeExactly 8 + buffer.readByte() shouldBe 99 + } + "negative seek and not exhausted" { + val buffer = Buffer() + buffer.writeByte(99) + sink.seek(-2) + sink.exhausted.shouldBeFalse() + sink.position shouldBeExactly 6 + sink.write(buffer, 1) + sink.exhausted.shouldBeFalse() + sink.position shouldBeExactly 7 + + source.seek(-2) + source.exhausted.shouldBeFalse() + source.position shouldBeExactly 6 + source.read(buffer, 1) + source.exhausted.shouldBeFalse() + source.position shouldBeExactly 7 + buffer.readByte() shouldBe 99 + } + "skip and exhausted" { + val buffer = Buffer() + buffer.writeByte(99) + sink.skip(7) + sink.exhausted.shouldBeFalse() + sink.position shouldBeExactly 7 + sink.write(buffer, 1) + sink.exhausted.shouldBeTrue() + sink.position shouldBeExactly 8 + + source.skip(7) + source.exhausted.shouldBeFalse() + source.position shouldBeExactly 7 + source.read(buffer, 1) + source.exhausted.shouldBeTrue() + source.position shouldBeExactly 8 + buffer.readByte() shouldBe 99 + } + "skip and not exhausted" { + val buffer = Buffer() + buffer.writeByte(99) + sink.skip(6) + sink.exhausted.shouldBeFalse() + sink.position shouldBeExactly 6 + sink.write(buffer, 1) + sink.exhausted.shouldBeFalse() + sink.position shouldBeExactly 7 + + source.skip(6) + source.exhausted.shouldBeFalse() + source.position shouldBeExactly 6 + source.read(buffer, 1) + source.exhausted.shouldBeFalse() + source.position shouldBeExactly 7 + buffer.readByte() shouldBe 99 + } + "negative skip and exhausted" { + val buffer = Buffer() + buffer.writeByte(99) + sink.skip(-1) + sink.exhausted.shouldBeFalse() + sink.position shouldBeExactly 7 + sink.write(buffer, 1) + sink.exhausted.shouldBeTrue() + sink.position shouldBeExactly 8 + + source.skip(-1) + source.exhausted.shouldBeFalse() + source.position shouldBeExactly 7 + source.read(buffer, 1) + source.exhausted.shouldBeTrue() + source.position shouldBeExactly 8 + buffer.readByte() shouldBe 99 + } + "negative skip and not exhausted" { + val buffer = Buffer() + buffer.writeByte(99) + sink.skip(-2) + sink.exhausted.shouldBeFalse() + sink.position shouldBeExactly 6 + sink.write(buffer, 1) + sink.exhausted.shouldBeFalse() + sink.position shouldBeExactly 7 + + source.skip(-2) + source.exhausted.shouldBeFalse() + source.position shouldBeExactly 6 + source.read(buffer, 1) + source.exhausted.shouldBeFalse() + source.position shouldBeExactly 7 + buffer.readByte() shouldBe 99 + } + } +} diff --git a/nebulosa-io/src/test/kotlin/BufferedByteArrayTest.kt b/nebulosa-io/src/test/kotlin/BufferedByteArrayTest.kt deleted file mode 100644 index a71ecf63f..000000000 --- a/nebulosa-io/src/test/kotlin/BufferedByteArrayTest.kt +++ /dev/null @@ -1,124 +0,0 @@ -import io.kotest.assertions.throwables.shouldNotThrow -import io.kotest.assertions.throwables.shouldThrow -import io.kotest.core.spec.style.StringSpec -import io.kotest.matchers.booleans.shouldBeFalse -import io.kotest.matchers.booleans.shouldBeTrue -import io.kotest.matchers.doubles.shouldBeExactly -import io.kotest.matchers.floats.shouldBeExactly -import io.kotest.matchers.ints.shouldBeExactly -import io.kotest.matchers.longs.shouldBeExactly -import io.kotest.matchers.shouldBe -import nebulosa.io.* -import okio.buffer -import okio.utf8Size -import java.io.EOFException - -class BufferedByteArrayTest : StringSpec() { - - init { - val data = ByteArray(79) - - "write" { - val sink = data.sink() - - val buffer = sink.buffer() - buffer.writeByte(0xab) - buffer.writeShort(0xabcd) - buffer.writeShortLe(0x2143) - buffer.writeInt(-0x543210ff) - buffer.writeIntLe(-0x789abcdf) - buffer.writeLong(-0x543210fe789abcdfL) - buffer.writeLongLe(-0x350145414f4ea400L) - buffer.writeFloat(3.14f) - buffer.writeFloatLe(3.14f) - buffer.writeDouble(3.14) - buffer.writeDoubleLe(3.14) - buffer.writeUtf8("təˈranəˌsôr") - buffer.writeUtf8CodePoint("µ".codePointAt(0)) - buffer.writeString("c", charset = Charsets.UTF_32BE) - buffer.write(byteArrayOf(1, 2, 3)) - buffer.writeByte(0xf9) - buffer.flush() - } - "read" { - val source = data.source() - - val buffer = source.buffer() - buffer.readUnsignedByte() shouldBeExactly 0xab - buffer.readShort().toInt() and 0xffff shouldBeExactly 0xabcd - buffer.readShortLe().toInt() and 0xffff shouldBeExactly 0x2143 - buffer.readInt() shouldBeExactly -0x543210ff - buffer.readIntLe() shouldBeExactly -0x789abcdf - buffer.readLong() shouldBeExactly -0x543210fe789abcdfL - buffer.readLongLe() shouldBeExactly -0x350145414f4ea400L - buffer.readFloat() shouldBeExactly 3.14f - buffer.readFloatLe() shouldBeExactly 3.14f - buffer.readDouble() shouldBeExactly 3.14 - buffer.readDoubleLe() shouldBeExactly 3.14 - buffer.readUtf8("təˈranəˌsôr".utf8Size()) shouldBe "təˈranəˌsôr" - buffer.readUtf8CodePoint() shouldBeExactly "µ".codePointAt(0) - buffer.readString(4, Charsets.UTF_32BE) shouldBe "c" - buffer.readByteArray(3) shouldBe byteArrayOf(1, 2, 3) - buffer.exhausted().shouldBeFalse() - buffer.readUnsignedByte() shouldBeExactly 0xf9 - buffer.exhausted().shouldBeTrue() - } - "seek and write" { - val sink = data.sink() - sink.seek(-1L) - - val buffer = sink.buffer() - buffer.writeByte(0x44) - buffer.flush() - } - "skip and read" { - val source = data.source() - source.skip(78) - - val buffer = source.buffer() - buffer.exhausted().shouldBeFalse() - buffer.readSignedByte() shouldBeExactly 0x44 - buffer.exhausted().shouldBeTrue() - } - "seek and read" { - val source = data.source() - source.seek(-1L) - - val buffer = source.buffer() - buffer.exhausted().shouldBeFalse() - buffer.readSignedByte() shouldBeExactly 0x44 - buffer.exhausted().shouldBeTrue() - } - "write with offset and byte count" { - val sink = data.sink(2, 8) - - val buffer = sink.buffer() - buffer.writeDouble(3.14) - shouldNotThrow { buffer.flush() } - - buffer.writeByte(0x10) - shouldThrow { buffer.flush() } - } - "read with offset and byte count" { - val source = data.source(2, 8) - - val buffer = source.buffer() - buffer.exhausted().shouldBeFalse() - buffer.readDouble() shouldBeExactly 3.14 - buffer.exhausted().shouldBeTrue() - } - "close emits buffered bytes" { - data.fill(0) - - val sink = data.sink() - - sink.buffer().use { - it.writeByte(0x99) - } - - val source = data.source() - val buffer = source.buffer() - buffer.readUnsignedByte() shouldBeExactly 0x99 - } - } -} diff --git a/nebulosa-io/src/test/kotlin/BufferedRandomAccessFileTest.kt b/nebulosa-io/src/test/kotlin/BufferedRandomAccessFileTest.kt deleted file mode 100644 index 8d2d680f9..000000000 --- a/nebulosa-io/src/test/kotlin/BufferedRandomAccessFileTest.kt +++ /dev/null @@ -1,103 +0,0 @@ -import io.kotest.core.spec.style.StringSpec -import io.kotest.matchers.booleans.shouldBeFalse -import io.kotest.matchers.booleans.shouldBeTrue -import io.kotest.matchers.doubles.shouldBeExactly -import io.kotest.matchers.floats.shouldBeExactly -import io.kotest.matchers.ints.shouldBeExactly -import io.kotest.matchers.longs.shouldBeExactly -import io.kotest.matchers.shouldBe -import nebulosa.io.* -import okio.buffer -import okio.utf8Size - -class BufferedRandomAccessFileTest : StringSpec() { - - init { - val file = createFile() - - "write" { - val sink = file.seekableSink() - - val buffer = sink.buffer() - buffer.writeByte(0xab) - buffer.writeShort(0xabcd) - buffer.writeShortLe(0x2143) - buffer.writeInt(-0x543210ff) - buffer.writeIntLe(-0x789abcdf) - buffer.writeLong(-0x543210fe789abcdfL) - buffer.writeLongLe(-0x350145414f4ea400L) - buffer.writeFloat(3.14f) - buffer.writeFloatLe(3.14f) - buffer.writeDouble(3.14) - buffer.writeDoubleLe(3.14) - buffer.writeUtf8("təˈranəˌsôr") - buffer.writeUtf8CodePoint("µ".codePointAt(0)) - buffer.writeString("c", charset = Charsets.UTF_32BE) - buffer.write(byteArrayOf(1, 2, 3)) - buffer.writeByte(0xf9) - buffer.flush() - } - "read" { - val source = file.seekableSource() - - val buffer = source.buffer() - buffer.readUnsignedByte() shouldBeExactly 0xab - buffer.readShort().toInt() and 0xffff shouldBeExactly 0xabcd - buffer.readShortLe().toInt() and 0xffff shouldBeExactly 0x2143 - buffer.readInt() shouldBeExactly -0x543210ff - buffer.readIntLe() shouldBeExactly -0x789abcdf - buffer.readLong() shouldBeExactly -0x543210fe789abcdfL - buffer.readLongLe() shouldBeExactly -0x350145414f4ea400L - buffer.readFloat() shouldBeExactly 3.14f - buffer.readFloatLe() shouldBeExactly 3.14f - buffer.readDouble() shouldBeExactly 3.14 - buffer.readDoubleLe() shouldBeExactly 3.14 - buffer.readUtf8("təˈranəˌsôr".utf8Size()) shouldBe "təˈranəˌsôr" - buffer.readUtf8CodePoint() shouldBeExactly "µ".codePointAt(0) - buffer.readString(4, Charsets.UTF_32BE) shouldBe "c" - buffer.readByteArray(3) shouldBe byteArrayOf(1, 2, 3) - buffer.exhausted().shouldBeFalse() - buffer.readUnsignedByte() shouldBeExactly 0xf9 - buffer.exhausted().shouldBeTrue() - } - "seek and write" { - val sink = file.seekableSink() - sink.seek(-1L) - - val buffer = sink.buffer() - buffer.writeByte(0x44) - buffer.flush() - } - "skip and read" { - val source = file.seekableSource() - source.skip(78) - - val buffer = source.buffer() - buffer.exhausted().shouldBeFalse() - buffer.readSignedByte() shouldBeExactly 0x44 - buffer.exhausted().shouldBeTrue() - } - "seek and read" { - val source = file.seekableSource() - source.seek(-1L) - - val buffer = source.buffer() - buffer.exhausted().shouldBeFalse() - buffer.readSignedByte() shouldBeExactly 0x44 - buffer.exhausted().shouldBeTrue() - } - "close emits buffered bytes" { - file.writeBytes(EMPTY_BYTE_ARRAY) - - val sink = file.seekableSink() - - sink.buffer().use { - it.writeByte(0x99) - } - - val source = file.seekableSource() - val buffer = source.buffer() - buffer.readUnsignedByte() shouldBeExactly 0x99 - } - } -} diff --git a/nebulosa-io/src/test/kotlin/ByteArrayTest.kt b/nebulosa-io/src/test/kotlin/ByteArrayTest.kt new file mode 100644 index 000000000..70078b523 --- /dev/null +++ b/nebulosa-io/src/test/kotlin/ByteArrayTest.kt @@ -0,0 +1,10 @@ +import nebulosa.io.sink +import nebulosa.io.source + +class ByteArrayTest : AbstractSeekableSinkAndSourceTest() { + + private val data = ByteArray(8) + + override val sink = data.sink() + override val source = data.source() +} diff --git a/nebulosa-io/src/test/kotlin/ByteArrayWithOffsetAndLengthTest.kt b/nebulosa-io/src/test/kotlin/ByteArrayWithOffsetAndLengthTest.kt new file mode 100644 index 000000000..1fc9f0e40 --- /dev/null +++ b/nebulosa-io/src/test/kotlin/ByteArrayWithOffsetAndLengthTest.kt @@ -0,0 +1,22 @@ +import io.kotest.matchers.ints.shouldBeExactly +import nebulosa.io.sink +import nebulosa.io.source + +class ByteArrayWithOffsetAndLengthTest : AbstractSeekableSinkAndSourceTest() { + + private val data = ByteArray(16) { it.toByte() } + + override val sink = data.sink(5, 8) + override val source = data.source(5, 8) + + init { + afterEach { + for (i in 0..4) { + data[i].toInt() shouldBeExactly i + } + for (i in 13..15) { + data[i].toInt() shouldBeExactly i + } + } + } +} diff --git a/nebulosa-io/src/test/kotlin/ByteArrayWithOffsetTest.kt b/nebulosa-io/src/test/kotlin/ByteArrayWithOffsetTest.kt new file mode 100644 index 000000000..62c2a0994 --- /dev/null +++ b/nebulosa-io/src/test/kotlin/ByteArrayWithOffsetTest.kt @@ -0,0 +1,19 @@ +import io.kotest.matchers.ints.shouldBeExactly +import nebulosa.io.sink +import nebulosa.io.source + +class ByteArrayWithOffsetTest : AbstractSeekableSinkAndSourceTest() { + + private val data = ByteArray(16) { it.toByte() } + + override val sink = data.sink(8) + override val source = data.source(8) + + init { + afterEach { + for (i in 0..7) { + data[i].toInt() shouldBeExactly i + } + } + } +} diff --git a/nebulosa-io/src/test/kotlin/ByteBufferTest.kt b/nebulosa-io/src/test/kotlin/ByteBufferTest.kt new file mode 100644 index 000000000..7c182416c --- /dev/null +++ b/nebulosa-io/src/test/kotlin/ByteBufferTest.kt @@ -0,0 +1,11 @@ +import nebulosa.io.sink +import nebulosa.io.source +import java.nio.ByteBuffer + +class ByteBufferTest : AbstractSeekableSinkAndSourceTest() { + + private val data = ByteBuffer.allocate(8) + + override val sink = data.sink() + override val source = data.source() +} diff --git a/nebulosa-io/src/test/kotlin/ByteBufferWithOffsetAndLengthTest.kt b/nebulosa-io/src/test/kotlin/ByteBufferWithOffsetAndLengthTest.kt new file mode 100644 index 000000000..02bc3f0c9 --- /dev/null +++ b/nebulosa-io/src/test/kotlin/ByteBufferWithOffsetAndLengthTest.kt @@ -0,0 +1,24 @@ +import io.kotest.matchers.ints.shouldBeExactly +import nebulosa.io.sink +import nebulosa.io.source +import java.nio.ByteBuffer + +class ByteBufferWithOffsetAndLengthTest : AbstractSeekableSinkAndSourceTest() { + + private val bytes = ByteArray(16) { it.toByte() } + private val data = ByteBuffer.wrap(bytes) + + override val sink = data.sink(5, 8) + override val source = data.source(5, 8) + + init { + afterEach { + for (i in 0..4) { + bytes[i].toInt() shouldBeExactly i + } + for (i in 13..15) { + bytes[i].toInt() shouldBeExactly i + } + } + } +} diff --git a/nebulosa-io/src/test/kotlin/ByteBufferWithOffsetTest.kt b/nebulosa-io/src/test/kotlin/ByteBufferWithOffsetTest.kt new file mode 100644 index 000000000..f501d8691 --- /dev/null +++ b/nebulosa-io/src/test/kotlin/ByteBufferWithOffsetTest.kt @@ -0,0 +1,21 @@ +import io.kotest.matchers.ints.shouldBeExactly +import nebulosa.io.sink +import nebulosa.io.source +import java.nio.ByteBuffer + +class ByteBufferWithOffsetTest : AbstractSeekableSinkAndSourceTest() { + + private val bytes = ByteArray(16) { it.toByte() } + private val data = ByteBuffer.wrap(bytes) + + override val sink = data.sink(8) + override val source = data.source(8) + + init { + afterEach { + for (i in 0..7) { + bytes[i].toInt() shouldBeExactly i + } + } + } +} diff --git a/nebulosa-io/src/test/kotlin/ByteBufferWrappedWithOffsetAndLengthTest.kt b/nebulosa-io/src/test/kotlin/ByteBufferWrappedWithOffsetAndLengthTest.kt new file mode 100644 index 000000000..a273d0b20 --- /dev/null +++ b/nebulosa-io/src/test/kotlin/ByteBufferWrappedWithOffsetAndLengthTest.kt @@ -0,0 +1,24 @@ +import io.kotest.matchers.ints.shouldBeExactly +import nebulosa.io.sink +import nebulosa.io.source +import java.nio.ByteBuffer + +class ByteBufferWrappedWithOffsetAndLengthTest : AbstractSeekableSinkAndSourceTest() { + + private val bytes = ByteArray(16) { it.toByte() } + private val data = ByteBuffer.wrap(bytes, 5, 8) + + override val sink = data.sink() + override val source = data.source() + + init { + afterEach { + for (i in 0..4) { + bytes[i].toInt() shouldBeExactly i + } + for (i in 13..15) { + bytes[i].toInt() shouldBeExactly i + } + } + } +} diff --git a/nebulosa-io/src/test/kotlin/RandomAccessFileTest.kt b/nebulosa-io/src/test/kotlin/RandomAccessFileTest.kt new file mode 100644 index 000000000..3e759064b --- /dev/null +++ b/nebulosa-io/src/test/kotlin/RandomAccessFileTest.kt @@ -0,0 +1,15 @@ +import io.kotest.engine.spec.tempfile +import nebulosa.io.seekableSink +import nebulosa.io.seekableSource + +class RandomAccessFileTest : AbstractSeekableSinkAndSourceTest() { + + private val file = tempfile() + + override val sink = file.seekableSink() + override val source = file.seekableSource() + + init { + file.writeBytes(ByteArray(8)) + } +} diff --git a/nebulosa-io/src/test/kotlin/BufferedRandomSourceTest.kt b/nebulosa-io/src/test/kotlin/RandomSourceTest.kt similarity index 91% rename from nebulosa-io/src/test/kotlin/BufferedRandomSourceTest.kt rename to nebulosa-io/src/test/kotlin/RandomSourceTest.kt index fb5cd4a89..742d24245 100644 --- a/nebulosa-io/src/test/kotlin/BufferedRandomSourceTest.kt +++ b/nebulosa-io/src/test/kotlin/RandomSourceTest.kt @@ -4,7 +4,7 @@ import nebulosa.io.source import okio.buffer import java.util.* -class BufferedRandomSourceTest : StringSpec() { +class RandomSourceTest : StringSpec() { init { "read full segment" { @@ -28,7 +28,7 @@ class BufferedRandomSourceTest : StringSpec() { val counter = IntArray(256) for (byte in this) { - counter[byte.toInt() and 0xff]++ + counter[byte.toInt() and 0xFF]++ } val average = counter.average() diff --git a/nebulosa-io/src/test/kotlin/Util.kt b/nebulosa-io/src/test/kotlin/Util.kt deleted file mode 100644 index 9fd8175f5..000000000 --- a/nebulosa-io/src/test/kotlin/Util.kt +++ /dev/null @@ -1,8 +0,0 @@ -import java.io.File -import java.util.* - -internal fun createFile(): File { - val name = UUID.randomUUID().toString() - return File.createTempFile(name, ".dat") - .also { it.deleteOnExit() } -} diff --git a/nebulosa-math/src/test/kotlin/Vector3DTest.kt b/nebulosa-math/src/test/kotlin/Vector3DTest.kt index bb9e95324..8a3cb9676 100644 --- a/nebulosa-math/src/test/kotlin/Vector3DTest.kt +++ b/nebulosa-math/src/test/kotlin/Vector3DTest.kt @@ -8,7 +8,7 @@ import nebulosa.constants.PIOVERTWO import nebulosa.math.Vector3D import nebulosa.math.deg import nebulosa.math.toDegrees -import nebulosa.test.plusOrMinus +import nebulosa.test.matchers.plusOrMinus class Vector3DTest : StringSpec() { diff --git a/nebulosa-nasa/src/main/kotlin/nebulosa/nasa/daf/Daf.kt b/nebulosa-nasa/src/main/kotlin/nebulosa/nasa/daf/Daf.kt index e71ae9184..c4e5a349b 100644 --- a/nebulosa-nasa/src/main/kotlin/nebulosa/nasa/daf/Daf.kt +++ b/nebulosa-nasa/src/main/kotlin/nebulosa/nasa/daf/Daf.kt @@ -18,43 +18,40 @@ abstract class Daf : Closeable { inline operator fun component2() = summaries open fun read() { - val buffer = Buffer() - - try { + Buffer().use { buffer -> // File record. - val source = buffer.readRecord(1) - // Gets the file format. - val format = buffer.read(source, 8L) { it.readAscii().uppercase() } - - if (format == "NAIF/DAF") { - source.seek(0L) - record = buffer.read(source, 88L) { it.parseFileRecord(false) } + buffer.readRecord(1).use { source -> + // Gets the file format. + val format = buffer.read(source, 8L) { it.readAscii().uppercase() } - if (record.nd != 2) { + if (format == "NAIF/DAF") { source.seek(0L) - record = buffer.read(source, 88L) { it.parseFileRecord(true) } + record = buffer.read(source, 88L) { it.parseFileRecord(false) } if (record.nd != 2) { - throw IOException("neither a big nor a little-endian scan of this file produces the expected ND=2") + source.seek(0L) + record = buffer.read(source, 88L) { it.parseFileRecord(true) } + + if (record.nd != 2) { + throw IOException("neither a big nor a little-endian scan of this file produces the expected ND=2") + } } - } - } else if (format.startsWith("DAF/")) { - source.seek(699L) + } else if (format.startsWith("DAF/")) { + source.seek(699L) - val magic = buffer.read(source, FTPSTR.length.toLong()) { it.readLatin1() } + val magic = buffer.read(source, FTPSTR.length.toLong()) { it.readLatin1() } - if (magic != FTPSTR) throw IOException("file has been damaged") + if (magic != FTPSTR) throw IOException("file has been damaged") - source.seek(88L) - val littleEndian = buffer.read(source, 8L) { it.readAscii().uppercase() == "LTL-IEEE" } + source.seek(88L) + val littleEndian = buffer.read(source, 8L) { it.readAscii().uppercase() == "LTL-IEEE" } - source.seek(0L) - record = buffer.read(source, 88L) { it.parseFileRecord(littleEndian) } - } else { - throw IOException("unsupported format: $format") + source.seek(0L) + record = buffer.read(source, 88L) { it.parseFileRecord(littleEndian) } + } else { + throw IOException("unsupported format: $format") + } } - } finally { - buffer.clear() } } @@ -66,18 +63,20 @@ abstract class Daf : Closeable { val summaries = ArrayList
() var recordNumber = record.fward - val buffer = Buffer() - val length = record.nd * 8L + record.ni * 4L - val step = length - length % 8 + Buffer().use { buffer -> + val length = record.nd * 8L + record.ni * 4L + val step = length - length % 8 - while (recordNumber != 0) { - val data = buffer.readRecord(recordNumber) - val sc = buffer.read(data, 24L) { it.parseSummaryControlRecord() } - summaries.addAll(parseSummaries(recordNumber, sc.numberOfSummaries, data, step)) - recordNumber = sc.nextNumber - } + while (recordNumber != 0) { + buffer.readRecord(recordNumber).use { source -> + val sc = buffer.read(source, 24L) { it.parseSummaryControlRecord() } + summaries.addAll(parseSummaries(recordNumber, sc.numberOfSummaries, source, step)) + recordNumber = sc.nextNumber + } + } - summaries + summaries + } } private fun parseSummaries( @@ -89,17 +88,19 @@ abstract class Daf : Closeable { ): List { val summaries = ArrayList() - val buffer = Buffer() - val nameData = buffer.readRecord(recordNumber + 1) - val elementRecordSizeInBytes = record.nd * 8L + record.ni * 4L + Buffer().use { buffer -> + buffer.readRecord(recordNumber + 1).use { source -> + val elementRecordSizeInBytes = record.nd * 8L + record.ni * 4L - for (i in 0 until numberOfSummaries * step step step) { - nameData.seek(i) - val name = buffer.read(nameData, step).use { it.readAscii().trim() } + for (i in 0 until numberOfSummaries * step step step) { + source.seek(i) + val name = buffer.read(source, step).use { it.readAscii().trim() } - data.seek(24 + i) - val elements = buffer.read(data, elementRecordSizeInBytes) { it.parseElementRecords() } - summaries.add(Summary(name, elements.first, elements.second)) + data.seek(24 + i) + val elements = buffer.read(data, elementRecordSizeInBytes) { it.parseElementRecords() } + summaries.add(Summary(name, elements.first, elements.second)) + } + } } return summaries diff --git a/nebulosa-nasa/src/main/kotlin/nebulosa/nasa/daf/SourceDaf.kt b/nebulosa-nasa/src/main/kotlin/nebulosa/nasa/daf/SourceDaf.kt index 6dea30ff2..153001e80 100644 --- a/nebulosa-nasa/src/main/kotlin/nebulosa/nasa/daf/SourceDaf.kt +++ b/nebulosa-nasa/src/main/kotlin/nebulosa/nasa/daf/SourceDaf.kt @@ -12,9 +12,10 @@ class SourceDaf(private val source: SeekableSource) : Daf(), Closeable by source override fun read(start: Int, end: Int): DoubleArray { source.seek(8L * (start - 1)) val length = 1 + end - start - val buffer = Buffer() - source.read(buffer, length * 8L) - return buffer.readDoubleArray(length, record.order) + return Buffer().use { buffer -> + source.read(buffer, length * 8L) + buffer.readDoubleArray(length, record.order) + } } override fun Buffer.readRecord(index: Int): SeekableSource { diff --git a/nebulosa-nova/src/test/kotlin/FixedStarTest.kt b/nebulosa-nova/src/test/kotlin/FixedStarTest.kt index 73331aa14..4796e4084 100644 --- a/nebulosa-nova/src/test/kotlin/FixedStarTest.kt +++ b/nebulosa-nova/src/test/kotlin/FixedStarTest.kt @@ -36,7 +36,7 @@ class FixedStarTest : StringSpec() { with(ra.normalized.hms()) { truncate(this[0]) shouldBeExactly 3.0 truncate(this[1]) shouldBeExactly 2.0 - this[2] shouldBe (3.9 plusOrMinus 15.0) + this[2] shouldBe (3.9 plusOrMinus 20.0) } with(dec.dms()) { diff --git a/nebulosa-nova/src/test/kotlin/ICRFTest.kt b/nebulosa-nova/src/test/kotlin/ICRFTest.kt index ba3229db0..8725481cc 100644 --- a/nebulosa-nova/src/test/kotlin/ICRFTest.kt +++ b/nebulosa-nova/src/test/kotlin/ICRFTest.kt @@ -4,7 +4,10 @@ import io.kotest.matchers.shouldBe import nebulosa.math.* import nebulosa.nova.position.Geoid import nebulosa.nova.position.ICRF -import nebulosa.time.* +import nebulosa.time.IERS +import nebulosa.time.IERSA +import nebulosa.time.TT +import nebulosa.time.TimeYMDHMS import java.nio.file.Path import kotlin.io.path.inputStream diff --git a/nebulosa-plate-solving/build.gradle.kts b/nebulosa-plate-solving/build.gradle.kts index 12b716a2d..56296109b 100644 --- a/nebulosa-plate-solving/build.gradle.kts +++ b/nebulosa-plate-solving/build.gradle.kts @@ -7,7 +7,7 @@ dependencies { api(project(":nebulosa-math")) api(project(":nebulosa-common")) api(project(":nebulosa-wcs")) - api(project(":nebulosa-imaging")) + api(project(":nebulosa-image")) implementation(project(":nebulosa-log")) testImplementation(project(":nebulosa-test")) } diff --git a/nebulosa-plate-solving/src/main/kotlin/nebulosa/plate/solving/PlateSolution.kt b/nebulosa-plate-solving/src/main/kotlin/nebulosa/plate/solving/PlateSolution.kt index e092bc4c3..e0ee3c598 100644 --- a/nebulosa-plate-solving/src/main/kotlin/nebulosa/plate/solving/PlateSolution.kt +++ b/nebulosa-plate-solving/src/main/kotlin/nebulosa/plate/solving/PlateSolution.kt @@ -1,9 +1,9 @@ package nebulosa.plate.solving -import nebulosa.fits.Header -import nebulosa.fits.HeaderCard -import nebulosa.fits.ReadOnlyHeader -import nebulosa.fits.Standard +import nebulosa.fits.FitsHeader +import nebulosa.fits.FitsKeyword +import nebulosa.image.format.HeaderCard +import nebulosa.image.format.ReadableHeader import nebulosa.log.loggerFor import nebulosa.math.* import nebulosa.wcs.computeCdMatrix @@ -23,7 +23,7 @@ data class PlateSolution( val parity: Parity = Parity.NORMAL, val radius: Angle = hypot(width, height).rad / 2.0, private val header: Collection = emptyList(), -) : ReadOnlyHeader(header) { +) : FitsHeader.ReadOnly(header) { override fun readOnly() = this @@ -34,16 +34,16 @@ data class PlateSolution( @JvmStatic private val LOG = loggerFor() @JvmStatic - fun from(header: Header): PlateSolution? { + fun from(header: ReadableHeader): PlateSolution? { + val crval1 = header.getDoubleOrNull(FitsKeyword.CRVAL1)?.deg ?: return null + val crval2 = header.getDoubleOrNull(FitsKeyword.CRVAL2)?.deg ?: return null val (cd11, cd12, _, cd22) = header.computeCdMatrix() - val crota2 = header.getDoubleOrNull(Standard.CROTA2)?.deg ?: atan2(cd12, cd11).rad + val crota2 = header.getDoubleOrNull(FitsKeyword.CROTA2)?.deg ?: atan2(cd12, cd11).rad // https://danmoser.github.io/notes/gai_fits-imgs.html - val cdelt1 = header.getDoubleOrNull(Standard.CDELT1)?.deg ?: (cd11 / cos(crota2)).deg - val cdelt2 = header.getDoubleOrNull(Standard.CDELT2)?.deg ?: (cd22 / cos(crota2)).deg - val crval1 = header.getDoubleOrNull(Standard.CRVAL1)?.deg ?: return null - val crval2 = header.getDoubleOrNull(Standard.CRVAL2)?.deg ?: return null - val width = header.getIntOrNull(Standard.NAXIS1) ?: header.getInt("IMAGEW", 0) - val height = header.getIntOrNull(Standard.NAXIS2) ?: header.getInt("IMAGEH", 0) + val cdelt1 = header.getDoubleOrNull(FitsKeyword.CDELT1)?.deg ?: (cd11 / cos(crota2)).deg + val cdelt2 = header.getDoubleOrNull(FitsKeyword.CDELT2)?.deg ?: (cd22 / cos(crota2)).deg + val width = header.getIntOrNull(FitsKeyword.NAXIS1) ?: header.getInt("IMAGEW", 0) + val height = header.getIntOrNull(FitsKeyword.NAXIS2) ?: header.getInt("IMAGEH", 0) LOG.info( "solution from {}: ORIE={}, SCALE={}, RA={}, DEC={}", diff --git a/nebulosa-plate-solving/src/main/kotlin/nebulosa/plate/solving/PlateSolver.kt b/nebulosa-plate-solving/src/main/kotlin/nebulosa/plate/solving/PlateSolver.kt index 13efcc880..27ef2dadb 100644 --- a/nebulosa-plate-solving/src/main/kotlin/nebulosa/plate/solving/PlateSolver.kt +++ b/nebulosa-plate-solving/src/main/kotlin/nebulosa/plate/solving/PlateSolver.kt @@ -1,7 +1,7 @@ package nebulosa.plate.solving import nebulosa.common.concurrency.cancel.CancellationToken -import nebulosa.imaging.Image +import nebulosa.image.Image import nebulosa.math.Angle import java.nio.file.Path import java.time.Duration diff --git a/nebulosa-plate-solving/src/test/kotlin/PlateSolutionTest.kt b/nebulosa-plate-solving/src/test/kotlin/PlateSolutionTest.kt index 635c3341c..90afd4273 100644 --- a/nebulosa-plate-solving/src/test/kotlin/PlateSolutionTest.kt +++ b/nebulosa-plate-solving/src/test/kotlin/PlateSolutionTest.kt @@ -2,7 +2,7 @@ import io.kotest.core.spec.style.StringSpec import io.kotest.matchers.doubles.plusOrMinus import io.kotest.matchers.nulls.shouldNotBeNull import io.kotest.matchers.shouldBe -import nebulosa.fits.Header +import nebulosa.fits.FitsHeader import nebulosa.math.formatHMS import nebulosa.math.formatSignedDMS import nebulosa.math.toArcsec @@ -38,7 +38,7 @@ class PlateSolutionTest : StringSpec() { "END " "astrometry.net" { - val header = Header.from(astrometryNet) + val header = FitsHeader.from(astrometryNet) val solution = PlateSolution.from(header).shouldNotBeNull() solution.rightAscension.formatHMS() shouldBe "03h19m07.7s" diff --git a/nebulosa-sbd/src/test/kotlin/SmallBodyCloseApprochServiceTest.kt b/nebulosa-sbd/src/test/kotlin/SmallBodyCloseApprochServiceTest.kt index 267d7c7b0..b725a05ac 100644 --- a/nebulosa-sbd/src/test/kotlin/SmallBodyCloseApprochServiceTest.kt +++ b/nebulosa-sbd/src/test/kotlin/SmallBodyCloseApprochServiceTest.kt @@ -1,5 +1,6 @@ import io.kotest.core.spec.style.StringSpec import io.kotest.matchers.collections.shouldContainAll +import io.kotest.matchers.collections.shouldHaveAtLeastSize import io.kotest.matchers.collections.shouldHaveSize import io.kotest.matchers.doubles.plusOrMinus import io.kotest.matchers.ints.shouldBeGreaterThanOrEqual @@ -15,13 +16,13 @@ class SmallBodyCloseApprochServiceTest : StringSpec() { val service = SmallBodyDatabaseService() "search" { - val data = service.closeApproaches(distance = 10, date = LocalDate.of(2024, 3, 13)).execute().body() + val data = service.closeApproaches(distance = 10.0, date = LocalDate.of(2024, 3, 13)).execute().body() data.shouldNotBeNull() data.count shouldBeGreaterThanOrEqual 1 data.fields shouldHaveSize 14 - data.data shouldHaveSize 10 + data.data shouldHaveAtLeastSize 10 data.data[0][0] shouldBe "2024 EC3" data.data[0][3] shouldBe "2024-Mar-13 07:22" diff --git a/nebulosa-simbad/src/test/kotlin/SimbadServiceTest.kt b/nebulosa-simbad/src/test/kotlin/SimbadServiceTest.kt index 8cc87b702..23bde8e13 100644 --- a/nebulosa-simbad/src/test/kotlin/SimbadServiceTest.kt +++ b/nebulosa-simbad/src/test/kotlin/SimbadServiceTest.kt @@ -1,3 +1,4 @@ +import io.kotest.core.annotation.EnabledIf import io.kotest.core.spec.style.StringSpec import io.kotest.matchers.collections.shouldHaveAtLeastSize import io.kotest.matchers.nulls.shouldNotBeNull @@ -8,10 +9,12 @@ import nebulosa.math.arcmin import nebulosa.math.deg import nebulosa.math.hours import nebulosa.simbad.SimbadService +import nebulosa.test.NonGitHubOnlyCondition import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor import java.util.concurrent.TimeUnit +@EnabledIf(NonGitHubOnlyCondition::class) class SimbadServiceTest : StringSpec() { init { diff --git a/nebulosa-skycatalog/src/main/kotlin/nebulosa/skycatalog/SkyObjectType.kt b/nebulosa-skycatalog/src/main/kotlin/nebulosa/skycatalog/SkyObjectType.kt index 9c7afe99e..142ace1b8 100644 --- a/nebulosa-skycatalog/src/main/kotlin/nebulosa/skycatalog/SkyObjectType.kt +++ b/nebulosa-skycatalog/src/main/kotlin/nebulosa/skycatalog/SkyObjectType.kt @@ -163,10 +163,10 @@ enum class SkyObjectType( companion object { - @JvmStatic private val MAPPED_ENTRIES = HashMap(entries.size * 2) + @JvmStatic private val MAPPED = HashMap(entries.size * 2) .apply { SkyObjectType.entries.forEach { entry -> entry.codes.forEach { this[it] = entry } } } @JvmStatic - fun parse(type: String) = MAPPED_ENTRIES[type] + fun parse(type: String) = MAPPED[type] } } diff --git a/nebulosa-test/build.gradle.kts b/nebulosa-test/build.gradle.kts index 42421be4f..6ab8f1936 100644 --- a/nebulosa-test/build.gradle.kts +++ b/nebulosa-test/build.gradle.kts @@ -7,6 +7,7 @@ dependencies { api(project(":nebulosa-io")) api(project(":nebulosa-hips2fits")) api(project(":nebulosa-fits")) + api(project(":nebulosa-xisf")) api(libs.okhttp) api(libs.bundles.kotest) } diff --git a/nebulosa-test/src/main/kotlin/nebulosa/test/AbstractFitsAndXisfTest.kt b/nebulosa-test/src/main/kotlin/nebulosa/test/AbstractFitsAndXisfTest.kt new file mode 100644 index 000000000..7fda567c9 --- /dev/null +++ b/nebulosa-test/src/main/kotlin/nebulosa/test/AbstractFitsAndXisfTest.kt @@ -0,0 +1,233 @@ +package nebulosa.test + +import io.kotest.core.listeners.TestListener +import io.kotest.core.spec.style.StringSpec +import io.kotest.core.test.TestCase +import io.kotest.core.test.TestResult +import io.kotest.core.test.TestScope +import nebulosa.hips2fits.Hips2FitsService +import nebulosa.hips2fits.HipsSurvey +import nebulosa.image.format.ImageHdu +import nebulosa.io.transferAndCloseOutput +import nebulosa.math.Angle +import nebulosa.math.deg +import nebulosa.math.hours +import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.logging.HttpLoggingInterceptor +import okio.ByteString.Companion.toByteString +import java.awt.image.BufferedImage +import java.awt.image.DataBufferByte +import java.awt.image.DataBufferInt +import java.io.Closeable +import java.nio.file.Path +import java.util.concurrent.ConcurrentHashMap +import java.util.concurrent.ConcurrentLinkedDeque +import java.util.concurrent.TimeUnit +import javax.imageio.ImageIO +import kotlin.io.path.* + +@Suppress("PropertyName") +abstract class AbstractFitsAndXisfTest : StringSpec() { + + protected val M82_MONO_8_LZ4_XISF by lazy { download("M82.Mono.8.LZ4.xisf", GITHUB_XISF_URL) } + protected val M82_MONO_8_LZ4_HC_XISF by lazy { download("M82.Mono.8.LZ4-HC.xisf", GITHUB_XISF_URL) } + protected val M82_MONO_8_XISF by lazy { download("M82.Mono.8.xisf", GITHUB_XISF_URL) } + protected val M82_MONO_8_ZLIB_XISF by lazy { download("M82.Mono.8.ZLib.xisf", GITHUB_XISF_URL) } + protected val M82_MONO_8_ZSTANDARD_XISF by lazy { download("M82.Mono.8.ZStandard.xisf", GITHUB_XISF_URL) } + protected val M82_MONO_16_XISF by lazy { download("M82.Mono.16.xisf", GITHUB_XISF_URL) } + protected val M82_MONO_32_XISF by lazy { download("M82.Mono.32.xisf", GITHUB_XISF_URL) } + protected val M82_MONO_F32_XISF by lazy { download("M82.Mono.F32.xisf", GITHUB_XISF_URL) } + protected val M82_MONO_F64_XISF by lazy { download("M82.Mono.F64.xisf", GITHUB_XISF_URL) } + + protected val M82_COLOR_8_LZ4_XISF by lazy { download("M82.Color.8.LZ4.xisf", GITHUB_XISF_URL) } + protected val M82_COLOR_8_LZ4_HC_XISF by lazy { download("M82.Color.8.LZ4-HC.xisf", GITHUB_XISF_URL) } + protected val M82_COLOR_8_XISF by lazy { download("M82.Color.8.xisf", GITHUB_XISF_URL) } + protected val M82_COLOR_8_ZLIB_XISF by lazy { download("M82.Color.8.ZLib.xisf", GITHUB_XISF_URL) } + protected val M82_COLOR_8_ZSTANDARD_XISF by lazy { download("M82.Color.8.ZStandard.xisf", GITHUB_XISF_URL) } + protected val M82_COLOR_16_XISF by lazy { download("M82.Color.16.xisf", GITHUB_XISF_URL) } + protected val M82_COLOR_32_XISF by lazy { download("M82.Color.32.xisf", GITHUB_XISF_URL) } + protected val M82_COLOR_F32_XISF by lazy { download("M82.Color.F32.xisf", GITHUB_XISF_URL) } + protected val M82_COLOR_F64_XISF by lazy { download("M82.Color.F64.xisf", GITHUB_XISF_URL) } + protected val DEBAYER_XISF_PATH by lazy { download("Debayer.xisf", GITHUB_XISF_URL) } + + protected val NGC3344_MONO_8_FITS by lazy { download("NGC3344.Mono.8.fits", GITHUB_FITS_URL) } + protected val NGC3344_MONO_16_FITS by lazy { download("NGC3344.Mono.16.fits", GITHUB_FITS_URL) } + protected val NGC3344_MONO_32_FITS by lazy { download("NGC3344.Mono.32.fits", GITHUB_FITS_URL) } + protected val NGC3344_MONO_F32_FITS by lazy { download("NGC3344.Mono.F32.fits", GITHUB_FITS_URL) } + protected val NGC3344_MONO_F64_FITS by lazy { download("NGC3344.Mono.F64.fits", GITHUB_FITS_URL) } + + protected val NGC3344_COLOR_8_FITS by lazy { download("NGC3344.Color.8.fits", GITHUB_FITS_URL) } + protected val NGC3344_COLOR_16_FITS by lazy { download("NGC3344.Color.16.fits", GITHUB_FITS_URL) } + protected val NGC3344_COLOR_32_FITS by lazy { download("NGC3344.Color.32.fits", GITHUB_FITS_URL) } + protected val NGC3344_COLOR_F32_FITS by lazy { download("NGC3344.Color.F32.fits", GITHUB_FITS_URL) } + protected val NGC3344_COLOR_F64_FITS by lazy { download("NGC3344.Color.F64.fits", GITHUB_FITS_URL) } + + protected val PALETTE_MONO_8_FITS by lazy { download("PALETTE.Mono.8.fits", GITHUB_FITS_URL) } + protected val PALETTE_MONO_16_FITS by lazy { download("PALETTE.Mono.16.fits", GITHUB_FITS_URL) } + protected val PALETTE_MONO_32_FITS by lazy { download("PALETTE.Mono.32.fits", GITHUB_FITS_URL) } + protected val PALETTE_MONO_F32_FITS by lazy { download("PALETTE.Mono.F32.fits", GITHUB_FITS_URL) } + protected val PALETTE_MONO_F64_FITS by lazy { download("PALETTE.Mono.F64.fits", GITHUB_FITS_URL) } + + protected val PALETTE_COLOR_8_FITS by lazy { download("PALETTE.Color.8.fits", GITHUB_FITS_URL) } + protected val PALETTE_COLOR_16_FITS by lazy { download("PALETTE.Color.16.fits", GITHUB_FITS_URL) } + protected val PALETTE_COLOR_32_FITS by lazy { download("PALETTE.Color.32.fits", GITHUB_FITS_URL) } + protected val PALETTE_COLOR_F32_FITS by lazy { download("PALETTE.Color.F32.fits", GITHUB_FITS_URL) } + protected val PALETTE_COLOR_F64_FITS by lazy { download("PALETTE.Color.F64.fits", GITHUB_FITS_URL) } + + protected val PALETTE_MONO_8_XISF by lazy { download("PALETTE.Mono.8.xisf", GITHUB_XISF_URL) } + protected val PALETTE_MONO_16_XISF by lazy { download("PALETTE.Mono.16.xisf", GITHUB_XISF_URL) } + protected val PALETTE_MONO_32_XISF by lazy { download("PALETTE.Mono.32.xisf", GITHUB_XISF_URL) } + protected val PALETTE_MONO_F32_XISF by lazy { download("PALETTE.Mono.F32.xisf", GITHUB_XISF_URL) } + protected val PALETTE_MONO_F64_XISF by lazy { download("PALETTE.Mono.F64.xisf", GITHUB_XISF_URL) } + + protected val PALETTE_COLOR_8_XISF by lazy { download("PALETTE.Color.8.xisf", GITHUB_XISF_URL) } + protected val PALETTE_COLOR_16_XISF by lazy { download("PALETTE.Color.16.xisf", GITHUB_XISF_URL) } + protected val PALETTE_COLOR_32_XISF by lazy { download("PALETTE.Color.32.xisf", GITHUB_XISF_URL) } + protected val PALETTE_COLOR_F32_XISF by lazy { download("PALETTE.Color.F32.xisf", GITHUB_XISF_URL) } + protected val PALETTE_COLOR_F64_XISF by lazy { download("PALETTE.Color.F64.xisf", GITHUB_XISF_URL) } + + protected val DEBAYER_FITS by lazy { download("Debayer.fits", GITHUB_FITS_URL) } + protected val M6707HH by lazy { download("M6707HH.fits", ASTROPY_PHOTOMETRY_URL) } + protected val M31_FITS by lazy { download("00 42 44.3".hours, "41 16 9".deg, 3.deg) } + + protected val STAR_FOCUS_1 by lazy { download("STAR.FOCUS.1.fits", GITHUB_FITS_URL) } + protected val STAR_FOCUS_2 by lazy { download("STAR.FOCUS.2.fits", GITHUB_FITS_URL) } + protected val STAR_FOCUS_3 by lazy { download("STAR.FOCUS.3.fits", GITHUB_FITS_URL) } + protected val STAR_FOCUS_4 by lazy { download("STAR.FOCUS.4.fits", GITHUB_FITS_URL) } + protected val STAR_FOCUS_5 by lazy { download("STAR.FOCUS.5.fits", GITHUB_FITS_URL) } + protected val STAR_FOCUS_6 by lazy { download("STAR.FOCUS.6.fits", GITHUB_FITS_URL) } + protected val STAR_FOCUS_7 by lazy { download("STAR.FOCUS.7.fits", GITHUB_FITS_URL) } + protected val STAR_FOCUS_8 by lazy { download("STAR.FOCUS.8.fits", GITHUB_FITS_URL) } + protected val STAR_FOCUS_9 by lazy { download("STAR.FOCUS.9.fits", GITHUB_FITS_URL) } + protected val STAR_FOCUS_10 by lazy { download("STAR.FOCUS.10.fits", GITHUB_FITS_URL) } + protected val STAR_FOCUS_11 by lazy { download("STAR.FOCUS.11.fits", GITHUB_FITS_URL) } + protected val STAR_FOCUS_12 by lazy { download("STAR.FOCUS.12.fits", GITHUB_FITS_URL) } + protected val STAR_FOCUS_13 by lazy { download("STAR.FOCUS.13.fits", GITHUB_FITS_URL) } + protected val STAR_FOCUS_14 by lazy { download("STAR.FOCUS.14.fits", GITHUB_FITS_URL) } + protected val STAR_FOCUS_15 by lazy { download("STAR.FOCUS.15.fits", GITHUB_FITS_URL) } + protected val STAR_FOCUS_16 by lazy { download("STAR.FOCUS.16.fits", GITHUB_FITS_URL) } + protected val STAR_FOCUS_17 by lazy { download("STAR.FOCUS.17.fits", GITHUB_FITS_URL) } + + private val afterEach = AfterEach() + + init { + prependExtension(afterEach) + } + + protected fun TestScope.closeAfterEach(closeable: T) = closeable.apply { + afterEach.add(testCase to this) + } + + protected fun BufferedImage.save(name: String): Pair { + val path = Path.of("..", "data", "test", "$name.png").createParentDirectories() + ImageIO.write(this, "PNG", path.toFile()) + val md5 = path.md5() + println("$name: $md5") + return path to md5 + } + + protected fun ByteArray.md5(): String { + return toByteString().md5().hex() + } + + protected fun Path.md5(): String { + return readBytes().md5() + } + + protected fun download(name: String, baseUrl: String): Path { + return synchronize(name) { + val path = Path.of(System.getProperty("java.io.tmpdir"), name) + + if (!path.exists() || path.fileSize() <= 0L) { + val request = Request.Builder() + .get() + .url("$baseUrl/$name") + .build() + + val call = HTTP_CLIENT.newCall(request) + + call.execute().use { + it.body?.byteStream()?.transferAndCloseOutput(path.outputStream()) + } + } + + path + } + } + + protected fun download(centerRA: Angle, centerDEC: Angle, fov: Angle): Path { + val name = "$centerRA@$centerDEC@$fov".toByteArray().md5() + + return synchronize(name) { + val path = Path.of(System.getProperty("java.io.tmpdir"), name) + + if (!path.exists() || path.fileSize() <= 0L) { + HIPS_SERVICE + .query(CDS_P_DSS2_NIR.id, centerRA, centerDEC, 1280, 720, 0.0, fov) + .execute() + .body()!! + .use { it.byteStream().transferAndCloseOutput(path.outputStream()) } + } + + path + } + } + + protected fun ImageHdu.makeImage(): BufferedImage { + val type = if (numberOfChannels == 1) BufferedImage.TYPE_BYTE_GRAY else BufferedImage.TYPE_INT_RGB + val image = BufferedImage(width, height, type) + val numberOfPixels = data.numberOfPixels + + if (numberOfChannels == 1) { + val buffer = (image.raster.dataBuffer as DataBufferByte).data + + repeat(numberOfPixels) { + buffer[it] = (data.red[it] * 255f).toInt().toByte() + } + } else { + val buffer = (image.raster.dataBuffer as DataBufferInt).data + + repeat(numberOfPixels) { + val red = (data.red[it] * 255f).toInt() and 0xFF + val green = (data.green[it] * 255f).toInt() and 0xFF + val blue = (data.blue[it] * 255f).toInt() and 0xFF + buffer[it] = blue or (green shl 8) or (red shl 16) + } + } + + return image + } + + @Suppress("BlockingMethodInNonBlockingContext") + private class AfterEach : ConcurrentLinkedDeque>(), TestListener { + + override suspend fun afterEach(testCase: TestCase, result: TestResult) { + find { it.first === testCase }?.second?.close() ?: return + } + } + + companion object { + + const val ASTROPY_PHOTOMETRY_URL = "https://www.astropy.org/astropy-data/photometry" + const val GITHUB_FITS_URL = "https://github.com/tiagohm/nebulosa.data/raw/main/test/fits" + const val GITHUB_XISF_URL = "https://github.com/tiagohm/nebulosa.data/raw/main/test/xisf" + + @JvmStatic val HTTP_CLIENT = OkHttpClient.Builder() + .readTimeout(60L, TimeUnit.SECONDS) + .writeTimeout(60L, TimeUnit.SECONDS) + .connectTimeout(60L, TimeUnit.SECONDS) + .callTimeout(60L, TimeUnit.SECONDS) + .addInterceptor(HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BASIC)) + .build() + + @JvmStatic val HIPS_SERVICE = Hips2FitsService(httpClient = HTTP_CLIENT) + @JvmStatic val CDS_P_DSS2_NIR = HipsSurvey("CDS/P/DSS2/NIR") + @JvmStatic @PublishedApi internal val SYNC_KEYS = ConcurrentHashMap() + + inline fun synchronize(key: String, block: () -> R): R { + val lock = synchronized(SYNC_KEYS) { SYNC_KEYS.getOrPut(key) { Any() } } + return synchronized(lock, block) + } + } +} diff --git a/nebulosa-test/src/main/kotlin/nebulosa/test/FitsStringSpec.kt b/nebulosa-test/src/main/kotlin/nebulosa/test/FitsStringSpec.kt deleted file mode 100644 index 151665d1d..000000000 --- a/nebulosa-test/src/main/kotlin/nebulosa/test/FitsStringSpec.kt +++ /dev/null @@ -1,112 +0,0 @@ -package nebulosa.test - -import io.kotest.core.spec.style.StringSpec -import nebulosa.fits.fits -import nebulosa.io.transferAndCloseOutput -import okhttp3.OkHttpClient -import okhttp3.Request -import okio.ByteString.Companion.toByteString -import java.awt.image.BufferedImage -import java.nio.file.Path -import java.util.concurrent.TimeUnit -import java.util.zip.ZipInputStream -import javax.imageio.ImageIO -import kotlin.io.path.* - -@Suppress("PropertyName") -abstract class FitsStringSpec : StringSpec() { - - protected val FITS_DIR = "../data/fits" - - protected val NGC3344_COLOR_8 by lazy { "$FITS_DIR/NGC3344.Color.8.fits".fits() } - protected val NGC3344_COLOR_16 by lazy { "$FITS_DIR/NGC3344.Color.16.fits".fits() } - protected val NGC3344_COLOR_32 by lazy { "$FITS_DIR/NGC3344.Color.32.fits".fits() } - protected val NGC3344_COLOR_F32 by lazy { "$FITS_DIR/NGC3344.Color.F32.fits".fits() } - protected val NGC3344_COLOR_F64 by lazy { "$FITS_DIR/NGC3344.Color.F64.fits".fits() } - protected val NGC3344_MONO_8 by lazy { "$FITS_DIR/NGC3344.Mono.8.fits".fits() } - protected val NGC3344_MONO_16 by lazy { "$FITS_DIR/NGC3344.Mono.16.fits".fits() } - protected val NGC3344_MONO_32 by lazy { "$FITS_DIR/NGC3344.Mono.32.fits".fits() } - protected val NGC3344_MONO_F32 by lazy { "$FITS_DIR/NGC3344.Mono.F32.fits".fits() } - protected val NGC3344_MONO_F64 by lazy { "$FITS_DIR/NGC3344.Mono.F64.fits".fits() } - protected val M6707HH by lazy { download("M6707HH.fits", ASTROPY_PHOTOMETRY_URL).fits() } - protected val STAR_FOCUS_1 by lazy { "$FITS_DIR/STAR_FOCUS_1.fits".fits() } - protected val STAR_FOCUS_2 by lazy { "$FITS_DIR/STAR_FOCUS_2.fits".fits() } - protected val STAR_FOCUS_3 by lazy { "$FITS_DIR/STAR_FOCUS_3.fits".fits() } - protected val STAR_FOCUS_4 by lazy { "$FITS_DIR/STAR_FOCUS_4.fits".fits() } - protected val STAR_FOCUS_5 by lazy { "$FITS_DIR/STAR_FOCUS_5.fits".fits() } - protected val STAR_FOCUS_6 by lazy { "$FITS_DIR/STAR_FOCUS_6.fits".fits() } - protected val STAR_FOCUS_7 by lazy { "$FITS_DIR/STAR_FOCUS_7.fits".fits() } - protected val STAR_FOCUS_8 by lazy { "$FITS_DIR/STAR_FOCUS_8.fits".fits() } - protected val STAR_FOCUS_9 by lazy { "$FITS_DIR/STAR_FOCUS_9.fits".fits() } - protected val STAR_FOCUS_10 by lazy { "$FITS_DIR/STAR_FOCUS_10.fits".fits() } - protected val STAR_FOCUS_11 by lazy { "$FITS_DIR/STAR_FOCUS_11.fits".fits() } - protected val STAR_FOCUS_12 by lazy { "$FITS_DIR/STAR_FOCUS_12.fits".fits() } - protected val STAR_FOCUS_13 by lazy { "$FITS_DIR/STAR_FOCUS_13.fits".fits() } - protected val STAR_FOCUS_14 by lazy { "$FITS_DIR/STAR_FOCUS_14.fits".fits() } - protected val STAR_FOCUS_15 by lazy { "$FITS_DIR/STAR_FOCUS_15.fits".fits() } - protected val STAR_FOCUS_16 by lazy { "$FITS_DIR/STAR_FOCUS_16.fits".fits() } - protected val STAR_FOCUS_17 by lazy { "$FITS_DIR/STAR_FOCUS_17.fits".fits() } - protected val UNCALIBRATED by lazy { "$FITS_DIR/UNCALIBRATED.fits".fits() } - protected val DARK by lazy { "$FITS_DIR/DARK.fits".fits() } - protected val FLAT by lazy { "$FITS_DIR/FLAT.fits".fits() } - protected val BIAS by lazy { "$FITS_DIR/BIAS.fits".fits() } - - protected fun BufferedImage.save(name: String): Pair { - val path = Path.of("src", "test", "resources", "saved", "$name.png").createParentDirectories() - ImageIO.write(this, "PNG", path.toFile()) - return path to path.md5() - } - - protected fun Path.md5(): String { - return readBytes().toByteString().md5().hex() - } - - protected fun download(name: String, baseUrl: String): Path { - val path = Path.of(System.getProperty("java.io.tmpdir"), name) - - if (path.exists() && path.fileSize() > 0L) { - return path - } - - val request = Request.Builder() - .get() - .url("$baseUrl/$name") - .build() - - val call = HTTP_CLIENT.newCall(request) - - call.execute().use { - it.body?.byteStream()?.transferAndCloseOutput(path.outputStream()) - } - - return path - } - - protected fun unzip(name: String) { - val path = Path.of(FITS_DIR, "$name.zip") - - with(ZipInputStream(path.inputStream())) { - var zipEntry = getNextEntry() - - while (zipEntry != null) { - transferAndCloseOutput(Path.of(FITS_DIR, zipEntry.name).outputStream()) - zipEntry = getNextEntry() - } - - closeEntry() - close() - } - } - - companion object { - - const val ASTROPY_PHOTOMETRY_URL = "https://www.astropy.org/astropy-data/photometry" - - @JvmStatic val HTTP_CLIENT = OkHttpClient.Builder() - .readTimeout(60L, TimeUnit.SECONDS) - .writeTimeout(60L, TimeUnit.SECONDS) - .connectTimeout(60L, TimeUnit.SECONDS) - .callTimeout(60L, TimeUnit.SECONDS) - .build() - } -} diff --git a/nebulosa-test/src/main/kotlin/nebulosa/test/Hips2FitsStringSpec.kt b/nebulosa-test/src/main/kotlin/nebulosa/test/Hips2FitsStringSpec.kt deleted file mode 100644 index 89f5715fa..000000000 --- a/nebulosa-test/src/main/kotlin/nebulosa/test/Hips2FitsStringSpec.kt +++ /dev/null @@ -1,43 +0,0 @@ -package nebulosa.test - -import nebulosa.fits.fits -import nebulosa.hips2fits.Hips2FitsService -import nebulosa.hips2fits.HipsSurvey -import nebulosa.io.transferAndCloseOutput -import nebulosa.math.Angle -import nebulosa.math.deg -import nebulosa.math.hours -import okio.ByteString.Companion.toByteString -import java.nio.file.Path -import kotlin.io.path.exists -import kotlin.io.path.fileSize -import kotlin.io.path.outputStream - -@Suppress("PropertyName") -abstract class Hips2FitsStringSpec : FitsStringSpec() { - - protected val M31 by lazy { download("00 42 44.3".hours, "41 16 9".deg, 3.deg).fits() } - - protected fun download(centerRA: Angle, centerDEC: Angle, fov: Angle): Path { - val name = "$centerRA@$centerDEC@$fov".toByteArray().toByteString().md5().hex() - val path = Path.of(System.getProperty("java.io.tmpdir"), name) - - if (path.exists() && path.fileSize() > 0L) { - return path - } - - HIPS_SERVICE - .query(CDS_P_DSS2_NIR.id, centerRA, centerDEC, 1280, 720, 0.0, fov) - .execute() - .body()!! - .use { it.byteStream().transferAndCloseOutput(path.outputStream()) } - - return path - } - - companion object { - - @JvmStatic val HIPS_SERVICE = Hips2FitsService(httpClient = HTTP_CLIENT) - @JvmStatic val CDS_P_DSS2_NIR = HipsSurvey("CDS/P/DSS2/NIR") - } -} diff --git a/nebulosa-test/src/main/kotlin/nebulosa/test/MathMatchers.kt b/nebulosa-test/src/main/kotlin/nebulosa/test/matchers/MathMatchers.kt similarity index 98% rename from nebulosa-test/src/main/kotlin/nebulosa/test/MathMatchers.kt rename to nebulosa-test/src/main/kotlin/nebulosa/test/matchers/MathMatchers.kt index f49e4ad40..e884006eb 100644 --- a/nebulosa-test/src/main/kotlin/nebulosa/test/MathMatchers.kt +++ b/nebulosa-test/src/main/kotlin/nebulosa/test/matchers/MathMatchers.kt @@ -1,6 +1,6 @@ @file:Suppress("NOTHING_TO_INLINE") -package nebulosa.test +package nebulosa.test.matchers import io.kotest.matchers.Matcher import io.kotest.matchers.MatcherResult @@ -10,6 +10,8 @@ import nebulosa.math.Vector3D inline infix fun Vector3D.plusOrMinus(tolerance: Double) = Vector3DMatcher(this, tolerance) +inline infix fun Matrix3D.plusOrMinus(tolerance: Double) = Matrix3DMatcher(this, tolerance) + class Vector3DMatcher(expected: Vector3D, tolerance: Double) : Matcher { private val xMatcher = ToleranceMatcher(expected.x, tolerance) @@ -23,8 +25,6 @@ class Vector3DMatcher(expected: Vector3D, tolerance: Double) : Matcher } } -inline infix fun Matrix3D.plusOrMinus(tolerance: Double) = Matrix3DMatcher(this, tolerance) - class Matrix3DMatcher(expected: Matrix3D, tolerance: Double) : Matcher { private val a11Matcher = ToleranceMatcher(expected.a11, tolerance) diff --git a/nebulosa-time/src/test/kotlin/TAIMinusUTCTest.kt b/nebulosa-time/src/test/kotlin/TAIMinusUTCTest.kt index 2ed368ac6..28cbe7cc3 100644 --- a/nebulosa-time/src/test/kotlin/TAIMinusUTCTest.kt +++ b/nebulosa-time/src/test/kotlin/TAIMinusUTCTest.kt @@ -1,7 +1,7 @@ import io.kotest.core.spec.style.StringSpec import io.kotest.matchers.doubles.shouldBeExactly -import nebulosa.time.TimeDelta import nebulosa.time.TAIMinusUTC +import nebulosa.time.TimeDelta import nebulosa.time.TimeYMDHMS class TAIMinusUTCTest : StringSpec(), TimeDelta by TAIMinusUTC { diff --git a/nebulosa-time/src/test/kotlin/TDBMinusTTByFairheadAndBretagnon1990Test.kt b/nebulosa-time/src/test/kotlin/TDBMinusTTByFairheadAndBretagnon1990Test.kt index 1d88388e3..213306b9f 100644 --- a/nebulosa-time/src/test/kotlin/TDBMinusTTByFairheadAndBretagnon1990Test.kt +++ b/nebulosa-time/src/test/kotlin/TDBMinusTTByFairheadAndBretagnon1990Test.kt @@ -1,9 +1,9 @@ import io.kotest.core.spec.style.StringSpec import io.kotest.matchers.doubles.plusOrMinus import io.kotest.matchers.shouldBe -import nebulosa.time.TimeDelta import nebulosa.time.TDB import nebulosa.time.TDBMinusTTByFairheadAndBretagnon1990 +import nebulosa.time.TimeDelta class TDBMinusTTByFairheadAndBretagnon1990Test : StringSpec(), TimeDelta by TDBMinusTTByFairheadAndBretagnon1990 { diff --git a/nebulosa-watney/build.gradle.kts b/nebulosa-watney/build.gradle.kts index 7b107551b..fd34d8f83 100644 --- a/nebulosa-watney/build.gradle.kts +++ b/nebulosa-watney/build.gradle.kts @@ -5,7 +5,7 @@ plugins { dependencies { api(project(":nebulosa-erfa")) - api(project(":nebulosa-imaging")) + api(project(":nebulosa-image")) api(project(":nebulosa-star-detection")) api(project(":nebulosa-plate-solving")) api(libs.apache.collections) diff --git a/nebulosa-watney/src/main/kotlin/nebulosa/watney/plate/solving/ComputedPlateSolution.kt b/nebulosa-watney/src/main/kotlin/nebulosa/watney/plate/solving/ComputedPlateSolution.kt index cf011c837..ebb7a4ac9 100644 --- a/nebulosa-watney/src/main/kotlin/nebulosa/watney/plate/solving/ComputedPlateSolution.kt +++ b/nebulosa-watney/src/main/kotlin/nebulosa/watney/plate/solving/ComputedPlateSolution.kt @@ -1,11 +1,12 @@ package nebulosa.watney.plate.solving -import nebulosa.fits.Header +import nebulosa.image.format.Header +import nebulosa.image.format.ReadableHeader import nebulosa.math.Angle import nebulosa.plate.solving.Parity internal data class ComputedPlateSolution( - @JvmField val header: Header = Header(), + @JvmField val header: ReadableHeader = Header.Empty, @JvmField val orientation: Angle = 0.0, @JvmField val pixelScale: Double = 0.0, // arcsec/px @JvmField val centerRA: Angle = 0.0, diff --git a/nebulosa-watney/src/main/kotlin/nebulosa/watney/plate/solving/WatneyPlateSolver.kt b/nebulosa-watney/src/main/kotlin/nebulosa/watney/plate/solving/WatneyPlateSolver.kt index 9df007b95..46d2c6524 100644 --- a/nebulosa-watney/src/main/kotlin/nebulosa/watney/plate/solving/WatneyPlateSolver.kt +++ b/nebulosa-watney/src/main/kotlin/nebulosa/watney/plate/solving/WatneyPlateSolver.kt @@ -2,11 +2,10 @@ package nebulosa.watney.plate.solving import nebulosa.common.concurrency.cancel.CancellationToken import nebulosa.erfa.SphericalCoordinate -import nebulosa.fits.Header -import nebulosa.fits.NOAOExt -import nebulosa.fits.Standard +import nebulosa.fits.FitsHeader +import nebulosa.fits.FitsKeyword import nebulosa.fits.fits -import nebulosa.imaging.Image +import nebulosa.image.Image import nebulosa.log.debug import nebulosa.log.loggerFor import nebulosa.math.Angle @@ -391,19 +390,19 @@ data class WatneyPlateSolver( val scopePxX = (-pc.b * scopePxY + (-pc.c)) / pc.a val parity = if (sign < 0) Parity.NORMAL else Parity.FLIPPED - val header = Header() - header.add(Standard.CDELT1, cdelt1) - header.add(Standard.CDELT2, cdelt2) - header.add(Standard.CROTA1, crota1.toDegrees) - header.add(Standard.CROTA2, crota2.toDegrees) - header.add(Standard.CRVAL1, scopeCoordsRA.toDegrees) - header.add(Standard.CRVAL2, scopeCoordsDEC.toDegrees) - header.add(Standard.CRPIX1, scopePxX) - header.add(Standard.CRPIX2, scopePxY) - header.add(NOAOExt.CD1_1, cd11) - header.add(NOAOExt.CD1_2, cd12) - header.add(NOAOExt.CD1_1, cd11) - header.add(NOAOExt.CD2_2, cd22) + val header = FitsHeader() + header.add(FitsKeyword.CDELT1, cdelt1) + header.add(FitsKeyword.CDELT2, cdelt2) + header.add(FitsKeyword.CROTA1, crota1.toDegrees) + header.add(FitsKeyword.CROTA2, crota2.toDegrees) + header.add(FitsKeyword.CRVAL1, scopeCoordsRA.toDegrees) + header.add(FitsKeyword.CRVAL2, scopeCoordsDEC.toDegrees) + header.add(FitsKeyword.CRPIX1, scopePxX) + header.add(FitsKeyword.CRPIX2, scopePxY) + header.add(FitsKeyword.CD1_1, cd11) + header.add(FitsKeyword.CD1_2, cd12) + header.add(FitsKeyword.CD1_1, cd11) + header.add(FitsKeyword.CD2_2, cd22) return ComputedPlateSolution( header, crota1, pixScale, scopeCoordsRA, scopeCoordsDEC, diff --git a/nebulosa-watney/src/main/kotlin/nebulosa/watney/plate/solving/quad/QuadDatabaseCellFile.kt b/nebulosa-watney/src/main/kotlin/nebulosa/watney/plate/solving/quad/QuadDatabaseCellFile.kt index 886cd02c5..07d741fbd 100644 --- a/nebulosa-watney/src/main/kotlin/nebulosa/watney/plate/solving/quad/QuadDatabaseCellFile.kt +++ b/nebulosa-watney/src/main/kotlin/nebulosa/watney/plate/solving/quad/QuadDatabaseCellFile.kt @@ -88,7 +88,7 @@ internal data class QuadDatabaseCellFile(@JvmField val descriptor: QuadDatabaseC } } - buffer.clear() + buffer.close() source.close() return matchingQuadsWithinRange diff --git a/nebulosa-watney/src/main/kotlin/nebulosa/watney/star/detection/DefaultStarDetectionFilter.kt b/nebulosa-watney/src/main/kotlin/nebulosa/watney/star/detection/DefaultStarDetectionFilter.kt index 69ee3764c..cd3a4468e 100644 --- a/nebulosa-watney/src/main/kotlin/nebulosa/watney/star/detection/DefaultStarDetectionFilter.kt +++ b/nebulosa-watney/src/main/kotlin/nebulosa/watney/star/detection/DefaultStarDetectionFilter.kt @@ -2,7 +2,7 @@ package nebulosa.watney.star.detection import nebulosa.constants.PI import nebulosa.constants.TAU -import nebulosa.imaging.Image +import nebulosa.image.Image import kotlin.math.max object DefaultStarDetectionFilter : StarDetectionFilter { diff --git a/nebulosa-watney/src/main/kotlin/nebulosa/watney/star/detection/StarDetectionFilter.kt b/nebulosa-watney/src/main/kotlin/nebulosa/watney/star/detection/StarDetectionFilter.kt index a9991fe50..b972d6967 100644 --- a/nebulosa-watney/src/main/kotlin/nebulosa/watney/star/detection/StarDetectionFilter.kt +++ b/nebulosa-watney/src/main/kotlin/nebulosa/watney/star/detection/StarDetectionFilter.kt @@ -1,6 +1,6 @@ package nebulosa.watney.star.detection -import nebulosa.imaging.Image +import nebulosa.image.Image /** * Interface for filtering stars after initial star detection. diff --git a/nebulosa-watney/src/main/kotlin/nebulosa/watney/star/detection/WatneyStarDetector.kt b/nebulosa-watney/src/main/kotlin/nebulosa/watney/star/detection/WatneyStarDetector.kt index f556e5469..0786eb5ad 100644 --- a/nebulosa-watney/src/main/kotlin/nebulosa/watney/star/detection/WatneyStarDetector.kt +++ b/nebulosa-watney/src/main/kotlin/nebulosa/watney/star/detection/WatneyStarDetector.kt @@ -1,8 +1,8 @@ package nebulosa.watney.star.detection -import nebulosa.imaging.Image -import nebulosa.imaging.algorithms.computation.Statistics -import nebulosa.imaging.algorithms.computation.hfd.HFD +import nebulosa.image.Image +import nebulosa.image.algorithms.computation.Statistics +import nebulosa.image.algorithms.computation.hfd.HFD import nebulosa.star.detection.StarDetector import kotlin.math.roundToInt diff --git a/nebulosa-watney/src/test/kotlin/WatnetPlateSolverTest.kt b/nebulosa-watney/src/test/kotlin/WatnetPlateSolverTest.kt index 05c2a974d..552d408a6 100644 --- a/nebulosa-watney/src/test/kotlin/WatnetPlateSolverTest.kt +++ b/nebulosa-watney/src/test/kotlin/WatnetPlateSolverTest.kt @@ -3,9 +3,10 @@ import io.kotest.matchers.collections.shouldHaveSize import io.kotest.matchers.doubles.plusOrMinus import io.kotest.matchers.ints.shouldBeExactly import io.kotest.matchers.shouldBe -import nebulosa.imaging.Image +import nebulosa.fits.fits +import nebulosa.image.Image import nebulosa.math.deg -import nebulosa.test.Hips2FitsStringSpec +import nebulosa.test.AbstractFitsAndXisfTest import nebulosa.test.NonGitHubOnlyCondition import nebulosa.watney.plate.solving.WatneyPlateSolver import nebulosa.watney.plate.solving.quad.CompactQuadDatabase @@ -13,7 +14,7 @@ import nebulosa.watney.star.detection.Star import java.nio.file.Path @EnabledIf(NonGitHubOnlyCondition::class) -class WatnetPlateSolverTest : Hips2FitsStringSpec() { +class WatnetPlateSolverTest : AbstractFitsAndXisfTest() { init { val quadDir = Path.of("/home/tiagohm/Downloads/watneyqdb") @@ -21,7 +22,7 @@ class WatnetPlateSolverTest : Hips2FitsStringSpec() { val solver = WatneyPlateSolver(quadDatabase) "blind" { - val image = Image.open(M31) + val image = Image.open(closeAfterEach(M31_FITS.fits())) println(solver.solve(null, image, 0.0, 0.0, 0.deg)) } "form image star quads" { diff --git a/nebulosa-watney/src/test/kotlin/WatneyStarDetectorTest.kt b/nebulosa-watney/src/test/kotlin/WatneyStarDetectorTest.kt index 0d8734dea..1499471a9 100644 --- a/nebulosa-watney/src/test/kotlin/WatneyStarDetectorTest.kt +++ b/nebulosa-watney/src/test/kotlin/WatneyStarDetectorTest.kt @@ -1,28 +1,29 @@ import io.kotest.matchers.collections.shouldHaveSize import io.kotest.matchers.shouldBe -import nebulosa.imaging.Image -import nebulosa.imaging.algorithms.transformation.Draw -import nebulosa.imaging.algorithms.transformation.convolution.Mean +import nebulosa.fits.fits +import nebulosa.image.Image +import nebulosa.image.algorithms.transformation.Draw +import nebulosa.image.algorithms.transformation.convolution.Mean import nebulosa.star.detection.ImageStar -import nebulosa.test.FitsStringSpec +import nebulosa.test.AbstractFitsAndXisfTest import nebulosa.watney.star.detection.WatneyStarDetector import java.awt.Color import java.awt.Graphics2D import kotlin.math.roundToInt -class WatneyStarDetectorTest : FitsStringSpec() { +class WatneyStarDetectorTest : AbstractFitsAndXisfTest() { init { val detector = WatneyStarDetector(computeHFD = true) "detect stars" { - var image = Image.open(NGC3344_COLOR_32) + var image = Image.open(NGC3344_COLOR_32_FITS.fits()) var stars = detector.detect(image.transform(Mean)) stars shouldHaveSize 1 image.transform(ImageStarsDraw(stars)).save("color-detected-stars-1") .second shouldBe "bb237ce03f7cc9e44e69a5354b7a6fd1" - image = Image.open(M6707HH) + image = Image.open(M6707HH.fits()) stars = detector.detect(image.transform(Mean)) stars shouldHaveSize 870 image.transform(ImageStarsDraw(stars)).save("color-detected-stars-870") diff --git a/nebulosa-wcs/src/main/kotlin/nebulosa/wcs/WCS.kt b/nebulosa-wcs/src/main/kotlin/nebulosa/wcs/WCS.kt index fc69d0516..d2b977380 100644 --- a/nebulosa-wcs/src/main/kotlin/nebulosa/wcs/WCS.kt +++ b/nebulosa-wcs/src/main/kotlin/nebulosa/wcs/WCS.kt @@ -4,13 +4,13 @@ import com.sun.jna.Pointer import com.sun.jna.ptr.DoubleByReference import com.sun.jna.ptr.IntByReference import com.sun.jna.ptr.PointerByReference -import nebulosa.fits.Header +import nebulosa.image.format.ReadableHeader import nebulosa.math.Angle import nebulosa.math.deg import nebulosa.math.toDegrees import java.io.Closeable -class WCS(header: Header) : Closeable { +class WCS(header: ReadableHeader) : Closeable { private val wcs: Pointer @@ -23,7 +23,7 @@ class WCS(header: Header) : Closeable { val card = headerIter.next() if (isKeywordValid(card.key)) { - headerText.append(card.format()) + headerText.append(card.formatted()) keyCount++ } } diff --git a/nebulosa-wcs/src/main/kotlin/nebulosa/wcs/WCSUtil.kt b/nebulosa-wcs/src/main/kotlin/nebulosa/wcs/WCSUtil.kt index beb5905e8..f02dda5ec 100644 --- a/nebulosa-wcs/src/main/kotlin/nebulosa/wcs/WCSUtil.kt +++ b/nebulosa-wcs/src/main/kotlin/nebulosa/wcs/WCSUtil.kt @@ -1,7 +1,7 @@ package nebulosa.wcs -import nebulosa.fits.Header -import nebulosa.fits.Standard +import nebulosa.fits.FitsKeyword +import nebulosa.image.format.ReadableHeader import nebulosa.math.Angle import nebulosa.math.cos import nebulosa.math.deg @@ -9,23 +9,23 @@ import nebulosa.math.sin import kotlin.math.abs import kotlin.math.sign -val Header.hasCd +val ReadableHeader.hasCd get() = "CD1_1" in this || - "CDELT1" in this && "CROTA2" in this || - "CDELT1" in this && "PC1_1" in this + "CDELT1" in this && "CROTA2" in this || + "CDELT1" in this && "PC1_1" in this -fun Header.computeCdMatrix(): DoubleArray { +fun ReadableHeader.computeCdMatrix(): DoubleArray { return if (hasCd) { doubleArrayOf(cd(1, 1), cd(1, 2), cd(2, 1), cd(2, 2)) } else { - val a = getDouble(Standard.CDELT1, 0.0) - val b = getDouble(Standard.CDELT2, 0.0) - val c = getDouble(Standard.CROTA2, 0.0).deg + val a = getDouble(FitsKeyword.CDELT1, 0.0) + val b = getDouble(FitsKeyword.CDELT2, 0.0) + val c = getDouble(FitsKeyword.CROTA2, 0.0).deg computeCdFromCdelt(a, b, c) } } -fun Header.cd(i: Int, j: Int): Double { +fun ReadableHeader.cd(i: Int, j: Int): Double { return if ("CD1_1" in this) { getDouble("CD${i}_$j", 0.0) } else if ("CROTA2" in this) { diff --git a/nebulosa-wcs/src/test/kotlin/LibWCSTest.kt b/nebulosa-wcs/src/test/kotlin/LibWCSTest.kt index ef6b7db4e..28fdd9383 100644 --- a/nebulosa-wcs/src/test/kotlin/LibWCSTest.kt +++ b/nebulosa-wcs/src/test/kotlin/LibWCSTest.kt @@ -2,8 +2,8 @@ import io.kotest.core.annotation.EnabledIf import io.kotest.core.spec.style.StringSpec import io.kotest.matchers.doubles.plusOrMinus import io.kotest.matchers.shouldBe -import nebulosa.fits.Header import nebulosa.fits.fits +import nebulosa.image.format.ReadableHeader import nebulosa.math.formatHMS import nebulosa.math.formatSignedDMS import nebulosa.test.NonGitHubOnlyCondition @@ -52,7 +52,7 @@ class LibWCSTest : StringSpec() { } } - private fun readHeaderFromFits(name: String): Header { + private fun readHeaderFromFits(name: String): ReadableHeader { return "src/test/resources/$name.fits".fits().use { it.first!!.header } } diff --git a/nebulosa-xisf/build.gradle.kts b/nebulosa-xisf/build.gradle.kts new file mode 100644 index 000000000..300c43409 --- /dev/null +++ b/nebulosa-xisf/build.gradle.kts @@ -0,0 +1,20 @@ +plugins { + kotlin("jvm") + id("maven-publish") +} + +dependencies { + api(project(":nebulosa-image-format")) + api(project(":nebulosa-fits")) + api(project(":nebulosa-xml")) + implementation(project(":nebulosa-log")) + testImplementation(project(":nebulosa-test")) +} + +publishing { + publications { + create("pluginMaven") { + from(components["java"]) + } + } +} diff --git a/nebulosa-xisf/src/main/kotlin/nebulosa/xisf/AstronomicalImageProperties.kt b/nebulosa-xisf/src/main/kotlin/nebulosa/xisf/AstronomicalImageProperties.kt new file mode 100644 index 000000000..b63fac4c9 --- /dev/null +++ b/nebulosa-xisf/src/main/kotlin/nebulosa/xisf/AstronomicalImageProperties.kt @@ -0,0 +1,55 @@ +package nebulosa.xisf + +import nebulosa.fits.FitsHeaderKey +import nebulosa.fits.FitsKeyword + +object AstronomicalImageProperties : Map by mapOf( + "Observer:EmailAddress" to null, + "Observer:Name" to null, + "Observer:PostalAddress" to null, + "Observer:Website" to null, + "Organization:EmailAddress" to null, + "Organization:Name" to null, + "Organization:PostalAddress" to null, + "Organization:Website" to null, + "Observation:CelestialReferenceSystem" to FitsKeyword.RADESYS, + "Observation:BibliographicReferences" to null, + "Observation:Center:Dec" to FitsKeyword.DEC, + "Observation:Center:RA" to FitsKeyword.RA, + "Observation:Center:X" to null, + "Observation:Center:Y" to null, + "Observation:Description" to null, + "Observation:Equinox" to FitsKeyword.EQUINOX, + "Observation:GeodeticReferenceSystem" to null, + "Observation:Location:Elevation" to null, + "Observation:Location:Latitude" to FitsKeyword.SITELAT, + "Observation:Location:Longitude" to FitsKeyword.SITELONG, + "Observation:Location:Name" to null, + "Observation:RelatedResources" to null, + "Observation:Time:End" to FitsKeyword.DATE_END, + "Observation:Time:Start" to null, + "Observation:Title" to null, + "Instrument:Camera:Gain" to FitsKeyword.GAIN, + "Instrument:Camera:ISOSpeed" to FitsKeyword.ISOSPEED, + "Instrument:Camera:Name" to FitsKeyword.CAMERA, + "Instrument:Camera:ReadoutNoise" to FitsKeyword.RDNOISE, + "Instrument:Camera:Rotation" to FitsKeyword.ROTATANG, + "Instrument:Camera:XBinning" to FitsKeyword.XBINNING, + "Instrument:Camera:YBinning" to FitsKeyword.YBINNING, + "Instrument:ExposureTime" to FitsKeyword.EXPOSURE, + "Instrument:Filter:Name" to FitsKeyword.FILTER, + "Instrument:Focuser:Position" to FitsKeyword.FILPOS, + "Instrument:Sensor:TargetTemperature" to null, + "Instrument:Sensor:Temperature" to null, + "Instrument:Sensor:XPixelSize" to FitsKeyword.XPIXSZ, + "Instrument:Sensor:YPixelSize" to FitsKeyword.YPIXSZ, + "Instrument:Telescope:Aperture" to FitsKeyword.APERDIA, + "Instrument:Telescope:CollectingArea" to null, + "Instrument:Telescope:FocalLength" to FitsKeyword.FOCALLEN, + "Instrument:Telescope:Name" to FitsKeyword.INSTRUME, + "Image:FrameNumber" to null, + "Image:GroupId" to null, + "Image:SubgroupId" to null, + "Processing:Description" to null, + // "Processing:History" to null, // Too long. +) diff --git a/nebulosa-xisf/src/main/kotlin/nebulosa/xisf/CompressionByteShuffler.kt b/nebulosa-xisf/src/main/kotlin/nebulosa/xisf/CompressionByteShuffler.kt new file mode 100644 index 000000000..d0bc53e7b --- /dev/null +++ b/nebulosa-xisf/src/main/kotlin/nebulosa/xisf/CompressionByteShuffler.kt @@ -0,0 +1,56 @@ +package nebulosa.xisf + +/** + * For data blocks structured as contiguous sequences of 16-bit or larger integer + * or floating point numbers, a reversible byte shuffling routine can greatly improve + * compression ratios by increasing data locality, i.e. by redistributing the + * sequence such that similar byte values tend to be placed close together. + */ +object CompressionByteShuffler { + + fun shuffle(input: ByteArray, output: ByteArray, itemSize: Int) { + val size = input.size + val numberOfItems = size / itemSize + val copyLength = size % itemSize + + var s = 0 + + for (j in 0 until itemSize) { + var u = j + + repeat(numberOfItems) { + output[s++] = input[u] + u += itemSize + } + + if (copyLength > 0) { + val destinationOffset = s + val startIndex = numberOfItems * itemSize + input.copyInto(output, destinationOffset, startIndex, startIndex + copyLength) + } + } + } + + fun unshuffle(input: ByteArray, output: ByteArray, itemSize: Int) { + val size = input.size + val numberOfItems = size / itemSize + val copyLength = size % itemSize + + var s = 0 + + for (j in 0 until itemSize) { + var u = j + + repeat(numberOfItems) { + output[u] = input[s++] + u += itemSize + } + + if (copyLength > 0) { + val destinationOffset = numberOfItems * itemSize + val startIndex = s + input.copyInto(output, destinationOffset, startIndex, startIndex + copyLength) + } + } + } +} diff --git a/nebulosa-xisf/src/main/kotlin/nebulosa/xisf/Xisf.kt b/nebulosa-xisf/src/main/kotlin/nebulosa/xisf/Xisf.kt new file mode 100644 index 000000000..30f2159d8 --- /dev/null +++ b/nebulosa-xisf/src/main/kotlin/nebulosa/xisf/Xisf.kt @@ -0,0 +1,25 @@ +package nebulosa.xisf + +import nebulosa.image.format.Hdu +import nebulosa.image.format.ImageRepresentation +import nebulosa.io.SeekableSource +import okio.Sink +import java.util.* + +/** + * Represents a XISF image. + */ +open class Xisf : LinkedList>, ImageRepresentation { + + constructor() : super() + + constructor(hdus: Collection>) : super(hdus) + + final override fun read(source: SeekableSource) { + addAll(XisfFormat.read(source)) + } + + final override fun write(sink: Sink) { + XisfFormat.write(sink, this) + } +} diff --git a/nebulosa-xisf/src/main/kotlin/nebulosa/xisf/XisfFormat.kt b/nebulosa-xisf/src/main/kotlin/nebulosa/xisf/XisfFormat.kt new file mode 100644 index 000000000..6ce39ef86 --- /dev/null +++ b/nebulosa-xisf/src/main/kotlin/nebulosa/xisf/XisfFormat.kt @@ -0,0 +1,217 @@ +package nebulosa.xisf + +import nebulosa.fits.ValueType +import nebulosa.fits.bitpix +import nebulosa.fits.frame +import nebulosa.image.format.Hdu +import nebulosa.image.format.ImageFormat +import nebulosa.image.format.ImageHdu +import nebulosa.io.* +import nebulosa.xisf.XisfMonolithicFileHeader.* +import nebulosa.xml.escapeXml +import okio.Buffer +import okio.Sink +import okio.Timeout +import java.io.ByteArrayInputStream +import kotlin.math.min + +/** + * Extensible Image Serialization Format (XISF) is the native file format of PixInsight. + * It is a free, open format for storage, management and interchange of digital images + * and associated data. + * + * @see XISF Version 1.0 Specification + */ +data object XisfFormat : ImageFormat { + + override fun read(source: SeekableSource): List { + return Buffer().use { buffer -> + source.read(buffer, 8) // XISF0100 + check(buffer.readString(Charsets.US_ASCII) == "XISF0100") { "invalid magic bytes" } + + // Header length (4) + reserved (4) + source.read(buffer, 8) + val headerLength = buffer.readIntLe() + // buffer.skip(4) // reserved + buffer.clear() + + // XISF Header. + val headerData = ByteArray(headerLength) + headerData.sink().use { buffer.transferFully(source, it, headerLength.toLong()) } + val stream = XisfHeaderInputStream(ByteArrayInputStream(headerData)) + val hdus = ArrayList(2) + + while (true) { + val header = stream.read() ?: break + + when (header) { + is Image -> hdus.add(XisfMonolithicFileHeaderImageHdu(header, source)) + } + } + + hdus + } + } + + override fun write(sink: Sink, hdus: Iterable>) { + Buffer().use { buffer -> + val headerSize = writeHeader(buffer, hdus) + val byteCount = buffer.readAll(sink) + + val remainingBytes = headerSize - byteCount + check(remainingBytes >= 0L) { "unexpected remaining bytes: $remainingBytes" } + buffer.write(ZeroSource, remainingBytes) + buffer.readAll(sink) + + for (hdu in hdus) { + if (hdu is ImageHdu) { + val bitpix = hdu.header.bitpix + val sampleFormat = SampleFormat.from(bitpix) + + if (hdu.isMono) { + hdu.data.red.writeTo(buffer, sink, sampleFormat) + } else { + hdu.data.red.writeTo(buffer, sink, sampleFormat) + hdu.data.green.writeTo(buffer, sink, sampleFormat) + hdu.data.blue.writeTo(buffer, sink, sampleFormat) + } + } + } + } + } + + private fun writeHeader(buffer: Buffer, hdus: Iterable>, initialHeaderSize: Int = 4096): Int { + buffer.clear() + + buffer.writeString(MAGIC_HEADER, Charsets.US_ASCII) + buffer.writeLongLe(0L) + buffer.writeUtf8(XML_VERSION) + buffer.writeUtf8(XML_COMMENT) + buffer.writeUtf8(XISF_START_TAG) + + for (hdu in hdus) { + if (hdu is ImageHdu) { + val header = hdu.header + val colorSpace = if (hdu.isMono) ColorSpace.GRAY else ColorSpace.RGB + val imageType = ImageType.parse(header.frame ?: "Light") ?: ImageType.LIGHT + val bitpix = hdu.header.bitpix + val sampleFormat = SampleFormat.from(bitpix) + val imageSize = hdu.width * hdu.height * hdu.numberOfChannels * sampleFormat.byteLength + val extra = if (bitpix.code < 0) " bounds=\"0:1\"" else "" + + IMAGE_START_TAG + .format( + hdu.width, hdu.height, hdu.numberOfChannels, + sampleFormat.code, colorSpace.code, imageType.code, + initialHeaderSize, imageSize, extra + ).also(buffer::writeUtf8) + + for ((name, key) in AstronomicalImageProperties) { + if (key != null) { + if (key.valueType == ValueType.STRING || key.valueType == ValueType.ANY) { + val value = header.getStringOrNull(key) ?: continue + buffer.writeUtf8(STRING_PROPERTY_TAG.format(name, value.escapeXml())) + } else if (key.valueType == ValueType.LOGICAL) { + val value = header.getBooleanOrNull(key) ?: continue + buffer.writeUtf8(NON_STRING_PROPERTY_TAG.format(name, XisfPropertyType.BOOLEAN.typeName, if (value) 1 else 0)) + } else if (key.valueType == ValueType.INTEGER) { + val value = header.getLongOrNull(key) ?: continue + buffer.writeUtf8(NON_STRING_PROPERTY_TAG.format(name, XisfPropertyType.INT64.typeName, value)) + } else if (key.valueType == ValueType.REAL) { + val value = header.getDoubleOrNull(key) ?: continue + buffer.writeUtf8(NON_STRING_PROPERTY_TAG.format(name, XisfPropertyType.FLOAT64.typeName, value)) + } + } + } + + for (keyword in header) { + val value = if (keyword.isStringType) "'${keyword.value.escapeXml()}'" else keyword.value + buffer.writeUtf8(FITS_KEYWORD_TAG.format(keyword.key, value, keyword.comment.escapeXml())) + } + } + } + + buffer.writeUtf8(IMAGE_END_TAG) + buffer.writeUtf8(XISF_END_TAG) + + val size = buffer.size + val remainingBytes = initialHeaderSize - size + + if (remainingBytes < 0) { + return writeHeader(buffer, hdus, initialHeaderSize * 2) + } + + val headerSize = size - 16 + + buffer.readAndWriteUnsafe().use { + it.seek(8L) + it.data!![it.start + 0] = (headerSize and 0xFF).toByte() + it.data!![it.start + 1] = (headerSize shr 8 and 0xFF).toByte() + it.data!![it.start + 2] = (headerSize shr 16 and 0xFF).toByte() + it.data!![it.start + 3] = (headerSize shr 24 and 0xFF).toByte() + } + + return initialHeaderSize + } + + @JvmStatic + internal fun Buffer.readPixel(format: SampleFormat, byteOrder: ByteOrder): Float { + return when (format) { + SampleFormat.UINT8 -> (readByte().toInt() and 0xFF) / 255f + SampleFormat.UINT16 -> (readShort(byteOrder).toInt() and 0xFFFF) / 65535f + SampleFormat.UINT32 -> ((readInt(byteOrder).toLong() and 0xFFFFFFFF) / 4294967295.0).toFloat() + SampleFormat.UINT64 -> TODO("Unsupported UInt64 sample format") + SampleFormat.FLOAT32 -> readFloat(byteOrder) + SampleFormat.FLOAT64 -> readDouble(byteOrder).toFloat() + } + } + + @JvmStatic + internal fun FloatArray.writeTo(buffer: Buffer, sink: Sink, format: SampleFormat) { + var idx = 0 + + while (idx < size) { + repeat(min(256, size - idx)) { buffer.writePixel(this[idx++], format) } + buffer.readAll(sink) + } + + buffer.readAll(sink) + } + + @JvmStatic + internal fun Buffer.writePixel(pixel: Float, format: SampleFormat) { + when (format) { + SampleFormat.UINT8 -> writeByte((pixel * 255f).toInt()) + SampleFormat.UINT16 -> writeShortLe((pixel * 65535f).toInt()) + SampleFormat.UINT32 -> writeIntLe(((pixel * 4294967295.0).toLong() and 0xFFFFFFFF).toInt()) + SampleFormat.UINT64 -> TODO("Unsupported UInt64 sample format") + SampleFormat.FLOAT32 -> writeFloatLe(pixel) + SampleFormat.FLOAT64 -> writeDoubleLe(pixel.toDouble()) + } + } + + private const val MAGIC_HEADER = "XISF0100" + private const val XML_VERSION = """""" + private const val XML_COMMENT = + """""" + private const val XISF_START_TAG = + """""" + private const val XISF_END_TAG = "" + private const val IMAGE_START_TAG = + """""" + private const val IMAGE_END_TAG = "" + private const val STRING_PROPERTY_TAG = """%s""" + private const val NON_STRING_PROPERTY_TAG = """""" + private const val FITS_KEYWORD_TAG = """""" + + private data object ZeroSource : AbstractSeekableSource() { + + override val size = Long.MAX_VALUE + override val timeout = Timeout.NONE + + override fun transfer(output: ByteArray, start: Int, length: Int): Int { + repeat(length) { output[start + it] = 0 } + return length + } + } +} diff --git a/nebulosa-xisf/src/main/kotlin/nebulosa/xisf/XisfHeaderCard.kt b/nebulosa-xisf/src/main/kotlin/nebulosa/xisf/XisfHeaderCard.kt new file mode 100644 index 000000000..4de97f999 --- /dev/null +++ b/nebulosa-xisf/src/main/kotlin/nebulosa/xisf/XisfHeaderCard.kt @@ -0,0 +1,131 @@ +package nebulosa.xisf + +import nebulosa.fits.FitsHeaderCardFormatter +import nebulosa.image.format.HeaderCard +import nebulosa.image.format.HeaderKey +import java.io.Serializable +import java.math.BigDecimal +import java.math.BigInteger + +data class XisfHeaderCard( + override val key: String, override val value: String, + override val comment: String, override val type: XisfPropertyType, +) : HeaderCard, Serializable { + + override val isCommentStyle + get() = false + + override val isKeyValuePair + get() = !isCommentStyle && key.isNotEmpty() + + override val isBooleanType + get() = type == XisfPropertyType.BOOLEAN + + override val isStringType + get() = type == XisfPropertyType.STRING || + type == XisfPropertyType.TIMEPOINT + + override val isDecimalType + get() = type == XisfPropertyType.FLOAT32 || + type == XisfPropertyType.FLOAT64 || + type == XisfPropertyType.FLOAT128 + + override val isIntegerType + get() = type == XisfPropertyType.UINT8 || + type == XisfPropertyType.UINT16 || + type == XisfPropertyType.UINT32 || + type == XisfPropertyType.UINT64 || + type == XisfPropertyType.UINT128 || + type == XisfPropertyType.INT8 || + type == XisfPropertyType.INT16 || + type == XisfPropertyType.INT32 || + type == XisfPropertyType.INT64 || + type == XisfPropertyType.INT128 + + override fun formatted(): String { + return FitsHeaderCardFormatter.format(this) + } + + companion object { + + @JvmStatic + fun create(header: HeaderKey, value: Boolean): XisfHeaderCard { + return create(header.key, value, header.comment) + } + + @JvmStatic + fun create(header: HeaderKey, value: Int): XisfHeaderCard { + return create(header.key, "$value", header.comment) + } + + @JvmStatic + fun create(header: HeaderKey, value: Long): XisfHeaderCard { + return create(header.key, "$value", header.comment) + } + + @JvmStatic + fun create(header: HeaderKey, value: BigInteger): XisfHeaderCard { + return create(header.key, "$value", header.comment) + } + + @JvmStatic + fun create(header: HeaderKey, value: Float): XisfHeaderCard { + return create(header.key, "$value", header.comment) + } + + @JvmStatic + fun create(header: HeaderKey, value: Double): XisfHeaderCard { + return create(header.key, "$value", header.comment) + } + + @JvmStatic + fun create(key: HeaderKey, value: BigDecimal, comment: String = ""): XisfHeaderCard { + return create(key.key, "$value", comment) + } + + @JvmStatic + fun create(header: HeaderKey, value: String): XisfHeaderCard { + return create(header.key, value, header.comment) + } + + @JvmStatic + fun create(key: String, value: Boolean, comment: String = ""): XisfHeaderCard { + return XisfHeaderCard(key, if (value) "T" else "F", comment, XisfPropertyType.BOOLEAN) + } + + @JvmStatic + fun create(key: String, value: Int, comment: String = ""): XisfHeaderCard { + return XisfHeaderCard(key, "$value", comment, XisfPropertyType.INT32) + } + + @JvmStatic + fun create(key: String, value: Long, comment: String = ""): XisfHeaderCard { + return XisfHeaderCard(key, "$value", comment, XisfPropertyType.INT64) + } + + @JvmStatic + fun create(key: String, value: BigInteger, comment: String = ""): XisfHeaderCard { + return XisfHeaderCard(key, "$value", comment, XisfPropertyType.INT128) + } + + @JvmStatic + fun create(key: String, value: Float, comment: String = ""): XisfHeaderCard { + return XisfHeaderCard(key, "$value", comment, XisfPropertyType.FLOAT32) + } + + @JvmStatic + fun create(key: String, value: Double, comment: String = ""): XisfHeaderCard { + return XisfHeaderCard(key, "$value", comment, XisfPropertyType.FLOAT64) + } + + @JvmStatic + fun create(key: String, value: BigDecimal, comment: String = ""): XisfHeaderCard { + return XisfHeaderCard(key, "$value", comment, XisfPropertyType.FLOAT128) + } + + @JvmStatic + fun create(key: String, value: String, comment: String = ""): XisfHeaderCard { + return XisfHeaderCard(key, value, comment, XisfPropertyType.STRING) + } + } +} diff --git a/nebulosa-xisf/src/main/kotlin/nebulosa/xisf/XisfHeaderInputStream.kt b/nebulosa-xisf/src/main/kotlin/nebulosa/xisf/XisfHeaderInputStream.kt new file mode 100644 index 000000000..fceda6a25 --- /dev/null +++ b/nebulosa-xisf/src/main/kotlin/nebulosa/xisf/XisfHeaderInputStream.kt @@ -0,0 +1,150 @@ +package nebulosa.xisf + +import com.fasterxml.aalto.stax.InputFactoryImpl +import nebulosa.fits.FitsHeader +import nebulosa.fits.FitsHeaderCard +import nebulosa.fits.FitsKeyword +import nebulosa.image.format.HeaderCard +import nebulosa.io.ByteOrder +import nebulosa.xisf.XisfMonolithicFileHeader.* +import nebulosa.xml.attribute +import okio.ByteString.Companion.decodeBase64 +import java.io.Closeable +import java.io.InputStream +import javax.xml.stream.XMLStreamConstants + +class XisfHeaderInputStream(source: InputStream) : Closeable { + + private val reader = XML_INPUT_FACTORY.createXMLStreamReader(source) + + @Suppress("ArrayInDataClass") + private data class ParsedAttributes( + @JvmField val cards: Collection, + @JvmField val image: Image?, + @JvmField val embedded: ByteArray, + ) + + fun read(): XisfMonolithicFileHeader? { + while (reader.hasNext()) { + when (reader.next()) { + XMLStreamConstants.START_ELEMENT -> { + return parseStartElement() ?: continue + } + } + } + + return null + } + + private fun parseStartElement(): XisfMonolithicFileHeader? { + return when (reader.localName) { + "Image" -> parseImage() + else -> null + } + } + + private fun parseImage(): Image { + val (width, height, numberOfChannels) = reader.attribute("geometry")!!.split(":") + + val location = reader.attribute("location")!! + val sampleFormat = SampleFormat.valueOf(reader.attribute("sampleFormat")!!.uppercase()) + val colorSpace = reader.attribute("colorSpace")?.uppercase()?.let(ColorSpace::valueOf) + val pixelStorage = reader.attribute("pixelStorage")?.uppercase()?.let(PixelStorageModel::valueOf) + val byteOrder = reader.attribute("byteOrder")?.uppercase()?.let(ByteOrder::valueOf) + val imageType = reader.attribute("imageType")?.let { ImageType.parse(it) } + val compression = reader.attribute("compression")?.let { CompressionFormat.parse(it) } + val bounds = reader.attribute("bounds")?.split(":")?.let { it[0].toFloat()..it[1].toFloat() } + val (keywords, thumbnail, embedded) = parseAttributes() + val header = FitsHeader() + val isMono = numberOfChannels == "1" + var position = 0L + var size = 0L + + if (location.startsWith("attachment")) { + with(location.split(":")) { + position = this[1].toLong() + size = this[2].toLong() + } + } + + header.add(FitsHeaderCard.SIMPLE) + header.add(sampleFormat.bitpix) + header.add(FitsHeaderCard.create(FitsKeyword.NAXIS, if (isMono) 2 else 3)) + header.add(FitsHeaderCard.create(FitsKeyword.NAXIS1, width.toInt())) + header.add(FitsHeaderCard.create(FitsKeyword.NAXIS2, height.toInt())) + if (!isMono) header.add(FitsHeaderCard.create(FitsKeyword.NAXIS3, 3)) + header.add(FitsHeaderCard.EXTENDED) + header.addAll(keywords) + + return Image( + width.toInt(), height.toInt(), numberOfChannels.toInt(), + position, size, + sampleFormat, colorSpace ?: ColorSpace.GRAY, + pixelStorage ?: PixelStorageModel.PLANAR, + byteOrder ?: ByteOrder.LITTLE, + compression, imageType ?: ImageType.LIGHT, + bounds ?: XisfMonolithicFileHeader.DEFAULT_BOUNDS, + header, thumbnail, embedded, + ) + } + + private fun parseAttributes(): ParsedAttributes { + val name = reader.localName + + val cards = ArrayList() + var thumbnail: Image? = null + var embeddedData = ByteArray(0) + + fun addHeaderCard(card: HeaderCard) { + if (cards.find { it.key == card.key } == null) { + cards.add(card) + } + } + + while (reader.hasNext()) { + val type = reader.next() + + if (type == XMLStreamConstants.END_ELEMENT && reader.localName == name) { + break + } else if (type == XMLStreamConstants.START_ELEMENT) { + when (reader.localName) { + "FITSKeyword" -> addHeaderCard(parseFITSKeyword()) + "Thumbnail" -> thumbnail = parseImage() + "Property" -> addHeaderCard(parseProperty() ?: continue) + "Data" -> embeddedData = parseEmbeddedData() + } + } + } + + return ParsedAttributes(cards, thumbnail, embeddedData) + } + + private fun parseFITSKeyword(): HeaderCard { + val name = reader.attribute("name") ?: "" + val value = reader.attribute("value")?.trim() ?: "" + val comment = reader.attribute("comment") ?: "" + val type = XisfPropertyType.fromValue(value) + return XisfHeaderCard(name, value.trim('\'').trim(), comment, type) + } + + private fun parseProperty(): HeaderCard? { + val id = reader.attribute("id")!! + val key = AstronomicalImageProperties[id] ?: return null + val propertyType = XisfPropertyType.fromTypeName(reader.attribute("type")!!) ?: return null + val value = reader.attribute("value") ?: reader.elementText.trim() + return XisfHeaderCard(key.key, value, key.comment, propertyType) + } + + private fun parseEmbeddedData(): ByteArray { + return reader.elementText.trim().decodeBase64()!!.toByteArray() + } + + override fun close() { + reader.close() + } + + companion object { + + @JvmStatic private val XML_INPUT_FACTORY = InputFactoryImpl() + } +} diff --git a/nebulosa-xisf/src/main/kotlin/nebulosa/xisf/XisfHelper.kt b/nebulosa-xisf/src/main/kotlin/nebulosa/xisf/XisfHelper.kt new file mode 100644 index 000000000..d48ad55b1 --- /dev/null +++ b/nebulosa-xisf/src/main/kotlin/nebulosa/xisf/XisfHelper.kt @@ -0,0 +1,12 @@ +@file:Suppress("NOTHING_TO_INLINE") + +package nebulosa.xisf + +import java.io.File +import java.nio.file.Path + +inline fun String.xisf() = XisfPath(this).also(XisfPath::read) + +inline fun Path.xisf() = XisfPath(this).also(XisfPath::read) + +inline fun File.xisf() = XisfPath(this).also(XisfPath::read) diff --git a/nebulosa-xisf/src/main/kotlin/nebulosa/xisf/XisfMonolithicFileHeader.kt b/nebulosa-xisf/src/main/kotlin/nebulosa/xisf/XisfMonolithicFileHeader.kt new file mode 100644 index 000000000..26180c557 --- /dev/null +++ b/nebulosa-xisf/src/main/kotlin/nebulosa/xisf/XisfMonolithicFileHeader.kt @@ -0,0 +1,129 @@ +package nebulosa.xisf + +import nebulosa.fits.Bitpix +import nebulosa.fits.FitsHeader +import nebulosa.fits.FitsHeaderCard +import nebulosa.fits.FitsKeyword +import nebulosa.image.format.HeaderCard +import nebulosa.io.ByteOrder + +sealed interface XisfMonolithicFileHeader { + + enum class SampleFormat( + @JvmField val byteLength: Long, + @JvmField val code: String, @JvmField val bitpix: Bitpix, + ) { + UINT8(1L, "UInt8", Bitpix.BYTE), + UINT16(2L, "UInt16", Bitpix.SHORT), + UINT32(4L, "UInt32", Bitpix.INTEGER), + UINT64(8L, "UInt64", Bitpix.LONG), + FLOAT32(4L, "Float32", Bitpix.FLOAT), + FLOAT64(8L, "Float64", Bitpix.DOUBLE); + + companion object { + + @JvmStatic + fun from(bitpix: Bitpix) = when (bitpix) { + Bitpix.BYTE -> UINT8 + Bitpix.SHORT -> UINT16 + Bitpix.INTEGER -> UINT32 + Bitpix.LONG -> UINT64 + Bitpix.FLOAT -> FLOAT32 + Bitpix.DOUBLE -> FLOAT64 + } + } + } + + enum class ColorSpace(@JvmField val code: String) { + GRAY("Gray"), + RGB("RGB"), + CIELAB("CIELab"), + } + + enum class PixelStorageModel { + PLANAR, + NORMAL, + } + + enum class CompressionType { + ZLIB, + LZ4, + LZ4_HC, + ZSTD, + } + + enum class ImageType(@JvmField val code: String) : HeaderCard by FitsHeaderCard.create(FitsKeyword.IMAGETYP, code) { + BIAS("Bias"), + DARK("Dark"), + FLAT("Flat"), + LIGHT("Light"), + MASTER_BIAS("MasterBias"), + MASTER_DARK("MasterDark"), + MASTER_FLAT("MasterFlat"), + MASTER_LIGHT("MasterLight"), + DEFECT_MAP("DefectMap"), + REJECTION_MAP_HIGH("RejectionMapHigh"), + REJECTION_MAP_LOW("RejectionMapLow"), + BINARY_REJECTION_MAP_HIGH("BinaryRejectionMapHigh"), + BINARY_REJECTION_MAP_LOW("BinaryRejectionMapLow"), + SLOPE_MAP("SlopeMap"), + WEIGHT_MAP("WeightMap"); + + companion object { + + @JvmStatic private val MAPPED = entries.associateBy { it.value } + + @JvmStatic + fun parse(text: String) = MAPPED[text] + } + } + + data class CompressionFormat( + @JvmField val type: CompressionType, + @JvmField val shuffled: Boolean, + @JvmField val uncompressedSize: Long, + @JvmField val itemSize: Int = 0, + ) { + + companion object { + + @JvmStatic + fun parse(text: String): CompressionFormat { + val parts = text.split(":") + + val type = when (parts[0]) { + "zlib", "zlib+sh" -> CompressionType.ZLIB + "lz4", "lz4+sh" -> CompressionType.LZ4 + "lz4hc", "lz4hc+sh" -> CompressionType.LZ4_HC + "zstd", "zstd+sh" -> CompressionType.ZSTD + else -> throw IllegalArgumentException("Invalid compression type: ${parts[0]}") + } + + val uncompressedSize = parts[1].toLong() + val shuffled = parts[0].endsWith("+sh") + val itemSize = if (shuffled && parts.size >= 3) parts[2].toInt() else 0 + + return CompressionFormat(type, shuffled, uncompressedSize, itemSize) + } + } + } + + @Suppress("ArrayInDataClass") + data class Image( + @JvmField val width: Int, @JvmField val height: Int, @JvmField val numberOfChannels: Int, + @JvmField val position: Long, @JvmField val size: Long, + @JvmField val sampleFormat: SampleFormat, @JvmField val colorSpace: ColorSpace, + @JvmField val pixelStorage: PixelStorageModel, @JvmField val byteOrder: ByteOrder, + @JvmField val compressionFormat: CompressionFormat? = null, + @JvmField val imageType: ImageType = ImageType.LIGHT, + @JvmField val bounds: ClosedFloatingPointRange = DEFAULT_BOUNDS, + @JvmField val keywords: FitsHeader = FitsHeader.EMPTY, + @JvmField val thumbnail: Image? = null, + @JvmField val embedded: ByteArray = ByteArray(0), + ) : XisfMonolithicFileHeader + + companion object { + + @JvmStatic val DEFAULT_BOUNDS = 0f..1f + } +} diff --git a/nebulosa-xisf/src/main/kotlin/nebulosa/xisf/XisfMonolithicFileHeaderImageData.kt b/nebulosa-xisf/src/main/kotlin/nebulosa/xisf/XisfMonolithicFileHeaderImageData.kt new file mode 100644 index 000000000..0f17b1a67 --- /dev/null +++ b/nebulosa-xisf/src/main/kotlin/nebulosa/xisf/XisfMonolithicFileHeaderImageData.kt @@ -0,0 +1,166 @@ +package nebulosa.xisf + +import nebulosa.image.format.ImageChannel +import nebulosa.image.format.ImageData +import nebulosa.io.SeekableSource +import nebulosa.io.source +import nebulosa.xisf.XisfFormat.readPixel +import nebulosa.xisf.XisfMonolithicFileHeader.* +import okio.Buffer +import okio.InflaterSource +import java.util.zip.Inflater +import kotlin.math.min + +@Suppress("NOTHING_TO_INLINE") +internal data class XisfMonolithicFileHeaderImageData( + private val image: Image, + private val source: SeekableSource, +) : ImageData { + + override val width = image.width + override val height = image.height + override val numberOfChannels = image.numberOfChannels + + private val isEmbedded = image.embedded.isNotEmpty() + + private val realSource by lazy { if (isEmbedded) image.embedded.source() else source } + + init { + val uncompressedSize = image.compressionFormat?.uncompressedSize ?: image.size + val expectedSize = numberOfChannels * numberOfPixels * image.sampleFormat.byteLength + check(isEmbedded || uncompressedSize == expectedSize) { "invalid size. $uncompressedSize != $expectedSize" } + } + + override val red by lazy { readImage(ImageChannel.RED) } + + override val green by lazy { readImage(ImageChannel.GREEN) } + + override val blue by lazy { readImage(ImageChannel.BLUE) } + + private fun readImage(channel: ImageChannel): FloatArray { + return if (numberOfChannels == 1) { + if (channel.index == 0) readGray() else red + } else { + when (channel) { + ImageChannel.GREEN -> readGreen() + ImageChannel.BLUE -> readBlue() + else -> readRed() + } + } + } + + private inline fun readGray(): FloatArray { + return readChannel(ImageChannel.GRAY) + } + + private inline fun readRed(): FloatArray { + return readChannel(ImageChannel.RED) + } + + private inline fun readGreen(): FloatArray { + return readChannel(ImageChannel.GREEN) + } + + private inline fun readBlue(): FloatArray { + return readChannel(ImageChannel.BLUE) + } + + private fun readChannel(channel: ImageChannel): FloatArray { + val output = FloatArray(numberOfPixels) + readChannelTo(channel, output) + return output + } + + override fun readChannelTo(channel: ImageChannel, output: FloatArray) { + // TODO: Read channel from source only if not initialized (remove lazy from red, green and blue). + if (image.pixelStorage == PixelStorageModel.NORMAL) readNormal(channel, output) + else readPlanar(channel, output) + } + + /** + * In the planar storage model, each channel of an image shall be stored as + * a contiguous sequence of pixel samples (each channel is stored in a separate block). + */ + private fun readPlanar(channel: ImageChannel, data: FloatArray): FloatArray { + val startIndex = numberOfPixels * image.sampleFormat.byteLength * channel.index + + realSource.seek(image.position + startIndex) + + var remainingPixels = data.size + var pos = 0 + + var closeable: (() -> Unit)? = null + + val compressedSource = when (image.compressionFormat?.type) { + CompressionType.ZLIB -> InflaterSource(realSource, Inflater(false).also { closeable = it::end }) + CompressionType.LZ4 -> TODO("Not implemented yet") + CompressionType.LZ4_HC -> TODO("Not implemented yet") + CompressionType.ZSTD -> TODO("Not implemented yet") + null -> realSource + } + + try { + Buffer().use { buffer -> + while (remainingPixels > 0) { + var n = min(PIXEL_COUNT, remainingPixels) + val byteCount = n * image.sampleFormat.byteLength + + val size = compressedSource.read(buffer, byteCount) + + if (size == 0L) break + + // require(size % image.sampleFormat.byteLength == 0L) + n = (size / image.sampleFormat.byteLength).toInt() + + repeat(n) { + data[pos++] = buffer.readPixel(image.sampleFormat, image.byteOrder) + } + + remainingPixels -= n + } + } + } finally { + closeable?.invoke() + } + + return data + } + + /** + * In the normal storage model, all pixel samples of an image shall be stored as + * a contiguous sequence (all pixel samples are stored in a single block). + */ + private fun readNormal(channel: ImageChannel, data: FloatArray): FloatArray { + realSource.seek(image.position) + + val blockSizeInBytes = numberOfChannels * image.sampleFormat.byteLength + val bytesToSkipBefore = channel.index * image.sampleFormat.byteLength + val bytesToSkipAfter = blockSizeInBytes - bytesToSkipBefore - image.sampleFormat.byteLength + var remainingPixels = data.size + var pos = 0 + + Buffer().use { buffer -> + while (remainingPixels > 0) { + val n = min(PIXEL_COUNT, remainingPixels) + val byteCount = n * blockSizeInBytes + + check(realSource.read(buffer, byteCount) == byteCount) + + repeat(n) { + if (bytesToSkipBefore > 0) buffer.skip(bytesToSkipBefore) + data[pos++] = buffer.readPixel(image.sampleFormat, image.byteOrder) + if (bytesToSkipAfter > 0) buffer.skip(bytesToSkipAfter) + } + + remainingPixels -= n + } + } + + return data + } + + companion object { + + const val PIXEL_COUNT = 64 + } +} diff --git a/nebulosa-xisf/src/main/kotlin/nebulosa/xisf/XisfMonolithicFileHeaderImageHdu.kt b/nebulosa-xisf/src/main/kotlin/nebulosa/xisf/XisfMonolithicFileHeaderImageHdu.kt new file mode 100644 index 000000000..49ae60e59 --- /dev/null +++ b/nebulosa-xisf/src/main/kotlin/nebulosa/xisf/XisfMonolithicFileHeaderImageHdu.kt @@ -0,0 +1,16 @@ +package nebulosa.xisf + +import nebulosa.image.format.ImageHdu +import nebulosa.io.SeekableSource + +internal data class XisfMonolithicFileHeaderImageHdu( + private val image: XisfMonolithicFileHeader.Image, + private val source: SeekableSource, +) : ImageHdu { + + override val width = image.width + override val height = image.height + override val numberOfChannels = image.numberOfChannels + override val header = image.keywords + override val data = XisfMonolithicFileHeaderImageData(image, source) +} diff --git a/nebulosa-xisf/src/main/kotlin/nebulosa/xisf/XisfPath.kt b/nebulosa-xisf/src/main/kotlin/nebulosa/xisf/XisfPath.kt new file mode 100644 index 000000000..2581951c1 --- /dev/null +++ b/nebulosa-xisf/src/main/kotlin/nebulosa/xisf/XisfPath.kt @@ -0,0 +1,30 @@ +package nebulosa.xisf + +import nebulosa.io.seekableSink +import nebulosa.io.seekableSource +import java.io.Closeable +import java.io.File +import java.nio.file.Path + +data class XisfPath(val path: Path) : Xisf(), Closeable { + + private val source = path.seekableSource() + private val sink = path.seekableSink() + + constructor(file: File) : this(file.toPath()) + + constructor(path: String) : this(Path.of(path)) + + fun read() { + read(source) + } + + fun write() { + write(sink) + } + + override fun close() { + source.close() + sink.close() + } +} diff --git a/nebulosa-xisf/src/main/kotlin/nebulosa/xisf/XisfPropertyType.kt b/nebulosa-xisf/src/main/kotlin/nebulosa/xisf/XisfPropertyType.kt new file mode 100644 index 000000000..543e7c0c2 --- /dev/null +++ b/nebulosa-xisf/src/main/kotlin/nebulosa/xisf/XisfPropertyType.kt @@ -0,0 +1,114 @@ +package nebulosa.xisf + +import nebulosa.image.format.HeaderCardType +import java.math.BigDecimal +import java.math.BigInteger + +enum class XisfPropertyType(@JvmField val typeName: String) : HeaderCardType { + BOOLEAN("Boolean"), + INT8("Int8"), + UINT8("UInt8"), + INT16("Int16"), + UINT16("UInt16"), + INT32("Int32"), + UINT32("UInt32"), + INT64("Int64"), + UINT64("UInt64"), + INT128("Int128"), + UINT128("UInt128"), + FLOAT32("Float32"), + FLOAT64("Float64"), + FLOAT128("Float128"), + COMPLEX32("Complex32"), + COMPLEX64("Complex64"), + COMPLEX128("Complex128"), + STRING("String"), + TIMEPOINT("TimePoint"), + VECTOR_INT8("I8Vector"), + VECTOR_UINT8("UI8Vector"), + VECTOR_INT16("I16Vector"), + VECTOR_UINT16("UI16Vector"), + VECTOR_INT32("I32Vector"), + VECTOR_UINT32("UI32Vector"), + VECTOR_INT64("I64Vector"), + VECTOR_UINT64("UI64Vector"), + VECTOR_INT128("I128Vector"), + VECTOR_UINT128("UI128Vector"), + VECTOR_FLOAT32("F32Vector"), + VECTOR_FLOAT64("F64Vector"), + VECTOR_FLOAT128("F128Vector"), + VECTOR_COMPLEX32("C32Vector"), + VECTOR_COMPLEX64("C64Vector"), + VECTOR_COMPLEX128("C128Vector"), + MATRIX_INT8("I8Matrix"), + MATRIX_UINT8("UI8Matrix"), + MATRIX_INT16("I16Matrix"), + MATRIX_UINT16("UI16Matrix"), + MATRIX_INT32("I32Matrix"), + MATRIX_UINT32("UI32Matrix"), + MATRIX_INT64("I64Matrix"), + MATRIX_UINT64("UI64Matrix"), + MATRIX_INT128("I128Matrix"), + MATRIX_UINT128("UI128Matrix"), + MATRIX_FLOAT32("F32Matrix"), + MATRIX_FLOAT64("F64Matrix"), + MATRIX_FLOAT128("F128Matrix"), + MATRIX_COMPLEX32("C32Matrix"), + MATRIX_COMPLEX64("C64Matrix"), + MATRIX_COMPLEX128("C128Matrix"); + + companion object { + + @JvmStatic private val MAPPED = entries.associateBy { it.typeName } + + @JvmStatic + fun fromTypeName(typeName: String) = MAPPED[typeName] + + @JvmStatic + fun fromValue(value: String) = if (value.startsWith('\'') && value.endsWith('\'')) STRING + else if (value == "T" || value == "F") BOOLEAN + else if (value.isBlank()) STRING + else if ('.' in value || 'D' in value || 'E' in value) getDecimalType(value) + else getIntegerType(value) + + private fun getDecimalType(value: String): XisfPropertyType { + val transformedValue = if ('D' in value) { + // Convert the Double Scientific Notation specified by FITS to pure IEEE. + value.uppercase().replace('D', 'E') + } else { + value + } + + val big = BigDecimal(transformedValue) + + // Check for zero, and deal with it separately... + if (big.stripTrailingZeros().compareTo(BigDecimal.ZERO) == 0) { + val decimals = big.scale() + + return if (decimals <= 7) FLOAT32 + else if (decimals <= 16) FLOAT64 + else FLOAT128 + } + + // Now non-zero values... + val decimals = big.precision() - 1 + + val f = big.toFloat() + if (decimals <= 7 && f != 0.0f && f.isFinite()) { + return FLOAT32 + } + + val d = big.toDouble() + + return if (decimals <= 16 && d != 0.0 && d.isFinite()) FLOAT64 + else FLOAT128 + } + + private fun getIntegerType(value: String): XisfPropertyType { + val bits = BigInteger(value).bitLength() + return if (bits < 32) INT32 + else if (bits < 64) INT64 + else INT128 + } + } +} diff --git a/nebulosa-xisf/src/test/kotlin/CompressionByteShufflerTest.kt b/nebulosa-xisf/src/test/kotlin/CompressionByteShufflerTest.kt new file mode 100644 index 000000000..66556a1ad --- /dev/null +++ b/nebulosa-xisf/src/test/kotlin/CompressionByteShufflerTest.kt @@ -0,0 +1,30 @@ +import io.kotest.core.spec.style.StringSpec +import io.kotest.matchers.ints.shouldBeExactly +import nebulosa.xisf.CompressionByteShuffler +import kotlin.random.Random + +class CompressionByteShufflerTest : StringSpec() { + + init { + "shuffle & unshuffle" { + val original = ByteArray(256) { (it / 32).toByte() } + val buffer = ByteArray(256) + val unshuffled = ByteArray(256) + + CompressionByteShuffler.shuffle(original, buffer, 8) + CompressionByteShuffler.unshuffle(buffer, unshuffled, 8) + + repeat(original.size) { unshuffled[it].toInt() shouldBeExactly original[it].toInt() } + } + "random shuffle & unshuffle" { + val original = Random.nextBytes(256) + val buffer = ByteArray(256) + val unshuffled = ByteArray(256) + + CompressionByteShuffler.shuffle(original, buffer, 8) + CompressionByteShuffler.unshuffle(buffer, unshuffled, 8) + + repeat(original.size) { unshuffled[it].toInt() shouldBeExactly original[it].toInt() } + } + } +} diff --git a/nebulosa-xisf/src/test/kotlin/XisfFormatTest.kt b/nebulosa-xisf/src/test/kotlin/XisfFormatTest.kt new file mode 100644 index 000000000..289992b3c --- /dev/null +++ b/nebulosa-xisf/src/test/kotlin/XisfFormatTest.kt @@ -0,0 +1,405 @@ +import io.kotest.engine.spec.tempfile +import io.kotest.matchers.collections.shouldHaveSize +import io.kotest.matchers.floats.shouldBeExactly +import io.kotest.matchers.ints.shouldBeExactly +import io.kotest.matchers.shouldBe +import io.kotest.matchers.types.shouldBeSameInstanceAs +import io.kotest.matchers.types.shouldNotBeSameInstanceAs +import nebulosa.fits.FitsFormat +import nebulosa.fits.bitpix +import nebulosa.image.format.ImageHdu +import nebulosa.io.seekableSink +import nebulosa.io.seekableSource +import nebulosa.test.AbstractFitsAndXisfTest +import nebulosa.xisf.XisfFormat + +class XisfFormatTest : AbstractFitsAndXisfTest() { + + init { + "mono:planar:8" { + val source = closeAfterEach(M82_MONO_8_XISF.seekableSource()) + val hdus = XisfFormat.read(source) + + hdus shouldHaveSize 1 + + with(hdus[0]) { + width shouldBeExactly 512 + height shouldBeExactly 512 + numberOfChannels shouldBeExactly 1 + header shouldHaveSize 23 + data.red.size shouldBeExactly 512 * 512 + data.green shouldBeSameInstanceAs data.red + data.blue shouldBeSameInstanceAs data.green + + val image = makeImage() + image.save("xisf-mono-planar-8").second shouldBe "0dca7efedef5b3525f8037f401518b0b" + } + } + "mono:planar:16" { + val source = closeAfterEach(M82_MONO_16_XISF.seekableSource()) + val hdus = XisfFormat.read(source) + + hdus shouldHaveSize 1 + + with(hdus[0]) { + width shouldBeExactly 512 + height shouldBeExactly 512 + numberOfChannels shouldBeExactly 1 + header shouldHaveSize 23 + data.red.size shouldBeExactly 512 * 512 + data.green shouldBeSameInstanceAs data.red + data.blue shouldBeSameInstanceAs data.green + + val image = makeImage() + image.save("xisf-mono-planar-16").second shouldBe "0dca7efedef5b3525f8037f401518b0b" + } + } + "mono:planar:32" { + val source = closeAfterEach(M82_MONO_32_XISF.seekableSource()) + val hdus = XisfFormat.read(source) + + hdus shouldHaveSize 1 + + with(hdus[0]) { + width shouldBeExactly 512 + height shouldBeExactly 512 + numberOfChannels shouldBeExactly 1 + header shouldHaveSize 23 + data.red.size shouldBeExactly 512 * 512 + data.green shouldBeSameInstanceAs data.red + data.blue shouldBeSameInstanceAs data.green + + val image = makeImage() + image.save("xisf-mono-planar-32").second shouldBe "0dca7efedef5b3525f8037f401518b0b" + } + } + "mono:planar:F32" { + val source = closeAfterEach(M82_MONO_F32_XISF.seekableSource()) + val hdus = XisfFormat.read(source) + + hdus shouldHaveSize 1 + + with(hdus[0]) { + width shouldBeExactly 512 + height shouldBeExactly 512 + numberOfChannels shouldBeExactly 1 + header shouldHaveSize 23 + data.red.size shouldBeExactly 512 * 512 + data.green shouldBeSameInstanceAs data.red + data.blue shouldBeSameInstanceAs data.green + + val image = makeImage() + image.save("xisf-mono-planar-F32").second shouldBe "0dca7efedef5b3525f8037f401518b0b" + } + } + "mono:planar:F64" { + val source = closeAfterEach(M82_MONO_F64_XISF.seekableSource()) + val hdus = XisfFormat.read(source) + + hdus shouldHaveSize 1 + + with(hdus[0]) { + width shouldBeExactly 512 + height shouldBeExactly 512 + numberOfChannels shouldBeExactly 1 + header shouldHaveSize 23 + data.red.size shouldBeExactly 512 * 512 + data.green shouldBeSameInstanceAs data.red + data.blue shouldBeSameInstanceAs data.green + + val image = makeImage() + image.save("xisf-mono-planar-F64").second shouldBe "0dca7efedef5b3525f8037f401518b0b" + } + } + "color:planar:8" { + val source = closeAfterEach(M82_COLOR_8_XISF.seekableSource()) + val hdus = XisfFormat.read(source) + + hdus shouldHaveSize 1 + + with(hdus[0]) { + width shouldBeExactly 512 + height shouldBeExactly 512 + numberOfChannels shouldBeExactly 3 + header shouldHaveSize 24 + data.red.size shouldBeExactly 512 * 512 + data.green shouldNotBeSameInstanceAs data.red + data.blue shouldNotBeSameInstanceAs data.green + + val image = makeImage() + image.save("xisf-color-planar-8").second shouldBe "764e326cc5260d81f3761112ad6a1969" + } + } + "color:planar:16" { + val source = closeAfterEach(M82_COLOR_16_XISF.seekableSource()) + val hdus = XisfFormat.read(source) + + hdus shouldHaveSize 1 + + with(hdus[0]) { + width shouldBeExactly 512 + height shouldBeExactly 512 + numberOfChannels shouldBeExactly 3 + header shouldHaveSize 24 + data.red.size shouldBeExactly 512 * 512 + data.green shouldNotBeSameInstanceAs data.red + data.blue shouldNotBeSameInstanceAs data.green + + val image = makeImage() + image.save("xisf-color-planar-16").second shouldBe "764e326cc5260d81f3761112ad6a1969" + } + } + "color:planar:32" { + val source = closeAfterEach(M82_COLOR_32_XISF.seekableSource()) + val hdus = XisfFormat.read(source) + + hdus shouldHaveSize 1 + + with(hdus[0]) { + width shouldBeExactly 512 + height shouldBeExactly 512 + numberOfChannels shouldBeExactly 3 + header shouldHaveSize 24 + data.red.size shouldBeExactly 512 * 512 + data.green shouldNotBeSameInstanceAs data.red + data.blue shouldNotBeSameInstanceAs data.green + + val image = makeImage() + image.save("xisf-color-planar-32").second shouldBe "764e326cc5260d81f3761112ad6a1969" + } + } + "color:planar:F32" { + val source = closeAfterEach(M82_COLOR_F32_XISF.seekableSource()) + val hdus = XisfFormat.read(source) + + hdus shouldHaveSize 1 + + with(hdus[0]) { + width shouldBeExactly 512 + height shouldBeExactly 512 + numberOfChannels shouldBeExactly 3 + header shouldHaveSize 24 + data.red.size shouldBeExactly 512 * 512 + data.green shouldNotBeSameInstanceAs data.red + data.blue shouldNotBeSameInstanceAs data.green + + val image = makeImage() + image.save("xisf-color-planar-F32").second shouldBe "764e326cc5260d81f3761112ad6a1969" + } + } + "color:planar:F64" { + val source = closeAfterEach(M82_COLOR_F64_XISF.seekableSource()) + val hdus = XisfFormat.read(source) + + hdus shouldHaveSize 1 + + with(hdus[0]) { + width shouldBeExactly 512 + height shouldBeExactly 512 + numberOfChannels shouldBeExactly 3 + header shouldHaveSize 24 + data.red.size shouldBeExactly 512 * 512 + data.green shouldNotBeSameInstanceAs data.red + data.blue shouldNotBeSameInstanceAs data.green + + val image = makeImage() + image.save("xisf-color-planar-F64").second shouldBe "764e326cc5260d81f3761112ad6a1969" + } + } + "mono:planar:8:zlib" { + val source = closeAfterEach(M82_MONO_8_ZLIB_XISF.seekableSource()) + val hdus = XisfFormat.read(source) + + hdus shouldHaveSize 1 + + with(hdus[0]) { + width shouldBeExactly 512 + height shouldBeExactly 512 + numberOfChannels shouldBeExactly 1 + header shouldHaveSize 23 + data.red.size shouldBeExactly 512 * 512 + data.green shouldBeSameInstanceAs data.red + data.blue shouldBeSameInstanceAs data.green + + val image = makeImage() + image.save("xisf-mono-planar-8-zlib").second shouldBe "0dca7efedef5b3525f8037f401518b0b" + } + } + "mono:write" { + val formats = arrayOf(PALETTE_MONO_8_XISF, PALETTE_MONO_16_XISF, PALETTE_MONO_32_XISF, PALETTE_MONO_F32_XISF, PALETTE_MONO_F64_XISF) + + for (format in formats) { + val source0 = closeAfterEach(format.seekableSource()) + val hdus0 = XisfFormat.read(source0) + + val outputPath = tempfile() + val sink = closeAfterEach(outputPath.seekableSink()) + XisfFormat.write(sink, hdus0) + + val source1 = closeAfterEach(outputPath.seekableSource()) + val hdus1 = XisfFormat.read(source1) + + hdus1 shouldHaveSize 1 + hdus1[0].data.numberOfChannels shouldBeExactly 1 + hdus1[0].header.size shouldBeExactly hdus0[0].header.size + hdus1[0].data.red.size shouldBeExactly hdus0[0].data.red.size + hdus1[0].data.red shouldNotBeSameInstanceAs hdus0[0].data.red + hdus1[0].data.red.forEachIndexed { i, value -> value shouldBeExactly hdus0[0].data.red[i] } + + val bitpix = hdus1[0].header.bitpix + val image = hdus1[0].makeImage() + image.save("xisf-mono-write-$bitpix").second shouldBe "07762064ff54ccc7771ba5b34fca86cf" + } + } + "color:write" { + val formats = arrayOf(PALETTE_COLOR_8_XISF, PALETTE_COLOR_16_XISF, PALETTE_COLOR_32_XISF, PALETTE_COLOR_F32_XISF, PALETTE_COLOR_F64_XISF) + + for (format in formats) { + val source0 = closeAfterEach(format.seekableSource()) + val hdus0 = XisfFormat.read(source0) + + val outputPath = tempfile() + val sink = closeAfterEach(outputPath.seekableSink()) + XisfFormat.write(sink, hdus0) + + val source1 = closeAfterEach(outputPath.seekableSource()) + val hdus1 = XisfFormat.read(source1) + + hdus1 shouldHaveSize 1 + hdus1[0].data.numberOfChannels shouldBeExactly 3 + hdus1[0].header.size shouldBeExactly hdus0[0].header.size + hdus1[0].data.red.size shouldBeExactly hdus0[0].data.red.size + hdus1[0].data.red shouldNotBeSameInstanceAs hdus0[0].data.red + hdus1[0].data.red.forEachIndexed { i, value -> value shouldBeExactly hdus0[0].data.red[i] } + hdus1[0].data.green shouldNotBeSameInstanceAs hdus0[0].data.green + hdus1[0].data.green.forEachIndexed { i, value -> value shouldBeExactly hdus0[0].data.green[i] } + hdus1[0].data.blue shouldNotBeSameInstanceAs hdus0[0].data.blue + hdus1[0].data.blue.forEachIndexed { i, value -> value shouldBeExactly hdus0[0].data.blue[i] } + + val bitpix = hdus1[0].header.bitpix + val image = hdus1[0].makeImage() + image.save("xisf-color-write-$bitpix").second shouldBe "7233886f62065800b43419f3b1b6c833" + } + } + "fits-to-xisf:mono" { + val formats = arrayOf(PALETTE_MONO_8_FITS, PALETTE_MONO_16_FITS, PALETTE_MONO_32_FITS, PALETTE_MONO_F32_FITS, PALETTE_MONO_F64_FITS) + + for (format in formats) { + val source0 = closeAfterEach(format.seekableSource()) + val hdus0 = FitsFormat.read(source0).filterIsInstance() + + hdus0 shouldHaveSize 1 + + val outputPath = tempfile() + val sink = closeAfterEach(outputPath.seekableSink()) + XisfFormat.write(sink, hdus0) + + val source1 = closeAfterEach(outputPath.seekableSource()) + val hdus1 = XisfFormat.read(source1) + + hdus1 shouldHaveSize 1 + hdus1[0].data.numberOfChannels shouldBeExactly 1 + // hdus1[0].header.size shouldBeExactly hdus0[0].header.size + hdus1[0].data.red.size shouldBeExactly hdus0[0].data.red.size + hdus1[0].data.red shouldNotBeSameInstanceAs hdus0[0].data.red + hdus1[0].data.red.forEachIndexed { i, value -> value shouldBeExactly hdus0[0].data.red[i] } + + val bitpix = hdus1[0].header.bitpix + val image = hdus1[0].makeImage() + image.save("fits-to-xisf-mono-$bitpix").second shouldBe "07762064ff54ccc7771ba5b34fca86cf" + } + } + "fits-to-xisf:color" { + val formats = arrayOf(PALETTE_COLOR_8_FITS, PALETTE_COLOR_16_FITS, PALETTE_COLOR_32_FITS, PALETTE_COLOR_F32_FITS, PALETTE_COLOR_F64_FITS) + + for (format in formats) { + val source0 = closeAfterEach(format.seekableSource()) + val hdus0 = FitsFormat.read(source0).filterIsInstance() + + hdus0 shouldHaveSize 1 + + val outputPath = tempfile() + val sink = closeAfterEach(outputPath.seekableSink()) + XisfFormat.write(sink, hdus0) + + val source1 = closeAfterEach(outputPath.seekableSource()) + val hdus1 = XisfFormat.read(source1) + + hdus1 shouldHaveSize 1 + hdus1[0].data.numberOfChannels shouldBeExactly 3 + // hdus1[0].header.size shouldBeExactly hdus0[0].header.size + hdus1[0].data.red.size shouldBeExactly hdus0[0].data.red.size + hdus1[0].data.red shouldNotBeSameInstanceAs hdus0[0].data.red + hdus1[0].data.red.forEachIndexed { i, value -> value shouldBeExactly hdus0[0].data.red[i] } + hdus1[0].data.green shouldNotBeSameInstanceAs hdus0[0].data.green + hdus1[0].data.green.forEachIndexed { i, value -> value shouldBeExactly hdus0[0].data.green[i] } + hdus1[0].data.blue shouldNotBeSameInstanceAs hdus0[0].data.blue + hdus1[0].data.blue.forEachIndexed { i, value -> value shouldBeExactly hdus0[0].data.blue[i] } + + val bitpix = hdus1[0].header.bitpix + val image = hdus1[0].makeImage() + image.save("fits-to-xisf-color-$bitpix").second shouldBe "7233886f62065800b43419f3b1b6c833" + } + } + "xisf-to-fits:mono" { + val formats = arrayOf(PALETTE_MONO_8_XISF, PALETTE_MONO_16_XISF, PALETTE_MONO_32_XISF, PALETTE_MONO_F32_XISF, PALETTE_MONO_F64_XISF) + + for (format in formats) { + val source0 = closeAfterEach(format.seekableSource()) + val hdus0 = XisfFormat.read(source0) + + hdus0 shouldHaveSize 1 + + val outputPath = tempfile() + val sink = closeAfterEach(outputPath.seekableSink()) + FitsFormat.write(sink, hdus0) + + val source1 = closeAfterEach(outputPath.seekableSource()) + val hdus1 = FitsFormat.read(source1).filterIsInstance() + + hdus1 shouldHaveSize 1 + hdus1[0].data.numberOfChannels shouldBeExactly 1 + // hdus1[0].header.size shouldBeExactly hdus0[0].header.size + hdus1[0].data.red.size shouldBeExactly hdus0[0].data.red.size + hdus1[0].data.red shouldNotBeSameInstanceAs hdus0[0].data.red + hdus1[0].data.red.forEachIndexed { i, value -> value shouldBeExactly hdus0[0].data.red[i] } + + val bitpix = hdus1[0].header.bitpix + val image = hdus1[0].makeImage() + image.save("xisf-to-fits-mono-$bitpix").second shouldBe "07762064ff54ccc7771ba5b34fca86cf" + } + } + "xisf-to-fits:color" { + val formats = arrayOf(PALETTE_COLOR_8_XISF, PALETTE_COLOR_16_XISF, PALETTE_COLOR_32_XISF, PALETTE_COLOR_F32_XISF, PALETTE_COLOR_F64_XISF) + + for (format in formats) { + val source0 = closeAfterEach(format.seekableSource()) + val hdus0 = XisfFormat.read(source0) + + hdus0 shouldHaveSize 1 + + val outputPath = tempfile() + val sink = closeAfterEach(outputPath.seekableSink()) + FitsFormat.write(sink, hdus0) + + val source1 = closeAfterEach(outputPath.seekableSource()) + val hdus1 = FitsFormat.read(source1).filterIsInstance() + + hdus1 shouldHaveSize 1 + hdus1[0].data.numberOfChannels shouldBeExactly 3 + // hdus1[0].header.size shouldBeExactly hdus0[0].header.size + hdus1[0].data.red.size shouldBeExactly hdus0[0].data.red.size + hdus1[0].data.red shouldNotBeSameInstanceAs hdus0[0].data.red + hdus1[0].data.red.forEachIndexed { i, value -> value shouldBeExactly hdus0[0].data.red[i] } + hdus1[0].data.green shouldNotBeSameInstanceAs hdus0[0].data.green + hdus1[0].data.green.forEachIndexed { i, value -> value shouldBeExactly hdus0[0].data.green[i] } + hdus1[0].data.blue shouldNotBeSameInstanceAs hdus0[0].data.blue + hdus1[0].data.blue.forEachIndexed { i, value -> value shouldBeExactly hdus0[0].data.blue[i] } + + val bitpix = hdus1[0].header.bitpix + val image = hdus1[0].makeImage() + image.save("xisf-to-fits-color-$bitpix").second shouldBe "7233886f62065800b43419f3b1b6c833" + } + } + } +} diff --git a/nebulosa-xisf/src/test/kotlin/XisfHeaderInputStreamTest.kt b/nebulosa-xisf/src/test/kotlin/XisfHeaderInputStreamTest.kt new file mode 100644 index 000000000..457aa4c2f --- /dev/null +++ b/nebulosa-xisf/src/test/kotlin/XisfHeaderInputStreamTest.kt @@ -0,0 +1,230 @@ +import io.kotest.matchers.collections.shouldHaveSize +import io.kotest.matchers.ints.shouldBeExactly +import io.kotest.matchers.nulls.shouldNotBeNull +import io.kotest.matchers.shouldBe +import io.kotest.matchers.types.shouldBeInstanceOf +import nebulosa.io.ByteOrder +import nebulosa.test.AbstractFitsAndXisfTest +import nebulosa.xisf.XisfHeaderInputStream +import nebulosa.xisf.XisfMonolithicFileHeader +import kotlin.io.path.inputStream + +class XisfHeaderInputStreamTest : AbstractFitsAndXisfTest() { + + init { + "read:8:gray" { + val stream = closeAfterEach(M82_MONO_8_XISF.inputStream().also { it.skip(16) }) + val headerStream = XisfHeaderInputStream(stream) + val image = headerStream.read().shouldNotBeNull().shouldBeInstanceOf() + + with(image) { + width shouldBeExactly 512 + height shouldBeExactly 512 + numberOfChannels shouldBeExactly 1 + sampleFormat shouldBe XisfMonolithicFileHeader.SampleFormat.UINT8 + colorSpace shouldBe XisfMonolithicFileHeader.ColorSpace.GRAY + byteOrder shouldBe ByteOrder.LITTLE + keywords shouldHaveSize 23 + } + } + "read:8:gray:zlib" { + val stream = closeAfterEach(M82_MONO_8_ZLIB_XISF.inputStream().also { it.skip(16) }) + val headerStream = XisfHeaderInputStream(stream) + val image = headerStream.read().shouldNotBeNull().shouldBeInstanceOf() + + with(image) { + width shouldBeExactly 512 + height shouldBeExactly 512 + numberOfChannels shouldBeExactly 1 + sampleFormat shouldBe XisfMonolithicFileHeader.SampleFormat.UINT8 + colorSpace shouldBe XisfMonolithicFileHeader.ColorSpace.GRAY + byteOrder shouldBe ByteOrder.LITTLE + compressionFormat.shouldNotBeNull().type shouldBe XisfMonolithicFileHeader.CompressionType.ZLIB + keywords shouldHaveSize 23 + } + } + "read:8:gray:lz4" { + val stream = closeAfterEach(M82_MONO_8_LZ4_XISF.inputStream().also { it.skip(16) }) + val headerStream = XisfHeaderInputStream(stream) + val image = headerStream.read().shouldNotBeNull().shouldBeInstanceOf() + + with(image) { + width shouldBeExactly 512 + height shouldBeExactly 512 + numberOfChannels shouldBeExactly 1 + sampleFormat shouldBe XisfMonolithicFileHeader.SampleFormat.UINT8 + colorSpace shouldBe XisfMonolithicFileHeader.ColorSpace.GRAY + byteOrder shouldBe ByteOrder.LITTLE + compressionFormat.shouldNotBeNull().type shouldBe XisfMonolithicFileHeader.CompressionType.LZ4 + keywords shouldHaveSize 23 + } + } + "read:8:gray:lz4-hc" { + val stream = closeAfterEach(M82_MONO_8_LZ4_HC_XISF.inputStream().also { it.skip(16) }) + val headerStream = XisfHeaderInputStream(stream) + val image = headerStream.read().shouldNotBeNull().shouldBeInstanceOf() + + with(image) { + width shouldBeExactly 512 + height shouldBeExactly 512 + numberOfChannels shouldBeExactly 1 + sampleFormat shouldBe XisfMonolithicFileHeader.SampleFormat.UINT8 + colorSpace shouldBe XisfMonolithicFileHeader.ColorSpace.GRAY + byteOrder shouldBe ByteOrder.LITTLE + compressionFormat.shouldNotBeNull().type shouldBe XisfMonolithicFileHeader.CompressionType.LZ4_HC + keywords shouldHaveSize 23 + } + } + "read:8:gray:zstd" { + val stream = closeAfterEach(M82_MONO_8_ZSTANDARD_XISF.inputStream().also { it.skip(16) }) + val headerStream = XisfHeaderInputStream(stream) + val image = headerStream.read().shouldNotBeNull().shouldBeInstanceOf() + + with(image) { + width shouldBeExactly 512 + height shouldBeExactly 512 + numberOfChannels shouldBeExactly 1 + sampleFormat shouldBe XisfMonolithicFileHeader.SampleFormat.UINT8 + colorSpace shouldBe XisfMonolithicFileHeader.ColorSpace.GRAY + byteOrder shouldBe ByteOrder.LITTLE + compressionFormat.shouldNotBeNull().type shouldBe XisfMonolithicFileHeader.CompressionType.ZSTD + keywords shouldHaveSize 23 + } + } + "read:16:gray" { + val stream = closeAfterEach(M82_MONO_16_XISF.inputStream().also { it.skip(16) }) + val headerStream = XisfHeaderInputStream(stream) + val image = headerStream.read().shouldNotBeNull().shouldBeInstanceOf() + + with(image) { + width shouldBeExactly 512 + height shouldBeExactly 512 + numberOfChannels shouldBeExactly 1 + sampleFormat shouldBe XisfMonolithicFileHeader.SampleFormat.UINT16 + colorSpace shouldBe XisfMonolithicFileHeader.ColorSpace.GRAY + byteOrder shouldBe ByteOrder.LITTLE + keywords shouldHaveSize 23 + } + } + "read:32:gray" { + val stream = closeAfterEach(M82_MONO_32_XISF.inputStream().also { it.skip(16) }) + val headerStream = XisfHeaderInputStream(stream) + val image = headerStream.read().shouldNotBeNull().shouldBeInstanceOf() + + with(image) { + width shouldBeExactly 512 + height shouldBeExactly 512 + numberOfChannels shouldBeExactly 1 + sampleFormat shouldBe XisfMonolithicFileHeader.SampleFormat.UINT32 + colorSpace shouldBe XisfMonolithicFileHeader.ColorSpace.GRAY + byteOrder shouldBe ByteOrder.LITTLE + keywords shouldHaveSize 23 + } + } + "read:F32:gray" { + val stream = closeAfterEach(M82_MONO_F32_XISF.inputStream().also { it.skip(16) }) + val headerStream = XisfHeaderInputStream(stream) + val image = headerStream.read().shouldNotBeNull().shouldBeInstanceOf() + + with(image) { + width shouldBeExactly 512 + height shouldBeExactly 512 + numberOfChannels shouldBeExactly 1 + sampleFormat shouldBe XisfMonolithicFileHeader.SampleFormat.FLOAT32 + colorSpace shouldBe XisfMonolithicFileHeader.ColorSpace.GRAY + byteOrder shouldBe ByteOrder.LITTLE + keywords shouldHaveSize 23 + } + } + "read:F64:gray" { + val stream = closeAfterEach(M82_MONO_F64_XISF.inputStream().also { it.skip(16) }) + val headerStream = XisfHeaderInputStream(stream) + val image = headerStream.read().shouldNotBeNull().shouldBeInstanceOf() + + with(image) { + width shouldBeExactly 512 + height shouldBeExactly 512 + numberOfChannels shouldBeExactly 1 + sampleFormat shouldBe XisfMonolithicFileHeader.SampleFormat.FLOAT64 + colorSpace shouldBe XisfMonolithicFileHeader.ColorSpace.GRAY + byteOrder shouldBe ByteOrder.LITTLE + keywords shouldHaveSize 23 + } + } + "read:8:rgb" { + val stream = closeAfterEach(M82_COLOR_8_XISF.inputStream().also { it.skip(16) }) + val headerStream = XisfHeaderInputStream(stream) + val image = headerStream.read().shouldNotBeNull().shouldBeInstanceOf() + + with(image) { + width shouldBeExactly 512 + height shouldBeExactly 512 + numberOfChannels shouldBeExactly 3 + sampleFormat shouldBe XisfMonolithicFileHeader.SampleFormat.UINT8 + colorSpace shouldBe XisfMonolithicFileHeader.ColorSpace.RGB + byteOrder shouldBe ByteOrder.LITTLE + keywords shouldHaveSize 24 + } + } + "read:16:rgb" { + val stream = closeAfterEach(M82_COLOR_16_XISF.inputStream().also { it.skip(16) }) + val headerStream = XisfHeaderInputStream(stream) + val image = headerStream.read().shouldNotBeNull().shouldBeInstanceOf() + + with(image) { + width shouldBeExactly 512 + height shouldBeExactly 512 + numberOfChannels shouldBeExactly 3 + sampleFormat shouldBe XisfMonolithicFileHeader.SampleFormat.UINT16 + colorSpace shouldBe XisfMonolithicFileHeader.ColorSpace.RGB + byteOrder shouldBe ByteOrder.LITTLE + keywords shouldHaveSize 24 + } + } + "read:32:rgb" { + val stream = closeAfterEach(M82_COLOR_32_XISF.inputStream().also { it.skip(16) }) + val headerStream = XisfHeaderInputStream(stream) + val image = headerStream.read().shouldNotBeNull().shouldBeInstanceOf() + + with(image) { + width shouldBeExactly 512 + height shouldBeExactly 512 + numberOfChannels shouldBeExactly 3 + sampleFormat shouldBe XisfMonolithicFileHeader.SampleFormat.UINT32 + colorSpace shouldBe XisfMonolithicFileHeader.ColorSpace.RGB + byteOrder shouldBe ByteOrder.LITTLE + keywords shouldHaveSize 24 + } + } + "read:F32:rgb" { + val stream = closeAfterEach(M82_COLOR_F32_XISF.inputStream().also { it.skip(16) }) + val headerStream = XisfHeaderInputStream(stream) + val image = headerStream.read().shouldNotBeNull().shouldBeInstanceOf() + + with(image) { + width shouldBeExactly 512 + height shouldBeExactly 512 + numberOfChannels shouldBeExactly 3 + sampleFormat shouldBe XisfMonolithicFileHeader.SampleFormat.FLOAT32 + colorSpace shouldBe XisfMonolithicFileHeader.ColorSpace.RGB + byteOrder shouldBe ByteOrder.LITTLE + keywords shouldHaveSize 24 + } + } + "read:F64:rgb" { + val stream = closeAfterEach(M82_COLOR_F64_XISF.inputStream().also { it.skip(16) }) + val headerStream = XisfHeaderInputStream(stream) + val image = headerStream.read().shouldNotBeNull().shouldBeInstanceOf() + + with(image) { + width shouldBeExactly 512 + height shouldBeExactly 512 + numberOfChannels shouldBeExactly 3 + sampleFormat shouldBe XisfMonolithicFileHeader.SampleFormat.FLOAT64 + colorSpace shouldBe XisfMonolithicFileHeader.ColorSpace.RGB + byteOrder shouldBe ByteOrder.LITTLE + keywords shouldHaveSize 24 + } + } + } +} diff --git a/nebulosa-xml/build.gradle.kts b/nebulosa-xml/build.gradle.kts new file mode 100644 index 000000000..8d82b0108 --- /dev/null +++ b/nebulosa-xml/build.gradle.kts @@ -0,0 +1,17 @@ +plugins { + kotlin("jvm") + id("maven-publish") +} + +dependencies { + api(libs.xml) + testImplementation(project(":nebulosa-test")) +} + +publishing { + publications { + create("pluginMaven") { + from(components["java"]) + } + } +} diff --git a/nebulosa-xml/src/main/kotlin/nebulosa/xml/XmlHelper.kt b/nebulosa-xml/src/main/kotlin/nebulosa/xml/XmlHelper.kt new file mode 100644 index 000000000..db8c4e2ef --- /dev/null +++ b/nebulosa-xml/src/main/kotlin/nebulosa/xml/XmlHelper.kt @@ -0,0 +1,32 @@ +package nebulosa.xml + +import javax.xml.stream.XMLStreamReader + +fun XMLStreamReader.attribute(name: String): String? { + for (i in 0 until attributeCount) { + if (getAttributeLocalName(i) == name) { + return getAttributeValue(i) + } + } + + return null +} + +private val XML_ESCAPE_CHARS = charArrayOf('"', '&', '<', '>') +private val XML_ESCAPE_CHAR_CODES = arrayOf(""", "&", "<", ">") + +fun String.escapeXml(): String { + if (none { it in XML_ESCAPE_CHARS }) return this + + return buildString(length) { + for (c in this) { + val index = XML_ESCAPE_CHARS.indexOf(c) + + if (index >= 0) { + append(XML_ESCAPE_CHAR_CODES[index]) + } else { + append(c) + } + } + } +} diff --git a/settings.gradle.kts b/settings.gradle.kts index 6bee2eca2..eec6b9596 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -30,6 +30,7 @@ dependencyResolutionManagement { library("apache-lang3", "org.apache.commons:commons-lang3:3.14.0") library("apache-codec", "commons-codec:commons-codec:1.16.1") library("apache-collections", "org.apache.commons:commons-collections4:4.4") + library("apache-numbers-complex", "org.apache.commons:commons-numbers-complex:1.1") library("oshi", "com.github.oshi:oshi-core:6.5.0") library("timeshape", "net.iakovlev:timeshape:2022g.17") library("jna", "net.java.dev.jna:jna:5.14.0") @@ -62,7 +63,8 @@ include(":nebulosa-guiding-internal") include(":nebulosa-guiding-phd2") include(":nebulosa-hips2fits") include(":nebulosa-horizons") -include(":nebulosa-imaging") +include(":nebulosa-image") +include(":nebulosa-image-format") include(":nebulosa-indi-client") include(":nebulosa-indi-device") include(":nebulosa-indi-protocol") @@ -89,3 +91,5 @@ include(":nebulosa-time") include(":nebulosa-vizier") include(":nebulosa-watney") include(":nebulosa-wcs") +include(":nebulosa-xisf") +include(":nebulosa-xml")