Magic Lantern Forum

Developing Magic Lantern => Reverse Engineering => Topic started by: Greg on November 28, 2018, 02:19:44 PM

Title: Sensor Factory Calibration
Post by: Greg on November 28, 2018, 02:19:44 PM
Sensor Factory Calibration
(500D)

RAM (ISO100) 0x30A10C - 0x30EC8C
ROM (ISO100) 0xFFA0590C - 0xFFA0A48C

RAM
ISO 100 0x30A10C
ISO 200 0x30EC94
ISO 400 0x31381C
ISO 800 0x3183A4
ISO 1600 0x31CF2C
ISO 3200 0x321AB4
ISO 6400 0x32663C
ISO 12800 0x32B1C4


I found the adress in RAM using QEMU FRSP-log:

[EDMAC#9] Starting transfer from 0x30A10C to <15>, 4832x4, flags=0x10000
[EDMAC#9] 19328 bytes read from 30A10C-30EC8C.


How to find in RAM?
Find hex values :
4D 00 01 01 88 4B 00 00
4D -> ISO 100?
88 4B -> 0x4b88 = ‭4834‬ // 4834 - 2 = 4832 500D width

Now let's try to find in 5D3 rom
‭5936‬ + 2 = 5938
5938*4 = 0x‭5CC8‬

4D 00 01 01 C8 5C 00 00
The address is after these hex values


What is this data?

The data is packed in 16 bits of 2 values for each column.

Left optical black [512, 0] (these are approximate values, different for each column):
(https://i.postimg.cc/bwwZHS13/VRAM0.png) (https://i.postimg.cc/4x2m845Z/VRAM1.png)

After left optical black [512, 512] (these are approximate values, different for each column):
(https://i.postimg.cc/hGHhBC65/VRAM2.png) (https://i.postimg.cc/d07DgMHC/VRAM3.png)

Changing the first value affects the black level column by -1.
Black level 1024
value -1 -> 1025
value +1 -> 1023

Dark frames (+5EV)

(Canon Default | Whole buffer filled [0,0] | Whole buffer filled [512,512] | Buffer after left optical black filled [512,512]) :
(https://i.postimg.cc/kXrZbxPP/dark-frame.jpg) (https://i.postimg.cc/sDpL9v3Q/dark-frame-0-0.jpg) (https://i.postimg.cc/dV6SppkJ/dark-frame-512-512.jpg) (https://i.postimg.cc/2SrKHr5H/dark-frame-512-512-afterleft.jpg)
Title: Re: Sensor Factory Calibration
Post by: Greg on December 10, 2018, 05:33:35 PM
The first attempts of automatic calibration :
(https://i.postimg.cc/2SWh3Spq/VRAM0.png)

The first image is a dark frame with ADTG-CMOS amplifier reduced. The second image, after automatic calibration.
(https://i.postimg.cc/Vs2pgY58/500d-adtg-2.jpg) (https://i.postimg.cc/hPxw3H77/500d-adtg-calibration-2.jpg)
Title: Re: Sensor Factory Calibration
Post by: 70MM13 on December 10, 2018, 11:35:45 PM
Wow, exciting!
I can't wait to see where this leads...
Title: Re: Sensor Factory Calibration
Post by: Greg on December 12, 2018, 04:29:27 PM
Averaged 16 frames to make the effect more visible.

ISO 1600
(Canon default | automatic calibration)
(https://i.postimg.cc/QCL8mY8j/iso-1600-default.jpg) (https://i.postimg.cc/9MwXGHjx/iso-1600-cal.jpg)
Title: Re: Sensor Factory Calibration
Post by: 70MM13 on December 12, 2018, 05:13:51 PM
Nice reduction of those nightmarish vertical stripes!
Title: Re: Sensor Factory Calibration
Post by: Kharak on December 12, 2018, 10:17:55 PM
That is huge!

Would be nice with some Real life examples on how the noise and FPN has improved.
Title: Re: Sensor Factory Calibration
Post by: 70MM13 on December 12, 2018, 10:49:22 PM
Those stripes are the only issue that stands in the way of complete satisfaction for me with this camera.

Here's a typical "before" for me, and I can't wait for the after!!!
(https://i.ibb.co/k8xMXQh/lasing-bonus-frame.jpg) (https://ibb.co/k8xMXQh)
Title: Re: Sensor Factory Calibration
Post by: g3gg0 on December 13, 2018, 01:08:02 AM
1) so you found the location where the vertical ADC offset tables for FPN correction are?
2) these probably were calibrated in factory and written into the flash only once?
3) you updated values in RAM to achieve better FPN reduction - for CR2? or did it even affect raw video?

would be interesting to use these tables into a MLV and creating the DARK frame from it :)
Title: Re: Sensor Factory Calibration
Post by: g3gg0 on December 13, 2018, 01:28:55 AM
doing a quick analysis on 5D3.113, it is the TUNE property table, starting at 0xF8B20000

you can dump it like that:
    PropertyEditor.exe 0xF8000000-0xF8FFFFFF.BIN 0xB20000 0x2E0000

and it will spit out a property dump like this:

(https://i.ibb.co/NVttb0Q/Unbenannt.png) (https://ibb.co/h7LLwGh)

where you can see that this memory location is for properties 0x0101004D-0x0101007C with 5936 uint32 values.
before them there are properties 0x0101007E-0x0101008F with 376 uint32 values also looking like a offset table.

getting their value is as simple as reading a property. no need for memory locations.
modifying them, well, i would stick to patching it in-memory :)

good find!

would really be interesting if this is the FPN compensation table we could simply pass to MLV files.
(well not simply, a dark frame must be calculated from these values)
Title: Re: Sensor Factory Calibration
Post by: Greg on December 13, 2018, 03:46:03 AM
@g3gg0,
1) yes
2) 500D yes, I do not know how other cameras. This could be it - https://www.spt.info/index.php/service-adjustment-software?id=21
3) I have a module that takes 64 FRSP dark frames, it takes 9 minutes to process this data (in camera), then the calculated values are saved in RAM.

Calibration in this way:
int new_value = current_value - (int)roundf(allframes_mean - column_allframes_mean[x]);
It's possible that raw_diag does some more advanced things. I just skip cold/hot pixels.

CR2 and FRSP are cleaner (FPN), 500D is not good for video so I do not know, I did not check it.
The module requires code cleanup and some work, currently it is only a tool that is not good for official publication.

We can also use something like two_add engine to speed up the processing. But is it necessary?

My main goal was to calibrate FPN for 500D with ADTG modifications. The effect is good, now it's a new camera.  ;)
Current limitation - I can change the black level of the column by 1. So some of the columns still have 1024.5 or 1023.5.
Title: Re: Sensor Factory Calibration
Post by: 70MM13 on December 14, 2018, 04:40:59 PM
Can someone bring this magic to us 5D3 users?

I'm sure I'm not the only one who wants to test this!
Title: Re: Sensor Factory Calibration
Post by: g3gg0 on December 14, 2018, 09:36:31 PM
on 5D3 the properties with size 0x5E0 are being read by function "GetHivshdIRparameter(Po=%ld[%ld])"
it is later written to HIV by first writing this engio list: (0xBC * 8 = 0x5E0)
(https://i.ibb.co/R4f0xBM/Unbenannt.png)
and then copied there:
(https://i.ibb.co/j8fHqkz/Unbenannt.png)

and the 0x5CC0 sized ones are used for
stru_45294.edmac_0x18_address_HivShd = get_dark_offset(param_iso, v4);
Title: Re: Sensor Factory Calibration
Post by: g3gg0 on December 14, 2018, 09:53:19 PM
Quote from: Greg on December 13, 2018, 03:46:03 AM
The module requires code cleanup and some work, currently it is only a tool that is not good for official publication.

i would head towards reading and writing the properties if i were you.
this makes the code more robust and then would be an equivalent to the SPT tool.
but that requires thorough testing of course.

Quote from: Greg on December 13, 2018, 03:46:03 AM
We can also use something like two_add engine to speed up the processing. But is it necessary?
nah, if you update properties you wont run it every day.

Quote from: Greg on December 13, 2018, 03:46:03 AM
Current limitation - I can change the black level of the column by 1. So some of the columns still have 1024.5 or 1023.5.
as the offsets are integer, odd numbers aren't possible. at least in-camera ;)
would have to use float-files which are a bit overkill.
Title: Re: Sensor Factory Calibration
Post by: Greg on December 14, 2018, 10:26:14 PM
Quote from: g3gg0 on December 14, 2018, 09:53:19 PM
as the offsets are integer, odd numbers aren't possible. at least in-camera ;)
would have to use float-files which are a bit overkill.
This should be possible in the camera.
The "B" value can change column black level below 1.

B = 0 -> column black level = 1233.88
B = 1023 ->  column black level = 1259.98
diff = 26.1


But this is an offset from the black level of the entire frame...

B = 0 -> column black level = 1129.34
B = 1023 ->  column black level = 1142.50
diff = 13.6

B = 0 -> column black level = 1037.44
B = 1023 ->  column black level = 1038.96
diff = 1.52


(column_black_level - frame_black_level)*12.5%

So 1023.5 we can change to 1023.56
It is possible that we need to change some engio register, some offset.
Title: Re: Sensor Factory Calibration
Post by: Greg on December 15, 2018, 01:17:56 AM
cmos_cal.mo
https://bitbucket.org/Gr3g01/ml-cmos-cal/src/iso-research/modules/cmos_cal/

(https://i.postimg.cc/W1P7tDht/module1.png)

To run on another camera:
- SENSOR_VFPN_ADDR_ISO,
- SENSOR_FULL_WIDTH,
- line 325: "if(p < 512 || p > 1536) // digic IV cameras black level 1024 - fix it",

The code is still not clean. But I think someone can try results on 5D2 (is similar to 500D).

TODO :
- I think that the whole module should be rewritten :P
- use silent.mo to take frsp with mirror down,
- save/load data into a file,
- improve the algorithm of calculation to reduce the number of frames and less heat,
- increase the accuracy of calibration below 1,
- validation - comparison of effects before and after calibration,
Title: Re: Sensor Factory Calibration
Post by: Greg on December 15, 2018, 09:27:55 PM
An easy way to find RAM address.
edmac log :
EDMAC#9: addr=0x30a10c conn=15 cbr=0 name='''''' size='''4832x4'''       <------------------------
EDMAC#0: addr=0x79df1a4 conn=2 cbr=0 name='''''' size='''480x16'''
EDMAC#1: addr=0x79e13a4 conn=28 cbr=0 name='''''' size='''(476, skip 36) x 176'''
EDMAC#2: addr=0x600637c conn=0 cbr=0 name='''''' size='''8456x3203'''
EDMAC#6: addr=0x79f9524 conn=18 cbr=0 name='''''' size='''4096x18, 3072'''
EDMAC#9: addr=0x39a3f4 conn=15 cbr=0 name='''''' size='''8x3203'''
EDMAC#8: addr=0x3a48f4 conn=1 cbr=0 name='''''' size='''2000x224'''


Horizontal correction
The address is different for FRSP and CR2
ISO 100 regular picture CR2 (0x39a3f4)
In 500D ROM and RAM is empty, canon does not use it, but if you enter some values manually, it changes the black level of the horizontal line.

It probably will not be useful, we must remember that fixed pattern noise is not random pattern noise.
We can not correct something that is random in this way.
Title: Re: Sensor Factory Calibration
Post by: Danne on December 15, 2018, 10:30:07 PM
Hi Greg. Followed your advice and logged edmac channels on my 100D:
EDMAC#9: addr=0x15aff00 conn=15 cbr=0 name='''''' size='''8x727'''
EDMAC#0: addr=0x1fb37a4 conn=46 cbr=0 name='''''' size='''248x2'''
EDMAC#12: addr=0xdb88c00 conn=14 cbr=0 name='''''' size='''4096x4096'''
EDMAC#2: addr=0xc1f7800 conn=4 cbr=0 name='''''' size='''1440x480'''
EDMAC#6: addr=0xdb76000 conn=18 cbr=0 name='''''' size='''4096x18, 3072'''
EDMAC#9: addr=0x15aff00 conn=15 cbr=0 name='''''' size='''8x727'''
EDMAC#8: addr=0x14f12bc conn=0 cbr=0 name='''''' size='''2000x224'''


LOG:
https://bitbucket.org/Dannephoto/magic-lantern/downloads/EDMAC000_100D.LOG

A little lost I am but I got your fine cmos calibration tool running on my 100D but it fails to do what it is inteneded to do. I probably should get some sleep and reread your post again but if you feel like it It would be great to kickstart my 100D with  some values suitable to this:
- SENSOR_VFPN_ADDR_ISO,
- SENSOR_FULL_WIDTH,
- line 325: "if(p < 512 || p > 1536) // digic IV cameras black level 1024 - fix it",




I logged while in photo mode. Would the same logs appear in movie mode?
Title: Re: Sensor Factory Calibration
Post by: Greg on December 16, 2018, 12:19:00 AM
@Danne,
This log looks like a live view.
We need a regular pic log.

Live View
I looked at the live view in 500D :
EDMAC#9: addr=0x442784 conn=15 cbr=0 name='''''' size='''32x208''' //vertical column
EDMAC#9: addr=0x485fd4 conn=15 cbr=0 name='''''' size='''32x165''' //horizontal line


This looks like a 4x1664 buffer and 4x1320
Looking at hexeditor and RAM, the data in this buffer looks very similar to those in photo mode.

Changing these registers does not affect ML raw. ML takes raw before FPN correction.

Change the value of several columns:
(https://i.postimg.cc/7Y25FkY8/fpn1.png)

Several lines:
(https://i.postimg.cc/RZ1N0LHg/fpn2.png)

I do not plan further research in live view/video mode. I do not have time for it.
Title: Re: Sensor Factory Calibration
Post by: Danne on December 16, 2018, 08:08:32 AM
Files here:
https://bitbucket.org/Dannephoto/magic-lantern/downloads/EDMAC000_fullres_silent_100D.LOG
https://bitbucket.org/Dannephoto/magic-lantern/downloads/EDMAC000_CR2_100D.LOG

Ok, these should be better(CR2):
EDMAC#0: addr=0x80090c4 conn=35 cbr=0 name='''''' size='''9240x3529'''
EDMAC#8: addr=0x13a0000 conn=0 cbr=0 name='''''' size='''2000x256'''
EDMAC#9: addr=0x144f9e4 conn=15 cbr=0 name='''''' size='''8x3529'''
EDMAC#6: addr=0xccc000 conn=18 cbr=0 name='''''' size='''4096x13, 752'''
EDMAC#12: addr=0xf5a884 conn=14 cbr=0 name='''''' size='''4096x41, 128'''
EDMAC#16: addr=0xf5a884 conn=23 cbr=0 name='''''' size='''4096x18, 3072'''
EDMAC#17: addr=0xf40504 conn=2 cbr=0 name='''''' size='''480x16'''
EDMAC#18: addr=0xf42704 conn=28 cbr=0 name='''''' size='''(434, skip 78) x 192'''


Log from fullres silent DNG:

EDMAC#1: addr=0x63cc100 conn=27 cbr=0 name='''''' size='''1920x640'''
EDMAC#2: addr=0xc1f7800 conn=4 cbr=0 name='''''' size='''1440x480'''
EDMAC#5: addr=0xd9c5a00 conn=2 cbr=0 name='''''' size='''32x240'''
EDMAC#8: addr=0x14f12bc conn=0 cbr=0 name='''''' size='''2000x224'''
EDMAC#9: addr=0x15aff00 conn=15 cbr=0 name='''''' size='''8x727'''
EDMAC#16: addr=0xdb98000 conn=40 cbr=0 name='''''' size='''864x288'''
EDMAC#17: addr=0x6df100 conn=15 cbr=0 name='''''' size='''20'''
EDMAC#18: addr=0x6798100 conn=0 cbr=0 name='''''' size='''3164x726'''
EDMAC#24: addr=0x20c80a0 conn=54 cbr=0 name='''''' size='''12594x16'''

and more:
EDMAC#0: addr=0x80090c4 conn=35 cbr=0 name='''''' size='''9240x3529'''
EDMAC#8: addr=0x13a0000 conn=0 cbr=0 name='''''' size='''2000x256'''
EDMAC#9: addr=0x1441d44 conn=15 cbr=0 name='''''' size='''8x3529'''
EDMAC#16: addr=0xf5a884 conn=23 cbr=0 name='''''' size='''4096x18, 3072'''
EDMAC#17: addr=0xf40504 conn=2 cbr=0 name='''''' size='''480x16'''

and these:
EDMAC#6: addr=0xdb76000 conn=18 cbr=0 name='''''' size='''4096x18, 3072'''
EDMAC#12: addr=0xdc28000 conn=14 cbr=0 name='''''' size='''864x288'''
EDMAC#6: addr=0xdb88c00 conn=18 cbr=0 name='''''' size='''4096x13, 752'''
EDMAC#12: addr=0xdb76000 conn=14 cbr=0 name='''''' size='''4096x41, 128'''





Title: Re: Sensor Factory Calibration
Post by: aprofiti on December 16, 2018, 02:29:57 PM
I'm trying to replicate on 50D using EDMAC Log, but I'm a bit stuck because it seems it's missing some infos...

Here (https://drive.google.com/file/d/1C8n_UiMT2-vybwcmuvUU2PCLGFtVgZ-I/view?usp=sharing) is the CR2 ISO 100 log

EDMAC#0: addr=0x5a10a64 conn=2 cbr=0 name='''''' size='''480x16'''
EDMAC#1: addr=0x5a12c64 conn=28 cbr=0 name='''''' size='''(476, skip 36) x 176'''
EDMAC#2: addr=0x400637c conn=0 cbr=0 name='''''' size='''8456x3228'''
EDMAC#6: addr=0x5a2ade4 conn=18 cbr=0 name='''''' size='''4096x18, 3072'''
EDMAC#8: addr=0x3de078 conn=0 cbr=0 name='''''' size='''2000x224'''
EDMAC#9: addr=0x3d3a9c conn=15 cbr=0 name='''''' size='''8x3228'''
EDMAC#12: addr=0x5a2ade4 conn=14 cbr=0 name='''''' size='''4096x41, 128'''
EDMAC#16: addr=0x1f50000 conn=23 cbr=0 name='''''' size='''4096x13, 752'''
EDMAC#3: addr=0x2014088 conn=5 cbr=0 name='''''' size='''7400x4096'''
EDMAC#4: addr=0x143ec070 conn=22 cbr=0 name='''''' size='''((1212, skip 2412) x 395, 1212, skip -1431480) x 2,   (1200, skip 2424) x 396'''
EDMAC#10: addr=0x4000048 conn=0 cbr=0 name='''''' size='''((2884, skip 5572) x 3231, 2884, skip -27321392) x 2,   (2828, skip 5628) x 3232'''
EDMAC#3: addr=0x1454c07c conn=5 cbr=0 name='''''' size='''3260x4096'''
EDMAC#4: addr=0x1f12a30 conn=3 cbr=0 name='''''' size='''48x9x396'''
EDMAC#10: addr=0x4071962 conn=0 cbr=0 name='''''' size='''(((1036, skip 7420) x 13, 1036, skip -110040) x 8,   (1036, skip 7420) x 13, 1036, skip -50708) x 396'''
EDMAC#11: addr=0x5a12c64 conn=33 cbr=0 name='''''' size='''512x176'''
EDMAC#13: addr=0x1f10000 conn=3 cbr=0 name='''''' size='''432x446'''
EDMAC#3: addr=0x1b00f00 conn=6 cbr=0 name='''''' size='''3840x1079'''
EDMAC#11: addr=0x1b00000 conn=6 cbr=0 name='''''' size='''(3840, skip -3840) x 1079'''
EDMAC#3: addr=0xd00000 conn=3 cbr=0 name='''''' size='''(((120, skip 3444) x 2, 120, skip -7128) x 29,   (84, skip 3480) x 2, 84) x 396'''
EDMAC#11: addr=0x1b00000 conn=3 cbr=0 name='''''' size='''1440x252'''


This is what I've done:
- Compiled ML from iso-research branch
- Enabled modules edmac.mo, adtg_gui.mo and raw_diag.mo
- In EDMAC Tool menu I have set Log very 2000us
- Start logging EDMAC by pressing half shutter
- Quickly press half-shutter again to take a cr2 photo

Also how to compile qemu-frsp? if I use the make file from it's folder it tells me that it's missing Camera MODEL.
Do I need to copy minimal.c to /src directory?
Title: Re: Sensor Factory Calibration
Post by: Greg on December 16, 2018, 04:31:41 PM
These logs are incomplete.

Quote from: aprofiti on December 16, 2018, 02:29:57 PM
- In EDMAC Tool menu I have set Log very 2000us
Try 100us or 50us.
Title: Re: Sensor Factory Calibration
Post by: dfort on December 16, 2018, 05:20:52 PM
Quote from: aprofiti on December 16, 2018, 02:29:57 PM
Also how to compile qemu-frsp? if I use the make file from it's folder it tells me that it's missing Camera MODEL.

make MODEL=50D
Title: Re: Sensor Factory Calibration
Post by: Danne on December 16, 2018, 08:54:43 PM
Quote from: Greg on December 16, 2018, 04:31:41 PM
These logs are incomplete.
Try 100us or 50us.

Are mine incomplete too you mean Greg?
Also, how to obtain the full logs? Press full shutter and actually fire off a CR2 and wait for the log?
While taking the full resolution dng and wait for the log?
Sorry but in need of guidance if we could get any. Would be really cool to be able to use and test out this module on other cameras but would certainly speed up things if steps and outlines could be provided.
Thanks.
Title: Re: Sensor Factory Calibration
Post by: g3gg0 on December 17, 2018, 12:10:47 AM
Quote from: Greg on December 16, 2018, 12:19:00 AM
Several lines:
(https://i.postimg.cc/RZ1N0LHg/fpn2.png)

which table did you modify for these horizontal lines?
Title: Re: Sensor Factory Calibration
Post by: aprofiti on December 17, 2018, 01:22:26 AM
Quote from: Greg on December 16, 2018, 04:31:41 PM
These logs are incomplete.
Try 100us or 50us.
Tried again with 50us and got infos for iso 200 and iso 400 but wasn't working with iso 100/800/1600/3200 (neither 100us or 200us).

Iso 200:

EDMAC#9: addr=0x31832c conn=15 cbr=0 name='''''' size='''4832x4'''
EDMAC#0: addr=0x5a10a64 conn=2 cbr=0 name='''''' size='''480x16'''
EDMAC#1: addr=0x5a12c64 conn=28 cbr=0 name='''''' size='''(476, skip 36) x 176'''
EDMAC#2: addr=0x400637c conn=0 cbr=0 name='''''' size='''8456x3228'''
EDMAC#6: addr=0x5a2ade4 conn=18 cbr=0 name='''''' size='''4096x18, 3072'''
EDMAC#8: addr=0x3de078 conn=0 cbr=0 name='''''' size='''2000x224'''
EDMAC#9: addr=0x3d3a9c conn=15 cbr=0 name='''''' size='''8x3228'''

Before and after 1\25 +5EV (mean values and calibration changes on different runs)
(https://i.ibb.co/WkrtcpT/IMG-1996.jpg) (https://ibb.co/WkrtcpT) (https://i.ibb.co/4NFBLqd/IMG-1997.jpg) (https://ibb.co/4NFBLqd) (https://i.ibb.co/2vHGsyN/VRAM10.jpg) (https://ibb.co/2vHGsyN)

Iso 400:

EDMAC#9: addr=0x3265c4 conn=15 cbr=0 name='''''' size='''4832x4'''
EDMAC#0: addr=0x5a10a64 conn=2 cbr=0 name='''''' size='''480x16'''
EDMAC#1: addr=0x5a12c64 conn=28 cbr=0 name='''''' size='''(476, skip 36) x 176'''
EDMAC#2: addr=0x400637c conn=0 cbr=0 name='''''' size='''8456x3228'''
EDMAC#6: addr=0x5a2ade4 conn=18 cbr=0 name='''''' size='''4096x18, 3072'''
EDMAC#9: addr=0x3d3a9c conn=15 cbr=0 name='''''' size='''8x3228'''
EDMAC#8: addr=0x3de078 conn=1 cbr=0 name='''''' size='''2000x224'''


(https://i.ibb.co/7KSZ6kV/IMG-1998.jpg) (https://ibb.co/7KSZ6kV) (https://i.ibb.co/sV6cNTD/IMG-1999.jpg) (https://ibb.co/sV6cNTD)

Quote from: dfort on December 16, 2018, 05:20:52 PM
make MODEL=50D
Thank you! Had to make small changes to minimal.c and prop_values.c to solve some errors of missing stubs (sync_caches() and display_idle())

This is what I in console when running in Qemu:

[EDMAC#9] Starting transfer from 0x31832C to <15>, 4832x4, flags=0x10000
[EDMAC#9] 19328 bytes read from 31832C-31CEAC.


How do I change iso from there?
Title: Re: Sensor Factory Calibration
Post by: dfort on December 17, 2018, 05:56:41 AM
Tried finding the addresses on the EOSM and got lost. Did better with the 7D.

ISO 100:
EDMAC#9: addr=0x3d9fc0 conn=15 cbr=0 name='''''' size='''5360x4'''
EDMAC#0: addr=0x1ca23e84 conn=2 cbr=0 name='''''' size='''480x16'''
EDMAC#1: addr=0x1ca26084 conn=28 cbr=0 name='''''' size='''(432, skip 80) x 192'''
EDMAC#2: addr=0x4006e50 conn=0 cbr=0 name='''''' size='''9380x3516'''
EDMAC#6: addr=0x1ca3e204 conn=18 cbr=0 name='''''' size='''4096x18, 3072'''
EDMAC#8: addr=0x4ece3c conn=0 cbr=0 name='''''' size='''2000x224'''
EDMAC#9: addr=0x46cce8 conn=15 cbr=0 name='''''' size='''8x3516'''


ISO 200:
EDMAC#9: addr=0x3e9b18 conn=15 cbr=0 name='''''' size='''5360x4'''
EDMAC#0: addr=0x1ca23e84 conn=2 cbr=0 name='''''' size='''480x16'''
EDMAC#1: addr=0x1ca26084 conn=28 cbr=0 name='''''' size='''(432, skip 80) x 192'''
EDMAC#2: addr=0x4006e50 conn=0 cbr=0 name='''''' size='''9380x3516'''
EDMAC#6: addr=0x1ca3e204 conn=18 cbr=0 name='''''' size='''4096x18, 3072'''
EDMAC#8: addr=0x4ece3c conn=0 cbr=0 name='''''' size='''2000x224'''
EDMAC#9: addr=0x4816a0 conn=15 cbr=0 name='''''' size='''8x3516'''


ISO 400:
EDMAC#9: addr=0x3f9670 conn=15 cbr=0 name='''''' size='''5360x4'''
EDMAC#0: addr=0x1ca23e84 conn=2 cbr=0 name='''''' size='''480x16'''
EDMAC#1: addr=0x1ca26084 conn=28 cbr=0 name='''''' size='''(432, skip 80) x 192'''
EDMAC#2: addr=0x4006e50 conn=0 cbr=0 name='''''' size='''9380x3516'''
EDMAC#6: addr=0x1ca3e204 conn=18 cbr=0 name='''''' size='''4096x18, 3072'''
EDMAC#8: addr=0x4ece3c conn=0 cbr=0 name='''''' size='''2000x224'''
EDMAC#9: addr=0x496058 conn=15 cbr=0 name='''''' size='''8x3516'''


ISO 800:
EDMAC#9: addr=0x4091c8 conn=15 cbr=0 name='''''' size='''5360x4'''
EDMAC#2: addr=0x4006e50 conn=0 cbr=0 name='''''' size='''9380x3516'''
EDMAC#1: addr=0x1ca26084 conn=28 cbr=0 name='''''' size='''(432, skip 80) x 192'''
EDMAC#0: addr=0x1ca23e84 conn=2 cbr=0 name='''''' size='''480x16'''
EDMAC#6: addr=0x1ca3e204 conn=18 cbr=0 name='''''' size='''4096x18, 3072'''
EDMAC#9: addr=0x4aaa10 conn=15 cbr=0 name='''''' size='''8x3516'''
EDMAC#8: addr=0x4ece3c conn=0 cbr=0 name='''''' size='''2000x224'''


ISO 1600:
EDMAC#9: addr=0x418d20 conn=15 cbr=0 name='''''' size='''5360x4'''
EDMAC#1: addr=0x1ca26084 conn=28 cbr=0 name='''''' size='''(432, skip 80) x 192'''
EDMAC#2: addr=0x4006e50 conn=0 cbr=0 name='''''' size='''9380x3516'''
EDMAC#0: addr=0x1ca23e84 conn=2 cbr=0 name='''''' size='''480x16'''
EDMAC#6: addr=0x1ca3e204 conn=18 cbr=0 name='''''' size='''4096x18, 3072'''
EDMAC#8: addr=0x4ece3c conn=0 cbr=0 name='''''' size='''2000x224'''
EDMAC#9: addr=0x4bf3c8 conn=15 cbr=0 name='''''' size='''8x3516'''


ISO 3200:
EDMAC#9: addr=0x42dc40 conn=15 cbr=0 name='''''' size='''5360x4'''
EDMAC#2: addr=0x4006e50 conn=0 cbr=0 name='''''' size='''9380x3516'''
EDMAC#0: addr=0x1ca23e84 conn=2 cbr=0 name='''''' size='''480x16'''
EDMAC#1: addr=0x1ca26084 conn=28 cbr=0 name='''''' size='''(432, skip 80) x 192'''
EDMAC#6: addr=0x1ca3e204 conn=18 cbr=0 name='''''' size='''4096x18, 3072'''
EDMAC#8: addr=0x4ece3c conn=0 cbr=0 name='''''' size='''2000x224'''
EDMAC#9: addr=0x4c61b0 conn=15 cbr=0 name='''''' size='''8x3516'''


ISO 6400:
EDMAC#9: addr=0x44d2f0 conn=15 cbr=0 name='''''' size='''5360x4'''
EDMAC#2: addr=0x4006e50 conn=0 cbr=0 name='''''' size='''9380x3516'''
EDMAC#1: addr=0x1ca26084 conn=28 cbr=0 name='''''' size='''(432, skip 80) x 192'''
EDMAC#0: addr=0x1ca23e84 conn=2 cbr=0 name='''''' size='''480x16'''
EDMAC#6: addr=0x1ca3e204 conn=18 cbr=0 name='''''' size='''4096x18, 3072'''
EDMAC#9: addr=0x4ccf98 conn=15 cbr=0 name='''''' size='''8x3516'''
EDMAC#8: addr=0x4ece3c conn=0 cbr=0 name='''''' size='''2000x224'''


ISO 12800
EDMAC#9: addr=0x457a80 conn=15 cbr=0 name='''''' size='''5360x4'''
EDMAC#0: addr=0x1ca23e84 conn=2 cbr=0 name='''''' size='''480x16'''
EDMAC#1: addr=0x1ca26084 conn=28 cbr=0 name='''''' size='''(432, skip 80) x 192'''
EDMAC#2: addr=0x4006e50 conn=0 cbr=0 name='''''' size='''9380x3516'''
EDMAC#6: addr=0x1ca3e204 conn=18 cbr=0 name='''''' size='''4096x18, 3072'''
EDMAC#8: addr=0x4ece3c conn=0 cbr=0 name='''''' size='''2000x224'''
EDMAC#9: addr=0x4d3d80 conn=15 cbr=0 name='''''' size='''8x3516'''


Plugging this into the module:

    if (is_camera("7D", "2.0.3"))
    {
        SENSOR_VFPN_ADDR_100 = 0x3d9fc0;
        SENSOR_VFPN_ADDR_200 = 0x3e9b18;
        SENSOR_VFPN_ADDR_400 = 0x3f9670;
        SENSOR_VFPN_ADDR_800 = 0x4091c8;
        SENSOR_VFPN_ADDR_1600 = 0x418d20;
        SENSOR_VFPN_ADDR_3200 = 0x42dc40;
        SENSOR_VFPN_ADDR_6400 = 0x44d2f0;
        SENSOR_VFPN_ADDR_12800 = 0x457a80;
        SENSOR_FULL_WIDTH = 5360; //if an error occurs, it prevents buffer overflow
    }


Does that look about right?
Title: Re: Sensor Factory Calibration
Post by: g3gg0 on December 17, 2018, 11:09:01 AM
maybe i wasn't specific enough.
using
int PROPAD_GetPropertyData(unsigned int property, void **data, int *length)
you can read the memory address of the properties i wrote.
no need for searching, you just need PROPAD_GetPropertyData to retrieve the RAM addresses you just searched for.

some example (untested)

int (*PROPAD_GetPropertyData) (unsigned int property, void **data, int *length) = 0xFF06934C; // 7D.203, see stubs.h where they are defined
unsigned int *table = NULL;
unsigned int table_length = 0;

PROPAD_GetPropertyData(0x0101004D, &table, &length);
if(length != SENSOR_FULL_WIDTH*4)
{
    return;
}

// table should now have the RAM address you tried to find manually
table[0] = value; // patch table entry 0



advantage of above code:
- you are doing it correct (as most likely SPT tool does)
- doesnt matter when RAM addresses change (they are not guaranteed to stay the same, may even vary between boots!)
- you do not have to find RAM addresses for all models, just using the property function for that

disadvantage:
- the PROPAD_ functions are commented out for safety reasons as it is not good to mess with property data in RAM. which is exactly what you are doing anyway. so you went down that rabbit hole already ;)
- i didnt test this code

advantage/disadvantage:
- need to map property ID <-> ISO which is a good thing to document!
Title: Re: Sensor Factory Calibration
Post by: g3gg0 on December 17, 2018, 11:26:31 AM
5D uses these dark offset table properties:


uint32_t dark_prop_ids[] = {
0x0101004D,
0x0101004E,
0x0101004F,
0x01010050,
0x01010051,
0x01010052,
0x01010053,
0x01010054,
0x01010055,
0x01010056,
0x01010057,
0x01010058,
0x01010059,
0x0101005A,
0x0101005B,
0x0101005C,
0x0101005D,
0x0101005E,
0x0101005F,
0x01010060,
0x01010061,
0x01010062,
0x0101007B,
0x0101007C }


in 5D3 code this setup is used to determine the property.
the raw iso value (0x40-0x99) is used as index to this table:


uint32_t dark_prop_ids_by_iso[89] = {
0x101004D,
0x101004D,
0x101004D,
0x101004D,
0x101004D,
0x101004D,
0x101004D,
0x101004D,
0x101004D,
0x101004D,
0x101004D,
0x101004E,
0x101004E,
0x101004F,
0x101004F,
0x101004F,
0x1010050,
0x1010050,
0x1010050,
0x1010051,
0x1010051,
0x1010052,
0x1010052,
0x1010052,
0x1010053,
0x1010053,
0x1010053,
0x1010054,
0x1010054,
0x1010055,
0x1010055,
0x1010055,
0x1010056,
0x1010056,
0x1010056,
0x1010057,
0x1010057,
0x1010058,
0x1010058,
0x1010058,
0x1010059,
0x1010059,
0x1010059,
0x101005A,
0x101005A,
0x101005B,
0x101005B,
0x101005B,
0x101005C,
0x101005C,
0x101005C,
0x101005D,
0x101005D,
0x101005E,
0x101005E,
0x101005E,
0x101005F,
0x101005F,
0x101005F,
0x1010060,
0x1010060,
0x1010061,
0x1010061,
0x1010061,
0x1010062,
0x1010062,
0x1010062,
0x101007B,
0x101007B,
0x101007C,
0x101007C,
0x101007C,
0x1010062,
0x1010062,
0x1010062,
0x1010062,
0x1010062,
0x1010062,
0x1010062,
0x1010062,
0x1010062,
0x1010062,
0x1010062,
0x1010062,
0x1010062,
0x1010062,
0x1010062,
0x1010062,
0x1010062 }


7D uses only 73 entries for this table.
Title: Re: Sensor Factory Calibration
Post by: dfort on December 17, 2018, 05:59:34 PM
Quote from: g3gg0 on December 17, 2018, 11:09:01 AM
- the PROPAD_ functions are commented out for safety reasons as it is not good to mess with property data in RAM. which is exactly what you are doing anyway. so you went down that rabbit hole already ;)

Interesting--it is commented out on all platforms except the 100D:

/** Properties **/
NSTUB(0xFF129D54,  PROPAD_GetPropertyData)                  // check FF0CAAF0 later
NSTUB(0xFF128748, _prop_cleanup)
NSTUB(0xFF128100, _prop_request_change)
NSTUB(0xFF12867C,  prop_deliver)
NSTUB(0xFF127F10,  prop_register_slave)


Check back later!
Title: Re: Sensor Factory Calibration
Post by: Greg on December 17, 2018, 06:11:11 PM
I will not modify these properties. I'm using this with ADTG modifications. So if I started the camera without ML, the pictures will be worse than the factory calibration.
Maybe I did not clearly write what I mean by the publication of the module. I just wanted to create something that will present effects on other cameras. To see if it is useful.

We're in Reverse Engineering, so I'm trying to show how these registers work, RAM editing is more secure when I do not know what it does.

If someone can not find the address in RAM and does not understand what this code does, he should not use it at this stage.
Title: Re: Sensor Factory Calibration
Post by: g3gg0 on December 17, 2018, 11:32:06 PM
Quote from: Greg on December 17, 2018, 06:11:11 PM
I will not modify these properties.

hehe not exactly.

you *already* edit the property RAM image.
exactly the same you get when calling the PROPAD function i wrote. it will return the property's RAM buffers you are guessing right now.

right now, you are already there:
-> writing a few bytes beyond end of buffer -> risk of bricked camera
-> triggering a write-back of the properties you modified -> risk of bricked camera


using PROPAD is just a cleaner way of getting to the RAM buffer, not by trial and error but by asking the camera.
Title: Re: Sensor Factory Calibration
Post by: Greg on December 18, 2018, 02:20:03 PM
I thought that your clone from Santa again wants to change the value in the ROM of my 500D.  :P
Title: Re: Sensor Factory Calibration
Post by: Greg on December 29, 2018, 01:37:51 AM
500D properties :
VFPN correction (photo mode CR2 and FRSP)
0x0101004D - ISO 100
0x01010050 - ISO 200
0x01010053 - ISO 400
0x01010056 - ISO 800
0x01010059 - ISO 1600
0x0101005C - ISO 3200
0x0101005F - ISO 6400
0x01010062 - ISO 12800

HFPN correction
0x01010096 - ISO 100-12800 FRSP
0x010100A1 - ISO 100-12800 CR2


Attempt to read the RAM address and size using g3gg0's code :
(https://i.postimg.cc/3R4vYmSz/VRAM0.png)
Title: Re: Sensor Factory Calibration
Post by: g3gg0 on December 29, 2018, 02:17:46 PM
great!
thanks for helping reverse engineering those.

i wonder what would be the effort to generate a dark frame from the data in the properties.
dump data to SD card, build an image with HFPN and VFPN only applied and use mlv_dump subtract feature to remove that noise.
just like with the normal dark frame processing using VIDF frame, because mlv_dump doesn't support the DARK block yet.


if that works, it would eliminate (?) the FPN detection in mlv_dump.

of course that DARK mlv block (see there (https://docs.google.com/spreadsheets/d/1ItNuLj34JlK6bZgiAJLrmG7p3iyCmCju4XYyiwjqJOM/edit#gid=0)) would have to contain this image.
as long user doesn't switch ISO during recording, writing that block at the end is enough.

(could be integrated into mlv_meta (https://1drv.ms/u/s!Amx_Fd-zOoXnndFEzzZLFZhmhk4D8g), which isn't public yet)
Title: Re: Sensor Factory Calibration
Post by: Greg on December 30, 2018, 12:26:02 AM
Canon photo mode function :

if (!raw_iso)
  assert("Iso != 0", "Param\\HivshdParam.c");
PROPAD_GetPropertyData(dword_FF447038[raw_iso - 64], (int)&v2, (int)&v3);
return v2;


Canon live view function :

if(raw_iso < 72)
  raw_ iso = 72;
if(raw_iso > 104)
  raw_iso = 104;
PROPAD_GetPropertyData((signed int)(raw_iso - 72) / 8 + 0x1050000, (int)&v2, (int)&v3);
Then it calculates the offset in the table (depends on the mode and position of the crop mode)


500D VFPN correction (live view)
0x1050000 - ISO 100
0x1050001 - ISO 200
0x1050002 - ISO 400
0x1050003 - ISO 800
0x1050004 - ISO 1600 - 12800


(https://i.postimg.cc/yN0jrWBN/VRAM1.png)

Live view on newer cameras works differently, but the address property seems to be the same.
5D3 ROM string "LiveView Gain Table Ver0.2" :
0x1050000
0x1050001
0x1050002
0x1050003
0x1050004
0x1050005
0x1050006
0x1050007
0x1050081
0x1050082
0x10500D1


BTW, we can find hotpixels table, also possible focus pixels.
For 500D this is EDMAC#8 [DEFM] engine.
Title: Re: Sensor Factory Calibration
Post by: g3gg0 on December 30, 2018, 01:40:12 AM
5D3 gives me those hints for defects, not sure if it is the track you are looking for.


    while ( v6 < 0x800 );
    PROPAD_GetPropertyData(0xE000001u, &dst, &length);
    memcpy(dst, (void *)data.pDestAddr, 0x2000);
    prop_request_change(0xE000001u, dst, length);
    msleep(100);
    DryosDebugMsg(0x93, 0x16, (const char *)"DefectsDetectionForLV");
    PROPAD_GetPropertyData(0xE000002u, &result, (int *)&dest);
    PROPAD_GetPropertyData(0xE000004u, &v17, (int *)&v13);
    PROPAD_GetPropertyData(0xE000003u, &v18, (int *)&v14);


here the properties, which are not quite helpful.
whats their content in your camera?


      <PropertySubBlock ValidFlag="0000FFFF" Id="00FF0000" TotalLength="00007074">
        <Properties>
          <Property Id="0E000001" BaseAddress="00EEDF40" Length="00002000">
            <String>________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________</String>
            <Data>00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF00F0FFFF</Data>
          </Property>
          <Property Id="0E000002" BaseAddress="00EEFF48" Length="00002000">
            <String>________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________</String>
            <Data>FFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000</Data>
          </Property>
          <Property Id="0E000003" BaseAddress="00EF1F50" Length="00001000">
            <String>________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________</String>
            <Data>FFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000</Data>
          </Property>
          <Property Id="0E000004" BaseAddress="00EF2F58" Length="00002048">
            <String>________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________</String>
            <Data>FFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000</Data>
          </Property>
        </Properties>
      </PropertySubBlock>

Title: Re: Sensor Factory Calibration
Post by: Greg on December 30, 2018, 11:04:40 PM
Quote from: g3gg0 on December 30, 2018, 01:40:12 AM
whats their content in your camera?
I do not remember, I just changed some values in RAM related to EDMAC#8 and I saw more defective pixsels (photo mode cr2).

I think that this code is more dangerous now.  :P
https://bitbucket.org/Gr3g01/ml-cmos-cal/commits/642112e37a254c4965280663694b87c6c45ed723?at=iso-research

For the safety of users who do not know what they are doing, the code downloaded from the repository will not be compiled.
//static int (*PROPAD_GetPropertyData) (unsigned int property, void* data, int *length) = 0xFF05A57C; // 500d.111 stubs.h
Title: Re: Sensor Factory Calibration
Post by: g3gg0 on December 30, 2018, 11:11:13 PM
recommendation:

make "PROPAD_GetPropertyData = NULL" global and assign the address in the firmware version check.
if the variable is NULL, just dont call the code.

the properties might be valid for all camera models
Title: Re: Sensor Factory Calibration
Post by: g3gg0 on December 31, 2018, 12:03:12 AM
whats the exact content of the table?

the 5D3 has a physical resolution or 5936x3952, so the table consists of pairs of two 16 bit words with 5936 entries.
in this pair, the fist value is always 510 or 512 (right y-axis), second one varies a lot (left y-axis)
the second one also has some wird gaps in it.

any idea what the second value is for?


(https://i.ibb.co/wd6nyLm/Unbenannt.png) (https://ibb.co/wd6nyLm)


here some excerpt


(https://i.ibb.co/k4nFX6p/Unbenannt.png) (https://ibb.co/k4nFX6p)
Title: Re: Sensor Factory Calibration
Post by: Greg on December 31, 2018, 12:20:45 AM
Using this module you can change the value of B and click "Read column sensor value" and look at diff.
500D also affects column_black_level - https://www.magiclantern.fm/forum/index.php?topic=23086.msg209326#msg209326

500D
[EDMAC#9] Starting transfer from 0x30A10C to <15>, 4832x4, flags=0x10000


Here, you can also see some 2 parts :
5D3
[EDMAC#24] Starting transfer from 0x174E100 to <15>, 2968x4, flags=0x40020000
[EDMAC#24] Starting transfer from 0x174B2A0 to <15>, 2968x4, flags=0x40020000


Maybe someone forgot about it and treated it again like optical black.
Title: Re: Sensor Factory Calibration
Post by: g3gg0 on December 31, 2018, 12:56:09 AM
hmm maybe we have offset/scaling pairs?
Title: Re: Sensor Factory Calibration
Post by: Greg on January 02, 2019, 08:52:59 PM
ISO 100-1600 (analog) changing the first value (A) by 1 affects column_black_level by 1.48
ISO 3200-12800 (digital) changing the first value (A) by 1 affects column_black_level by 2.96
Each camera may react differently to changing these values depending on the SHAD configuration.

update :
- stdev thershold,
- validation,
- save to file,

https://bitbucket.org/Gr3g01/ml-cmos-cal/src/iso-research/modules/cmos_cal/

(https://i.postimg.cc/5tYqqf8D/VRAM1.png)

To run on another camera need :
if (is_camera("500D", "1.1.1"))
{
    PROPAD_GetPropertyData = 0xFF05A57C;
    SENSOR_FULL_WIDTH = 4832;
}
- calibration ratio (1.48) may be different than 500D
Title: Re: Sensor Factory Calibration
Post by: timbytheriver on January 05, 2020, 11:48:12 AM
Very interesting developments. Thanks to the brains behind it! :D

I notice that commit 4952e34 is cmos_cal.c - compatibility with other cameras

In layman's terms does this mean it is now possible to run the cmos_cal.mo on say 5D3, and if one can discover the correct RAM addresses add this data and complete a sensor calibration?

If one knows what one is doing – of course... ;)
Title: Re: Sensor Factory Calibration
Post by: 70MM13 on July 29, 2020, 12:40:55 PM
this forgotten thread needs some love...

perhaps some fresh eyes can look at it!