12 Commits

Author SHA1 Message Date
378e06a281 docs: allocate UKSS GAS IDs and document Modbus mappings 2026-10-09 22:00:28 +03:00
5d9818291b feat: add M95M02-only GAS and EEPROM profiles
Expose the existing registers through Modbus and service CAN using one GAS provider only in M95M02 builds.
Include the EEPROM layout/driver, LOAD protection and calibration, firmware identity and shared CCS build workflow.
Add transport/profile and SCI8 validation tests, documentation and the checked M95M02 firmware image.
2026-10-09 16:17:37 +03:00
c6c9128238 feat(rs232): enable SCI-A FIFO on PM35 and preserve RS485 2026-10-02 07:23:08 +03:00
419d6b17dc Устранить пересечение образа логгера с параметрами EEPROM и проверять размер BIN 2026-10-01 20:20:00 +03:00
e3d43ef279 Обновить проект CCS, результаты сборки и структуру данных Бальзам-167
Настроить CCS 12.3 и компилятор C2000 22.6.0, подключить общий UMP-протокол в Debug и Release и исправить относительный путь к исходникам. Обновить HEX, карты памяти, таблицу структуры данных и описание зависимости.
2026-10-01 19:04:21 +03:00
34a95bc553 Fix UMP logger boot initialization and configurable protocol build 2026-10-01 17:22:03 +03:00
1ce42a1877 Record PM67 ZPT voltages in UMP logger v3 2026-10-01 16:00:48 +03:00
316dd52f99 Use shared UMP protocol core and document DAC SPI review 2026-10-01 14:02:12 +03:00
2a9f42331c Append Git commit hash to firmware BIN filename 2026-09-22 12:56:45 +03:00
ee7dce4615 Remove file banners and legacy project names from comments 2026-09-22 12:40:43 +03:00
a3633d8ede Добавлен CAN-доступ к регистратору УМП через отдельный канал ответов 2026-09-21 00:49:53 +03:00
df719229b7 Добавлен регистратор запуска и отключения УМП для стендовой проверки
Реализованы кольцевая запись CAN-команд, дискретных сигналов, уставок и состояния ЦАП, а также отдельный архив отключения с секундой постинтервала.
Добавлено расширение Modbus для онлайн-графиков и чтения архива через SetGUI. Сохранены управляющая логика и существующая область технологических регистров.

Добавлены русские комментарии, описание протокола и тест регистратора. Проверка алгоритма и синтаксиса C пройдена; сборка TI/CCS и испытания на плате ещё требуются.
2026-09-21 00:15:27 +03:00
94 changed files with 6178 additions and 1807 deletions

11
.gitignore vendored
View File

@@ -1,2 +1,13 @@
/Debug/
/UKSSTMS320F28335.CS_/
/Bin/UKSSTMS320F28335_*.bin
/Bin/LoggerFix/
/Bin/LoggerEepromFix/
/Bin/Rs232FifoTest/
/Bin/Rs232NoFifoTest/
/Bin/UartFifoTest/
/Bin/*.pending
/UKSSTMS320F28335/Generated/
/Bin/FirmwareIdentity/
/Bin/*.bin.manifest.json
/Bin/*.bin.sha256

Binary file not shown.

View File

@@ -0,0 +1,41 @@
{
"schema": 1,
"product": "Balsam-167-PM35",
"target": "TMS320F28335",
"version": [
1,
1,
2
],
"build_id": "c6c9128+",
"built_at_utc": "2026-10-09T13:10:25+00:00",
"source": {
"commit": "c6c91282387adc789a7ebbc6f7e763d02b549789",
"dirty": true
},
"templates": {
"commit": "86ece3ea907cc92db73390eaae7551dd01b54e2c",
"dirty": true
},
"identity_contract": 1,
"identity_register_count": 12,
"eeprom": "M95M02",
"eeprom_bytes": 262144,
"firmware_limit_bytes": 261884,
"gas": {
"enabled": true,
"version": 1,
"profile": 167,
"info_words": 8,
"register_count": 128,
"transports": [
"modbus_rtu",
"ump_service_can"
],
"info_base": 24320,
"register_base": 20480
},
"file": "UKSSTMS320F28335_GAS_M95M02.bin",
"size_bytes": 33174,
"sha256": "a1c186e5f114ea2f77ac5f18a60424c79f53b1e3a49e0343ac9bd96979f0347e"
}

View File

@@ -0,0 +1 @@
a1c186e5f114ea2f77ac5f18a60424c79f53b1e3a49e0343ac9bd96979f0347e UKSSTMS320F28335_GAS_M95M02.bin

View File

@@ -0,0 +1,16 @@
[
{
"after_bytes": 32472,
"profile": 0,
"gas_added_bytes": 0,
"binary_identical": true,
"before_bytes": 32472
},
{
"after_bytes": 33174,
"profile": 1,
"gas_added_bytes": 410,
"binary_identical": false,
"before_bytes": 32764
}
]

View File

@@ -1,4 +1,4 @@
:20000000AA0800000000000000000000000000000000000098B1830200005FB300FFC0DAB5
:20000000AA08000000000000000000000000000000000000B5B98B02000000C000FFC0DADA
:2000200000000000C1C081C1400101C3C003800241C201C6C006800741C70005C1C581C4C4
:20004000400401CCC00C800D41CD000FC1CF81CE400E000AC1CA81CB400B01C9C0098008A5
:2000600041C801D8C018801941D9001BC1DB81DA401A001EC1DE81DF401F01DDC01D801CD4
@@ -15,7 +15,7 @@
:2001C0004054019CC05C805D419D005FC19F819E405E005AC19A819B405B0199C0598058A4
:2001E00041980188C04880494189004BC18B818A404A004EC18E818F404F018DC04D804C33
:20020000418C0044C184818540450187C047804641860182C042804341830041C181818051
:200220004040C0FF40DE00000000000000000000C701B9019B0958090000000000000000DA
:200220004040C0FFC0DE00000000000000000000C701B9019B09580900000000000000005A
:20024000CE01B7018A09600948130D136C13F9125E076A07D509E7090C138D130C13EF1293
:200260006A075107E709C609EC0ECE0EB10D340DC806AB0256030E00FB0EC90EC20D040D7F
:20028000D106B1025C0311000105F804000000006E02D708000000000A05050500000000FA
@@ -23,865 +23,997 @@
:2002C000FFFF45DC00000000FFFF46DC00000000FFFF47DC00000000FFFF48DC000000009C
:2002E000FFFF51DC00000000FFFF54DC00000000FFFF55DC00000000EEFF68DC00001BD654
:20030000B738D79AFC3FA84C79BF0000000000000000000000000000000000000000000016
:200320000000FFFFACDE00000000FFFFADDE00000000FFFFAEDE00000000FFFFAFDE000097
:200340000000FFFFB0DE00000000FFFFB1DE00000000FFFFB2DE00000000FFFFB3DE000067
:200360000000FFFFA4DD00000000FFFFA5DD00000000FFFFA6DD00000000FFFFA7DD00007B
:200380000000F4FFB4DD00000000000000000000C89C0000FA9C0000C39C0000BE9C000026
:2003A000FFFFCEDE00000000FFFFCFDE00000000FEFFD4DE000000000000FEFFD6DE000088
:2003C00000000000FEFFD8DE000000000000FEFFDADE000000000000EEFF98DE00004A0CFC
:200320000000FFFF72DF00000000FFFF73DF00000000FFFF74DF00000000FFFF75DF00007B
:200340000000FFFF76DF00000000FFFF77DF00000000FFFF78DF00000000FFFF79DF00004B
:200360000000FFFF00DF00000000FFFF01DF00000000FFFF02DF00000000FFFF03DF000003
:200380000000F4FF10DF00000000000000000000FCA300002EA40000F7A30000F2A30000DB
:2003A000FFFF58DF00000000FFFF59DF00000000FEFF66DF000000000000FEFF68DF00004C
:2003C00000000000FEFF6ADF000000000000FEFF6CDF000000000000EEFF2ADD00004A0C45
:2003E000023E4A0C023E0000803F0000803F6C09F93B6C09F93B6C09F93B6C09F93B000005
:20040000803FF0FFB0DA00003F0006005B004F0066006D007D0007007F006F004000000030
:200420000000000079000000FFFF37DE00000600FFFF39DE00000000FFFF3ADE00000000FF
:20044000FEFF3EDE000000000000FFFFC2DE00000000FFFFC3DE00000000FFFFC4DE0000A6
:200460000100FFFFC5DE00000000FFFFF4DE00000000FFFFF5DE00000000FFFFF6DE000067
:200480000000FEFF28DF000055B30000FEFF2ADF000055B30000FEFF2CDF0000000000003A
:2004A000FEFF2EDF000000000000FFFFE0DE00000000FFFFE1DE00000000FBFF1EDF0000C2
:2004C00008000C00100000000400FFFF23DF00000A00FFFF24DF00000100FFFF3EDD0000CF
:2004E0000100FFFF3FDD00000100FEFF34DF000000000000FEFF36DF000000000000FFFFC0
:2005000000D000000100FFFFC0DD00000000FFFF41DC00000000FFFF27DF00000000000050
:020520000000D9
:200522005F330000008002FEA4C5A988013B008FC0DBC7924196A9A8A681A71E1F76710331
:20054200C7CC00E041CA4296C7FF01900B9842CCFFFDA98803564201A91CFF03A9180002E8
:20056200A6CA429682FEC796060010E70B0001E8EAFA20E740000DE8BA9E6FE819F000E7A4
:20058200100000E7490000E70000007710E740004076A0B202E8010250E80000407679AF79
:2005A2000600A71EA59243880860C4930461C40BA6920C6F009A0A6FC427AA2BA706AB0F8C
:2005C2000362019A036FC40AA69206001F767A03BDB22D92BDAA03E2BD04586179D1808D3E
:2005E200C0DB78D0013B9A92929EA985A9BD120F007700770077007789E604000077CFE64E
:20060200210002E80818407679AF1F76710303E21E0002E8101CCFE621000FE830334076C7
:2006220079AF7AD11F76710378D0013B008FC0DB03E220009A92949EA985A9BD120F0077FF
:2006420000770077007789E6010002E80818407679AF7BD11F76710379D0013B008FC0DBD7
:2006620003E222009A92949EA985A9BD120F007700770077007789E6010002E80818407652
:2006820079AF1F76710303E224001F767A032C922F617AD1808DC0DB78D0013B9A92929EEB
:2006A200A985A9BD120F007700770077007789E6010002E84016407679AF7BD11F767103C4
:2006C20079D0013B03E222009A92929EA985A9BD120F007700770077007789E6010002E845
:2006E2004016407679AF1F76710303E2240000D1008FC0DB013BA9A8A181A98A74D0C8E2E7
:200702009400008F80DEA9A8A181A98AC4920252046002E8D123056F02E8E1300AE8010062
:20072200407679AF013B008F98DE0356A1010156A40001D9A192045203E2C400DA64AFE2C7
:20074200BE04BE86BE8B0600BDB2BDAA04FE0052A92DA85A06601F7671030B920B2B0C965C
:20076200008FC0DB013BA9A8AC81A98AC44F076CAC921F7671030654E4FFB401008F21DD14
:20078200A9A8AC81A9837FD0008FC0DB944CC4E2C500EDFF9E01A9A8AC81A98AC44D3F6CF1
:2007A200AC921F76710306543A6300B6A79200BEA985013BA98E008F80DEA9A8AC81A98314
:2007C200A9A8A681A98AC592C4541460008FC0DBA9A8A681A98A1F7671031392C4CE0A600A
:2007E200008F21DDA9A8A681A98A01DFA93AC40DA98E01DEA6921852DF64A7920761A98561
:20080200421EA93AC0004EB2A98EA93AA9BD120F007700770077007789E60000AC921F7614
:200822007103079EA959A2922561008F80DE013BA9A8AC81A98AC4920A521A60AC92069EF9
:20084200A988008F08DFA9A8A681A98AC8E2C401008F00DFA9A8A681A98A01E860EE0EE88F
:20086200686600E74000C492036106E84016A29256601F767A032C9252617FD0008FC0DB9D
:20088200949316D0D3FF9492C1FFA8CAA940246C1F767B03240620601F767A032B920552C3
:2008A2000C6002E849280CE8010094E6080014AD0465A1920250A959A1920E64A9A8013B15
:2008C200A181A98A8CE6000078D013E2940040765380EFFF1401AC921F7671030654E3FF6F
:2008E2000E01A1400F6C79D0C8E29401007720E74000AFE2240300E71800007790E8007629
:200902000E6F78D0C8E29401007720E74000AFE2220300E71800007790E800761F767A03E7
:200922002D925261A192E3FFAF001F767A032B9202521F61AC400F6C79D0008FC0DBC8E258
:2009420094011F76710320E74000AFE2240300E718003A6F78D0008FC0DBC8E294011F760A
:20096200710320E74000AFE2220300E718002C6F08BEAC92A672008FC0DB013BA9A8A68170
:20098200A983807621DDA606AC81A71E18D0C7929596AC9206520D6378D0C8E294011F7609
:2009A200710320E74000AFE21E0300E718000C6F78D0C8E294011F76710320E74000AFE2E6
:2009C200200300E7180016D0008FC0DB26E8000D94937FD0D0FF949232E8401AC9FFA8CAAF
:2009E200A940036C02E8001150E80148A9A8013B8CE60000AC818CE60900A98318D01F76D1
:200A02007B03A6BF120F13E29501432B24063460A9A8AC81A98AC493A84E2E6DA61BECFFD4
:200A22002565A692C852226330D09592FB9CA6540363A845146D008FC0DBA9A8AC81A98AEC
:200A420030D0A69294540B6248D0945415651F767103431A10000B1A08000E6F1F76710364
:200A6200431A20010B1A0400076F1F767103431A01000B1A1000AD5CAC9283DCA45C40765F
:200A820000803C6F1F767B03240616601235008F00D90156A400407617B2013B008FC0DBE7
:200AA200A9A8A181A98A8CE6000078D013E2940040765380236F1235C07640D70156A7009E
:200AC200008F00D90156A40011F68424176FA9A8AC81A98A8CE6000018D013E294000E6F6B
:200AE200008FC0DBA9A8AC81A983A9A8AC81A98AC52B18D0C51A0080942B84FEBE86BE8B6A
:200B02000600BDB2BDAABDA202FE0052A95A06601F7671030B920B2B0C96008FC0DB013BF9
:200B2200A9A8A281A61EC64FEDFFC700408F21DDA9A0A281A9837FD0944CC4E2C500EDFFC8
:200B4200B300408F80DEA9A0A281A9830356C501408F98DE0156A500AFE2C50100E740003D
:200B6200A9A88CE60000A281A98AA1BF120F18D01F767B039479422B2406E0FF8E00C64EB9
:200B8200EDFF8B00A29207525C610356A201A95B1F767A034218FFFB008D01DDA32D3806B3
:200BA200412B22560190A95DA93AA381A98A20FFE80340763E80013B019B019089FFA395D7
:200BC2004298A82D4218FFF73806412B22560190A95DA93AAC81A98A20FFE80340763E809A
:200BE20001908AFF4298A29206522B60029A4218FFEFA394A92D013B3806412B2256019008
:200C0200A95DA93AAC81A98A20FFE80340763E80013B039B0190A3958BFF4298A82D4218D5
:200C2200FFDF38062256412B0190A95DA93AAC81A98A20FFE80340763E8001908CFF429864
:200C42004292C0FF42CDBFFF42CA008FC0DB013BC0FF42CAC0FF42CAC3FF4090A8CA42964E
:200C6200A9A8A281A98348D0A19295540F63408F1EDEA9A0A281A983421A0800A9A8C581CE
:200C8200A98AC492089084FF4298429205611F7671030B1A0200AD5CA29282DCA45C407619
:200CA2000080156FA9A8A281A98A8CE6000018D013E294000C6FA9A8A281A983A9A8A28115
:200CC200A98AC52B18D0C51A0080942B82FEBE82BE86BE8B060000BE013B008FC0DBA9A821
:200CE200A681A98A01DE18D0A692C41800E01852942BF46400BE013B008FC0DB408F10DF7A
:200D0200A9A8A681A98A0356A6010156A50070D0C8E294001F767A0303E2C5002B920652DB
:200D22001760408F80DEA9A0A681A983C59203520F60A640056D18D094288601096F008FCC
:200D4200C0DBA9A8A681A98A18D09428300201DEA6920452D2642B9201521060008FC0DB28
:200D62001F767103A9A80881A98AC41A0040CC1A0040D41A0040DC1A00401F767A032B92E4
:200D820006520760008FC0DBC41A0040CC1A00404076538006001F767A032A92A9931F76F6
:200DA2007103BDB2FF9D052B062B072B01531C69A993FD9D015311690752086109521A600B
:200DC200BF56060FBF56070D156FBF560508BF560608BF5607080E6FBF560507BF56060E0A
:200DE200BF56070E076FBF56050ABF560614BF5607141F767A033192AC2B013BC07668DC6C
:200E02001F76710306940896008F80DEA9A8AC81A98AC42B008F1EDEA9A8AC81A98A408FF7
:200E220040D71235C4210156A500008F00D90156A400AC92019C11F68524A92D185211F63C
:200E42008424E3641F767A032E9225611F7671030692AC2B20651F767A032D920961008F82
:200E620080DE013BA9A8AC81A98ABF56C4091F767A032C920961008F80DE013BA9A8AC8162
:200E8200A98ABF56C408AC921F767103019CA92D0654E2641F767A033192AC2B1565013B80
:200EA2001F7671030688AC92A672008F80DEA9A8A681A98A1F767A03AC92019CBF56C40ADB
:200EC200A92D3154EE641F767A032F9236611F767103AC2B013BBF5612C80892AC94A988E3
:200EE200008F80DEA9A8A681A98A408F10DFBF56C403008F1EDEA9A8A681A98AAC9201F059
:200F02000894C4960356AC01008FC0DB0156A500A9A8AC81A98A70D01235C8E29400008FA8
:200F220040DD0156A40003E2C500AC92019CA92D11F684240452D2641F767A032B920652DA
:200F42000B601F767103008F80DE12282C01BF56DC02BF56D4021F767A032A92095234602C
:200F6200008F80DE408F1EDEC42BBF56C50108D0BF56CC010ED1CD2BBF56D404BF56D50382
:200F8200BF56DC04BF56DD02BF56E404BF56E505BF56EC04BF56ED04BF56F406BF56FC053A
:200FA200BF56940609D0BF5694070AD0BF5694060BD0BF5694060CD0BF5694060DD0BF5667
:200FC2009408BF569C081F7671030002132B0D28F915BF560E120F28F22B10283E49AC2B0F
:200FE200013B90E5131A01E01F767A03381E008FBADEA9A8AC81A98AC42B008F18DFA9A82A
:20100200AC81A98A0356AC01C42B008FE8DE0156A400AC92019CA92D03E2C4000652E8642B
:20102200AC2B013B00BE0356AC01008F04D70156A400AC92019CC4C2A92D1C52F564AC2B9D
:20104200013B008F01DDA9A8AC81A98AAC92019CC42BA92D2052F664AC2B013B008F00DF47
:20106200A9A8AC81A98AC42B008F08DFA9A8AC81A98AAC92019CC42BA92D0852F064BE8B10
:2010820006001F767A032F921F7671030880026104DF00D5013B00D40356A5038076F0D8FA
:2010A200A4810156A60001DCA492C62B0852F56401DDA5920252F0641F767A032B92045273
:2010C2007761A79200D52D65013BA592A2FF008FF0D8CBFFA594A3FFA927A9A8AB81A61E75
:2010E2000356AB04A92D019BA592ACEA189A67FFA594C699A988A2FFCBFFA594189CA3FFCC
:20110200A92701DDA9A8AB81A98A0356AB04A92DA692ACEA019A66FFC498A792A554D662FD
:2011220000D5013B008FF0D803BEA9A8A581A71EA592A672A9A8A681A98A08D001DDC7923F
:201142009496A5920352EF641F767A032B92008FF8D802520460A9280003036FA928000F78
:20116200FC981F767A032F920961408FF0D8A58A0FDCC41AFF00F51A003F1F767A033192EB
:2011820005611F766303361A08001F767A032B9206521460408FF0D8A58A08DCFC1A300009
:2011A200EC1A0300FD1A00E0CD1A0030076F008FF8D8C41A0F00F41AFC01008FF0D8A483CB
:2011C20008DC01DDC51A0100F41A0700FC1A00E00600BDB2BDAABDA203E2BD0403E2BD05D8
:2011E20003E2BD060AFE1F767A0344962B9206520860449206601F7671030B920B2B0C961A
:201202001F7671030892008F1EDE013B4494A988A9A84481A98A808DC0DBC4924696449260
:2012220001F0019047964492A0FFA92D499603354896049AAC94A95BA9AAA681A98A457EBB
:20124200C44FEDFF4002008F3CD7A9A84481A98A64BE4492A672C4E2C404A9AAA681A98A35
:201262008CE62000408D10DF13E2C40044920356A9010156A10002E891340BE801E0AFE280
:20128200C10020E72000407679AF442D008F40DD1235AFE2C10110E740000156A40003E2B8
:2012A200C100407617B21F767B038CE60000AC281F0026C4013B1F767B038DE60000A6061C
:2012C2002256A60740FF240F0965A9AA4481A98A8CE6000070D013E294004492408F98DE66
:2012E200008FC0DB0356A901A71E0156A500A9A84481A98A70D0C8E29400408DE8DE21E3A0
:20130200C501A70600E70C000156A10000E72101AFE2C10620E7880102E8512B0BE8010022
:20132200407679AFAFE2C10110E74000007703E2C1004076A0B2013B008F18DF8CE60000EA
:20134200A9A84481A98A13E2C4004792E0FFA4001F767103CFE62000AFE22601407622803F
:20136200452D008F00D912350156A400407617B24588008F80DE013BA9A8A681A98ACFE67A
:201382000600C4920352066012E8060D14AD026396E5008F80DEA9A8A681A98AC492025244
:2013A200066012E8B61414AD026396E501E8A9FDCFE6300008E89927407679AF1F767B034B
:2013C200CFE6050024061660008FC0DB4588013BA9A88CE6300018D0A681A98381DEA9A8A0
:2013E200A681A98A13E295008CE62B0018D013E294031F767103013BAFE62400408DE8DE65
:20140200AFE226000356A30120E720000156A10000E70100AFE2C10020E7080002E8512B48
:201422000BE80100407679AFAFE2C10110E74000007703E2C1004076A0B2013B408F18DF27
:201442008CE60000A9A0A381A61EABBF120F68B6C63F4892A772008FC0DBA9A8A781A61EDF
:20146200A9A04681A71EAA286900C792C696A9A04481A71E4892AA72A9A8AA81A61EAA28CA
:201482006A00C792C6964892AA72A9A8AA81A98AC43F0C6F1F767A032B9201520360AFE6EE
:2014A20024001F76710303E22604008F18DFA9A84481A983A9A84681A98AC8E2C504C8E2BE
:2014C200C400008F18DFA9A8A381A98A96E604001F767B03C8E2C4002406432B96E60400FF
:2014E200E0FFEA00008FC0DBA9A84581A98AC4CC0040CDFFA959008F18DFA9A84481A98A40
:20150200C8E2C400CFE6210020E72000407679AF01E8C9F400D50CE8D1CC94E6080014AD31
:201522000B651F767103C8E21200007794E6040014AD026501D5008FBADE013B1F76710315
:20154200A9A84481412BA98A0F0E40763E8000520D61009BA1920260019B0356A8084393D8
:201562000451A818FFFEA8CA4396008F18DF013BA9A8A381A98AC8E2C400CFE6210020E757
:201582002000407679AF01E8C9F400D50CE8D1CC94E6080014AD0B651F767103C8E21200C7
:2015A200007794E6040014AD026501D5008FBADE013B1F767103A9A8412BA381A98A0F0E99
:2015C20040763E8000520D61009BA1920260019B0356A80843930451A818FFFEA8CA4396CD
:2015E2001F767A032B9206526660479264604588008FC0DB013BA9A8A681A98A30D0C8E2D7
:201602009400007794E6050014AD0D65009BA1920260019B0356A80843932051A818FFFE32
:20162200A8CA4396008F80DEA9A8A681A98AC49203522860008FC0DBA9A8A681A98A48D0A5
:20164200412BC8E2940000D594E6050014AD026301D5008F36DF1F767103A9A84981A98A93
:201662000F0E40763E8000520D61009BA1920260019B0356A80843930851A818FFFEA8CAE4
:2016820043964588008F80DE013BA9A8A681A98AC49202521060008FC0DBA9A8A681A98ADF
:2016A20048D0C8E29400007794E6050014AD0365431A1000AD5C459283DCA45C40760080D1
:2016C2000E6F008FC0DBA9A8A681A983A9A8A681A98AC52B18D0C51A0080942B8AFEAFE203
:2016E200BE06AFE2BE05AFE2BE04BE82BE86BE8B06001B76F0FF00E2BD0030E60006422904
:2017020016562576006F1B76F0FF00E2BD0030E6000602FE422916561F76330038924196D6
:2017220023760008267600003892382B2128FFFF1029103B419238962576006F1B76F0FF47
:2017420000E2BD0030E6000602FE422916561F7633003892419623760008267600003818FF
:2017620090002128FFFF1029103B419238962576006F1B76F0FF00E2BD0030E6000602FE26
:20178200422916561F763300389241962376000826760000381890002128FFFF1029103B1F
:2017A200419238962576006F1B76F0FF00E2BD0030E6000602FE422916561F7633003892D8
:2017C2004196237600082676000038189C002128FFFF1029103B419238962576006F1B7600
:2017E200F0FF00E2BD0030E6000602FE422916561F763300389241962376000826760000C0
:2018020038189E002128FFFF1029103B419238962576006F1B76F0FF00E2BD0030E6000627
:2018220002FE422916561F7633002292419623760101221868002128FFFF1029103B4192A1
:2018420022962576006F1B76F0FF00E2BD0030E6000602FE422916561F763300229241965F
:20186200237601012292222B2128FFFF1029103B419222962576006F1B76F0FF00E2BD004B
:2018820030E6000602FE422916561F763300229241962376010026760101221878002128CD
:2018A200FFFF1029103B419222962576006F1B76F0FF00E2BD0030E60006422916561029C4
:2018C2002576006F1B76F0FF00E2BD0030E600064229165610292576006F1B76F0FF00E245
:2018E200BD0030E600064229165610292576006F1B76F0FF00E2BD0030E6000642291656E1
:2019020010292576006F1B76F0FF00E2BD0030E600064229165610292576006F1B76F0FFAD
:2019220000E2BD0030E600064229165610292576006F1B76F0FF00E2BD0030E6000642292A
:20194200165610292576006F1B76F0FF00E2BD0030E600064229165610292576006F1B76F0
:20196200F0FF00E2BD0030E600064229165610292576006F1B76F0FF00E2BD0030E6000666
:201982004229165610292576006F1B76F0FF00E2BD0030E600064229165610292576006FD6
:2019A2001B76F0FF00E2BD0030E600064229165610292576006F1B76F0FF00E2BD0030E69B
:2019C200000602FE422916561F7633002292419623760100267601012292222B2128FFFF55
:2019E2001029103B419222962576006F1B76F0FF00E2BD0030E6000602FE422916561F7625
:201A020033002C92419623762000267639012C922C2B2128FFFF1029103B41922C9625765D
:201A2200006F1B76F0FF00E2BD0030E6000602FE422916561F7633002C924196237620000D
:201A4200267639012C1832002128FFFF1029103B41922C962576006F1B76F0FF00E2BD00AF
:201A620030E6000602FE422916561F7633002292419623760100267601012218F80021286B
:201A8200FFFF1029103B419222962576006F1B76F0FF00E2BD0030E6000602FE422916561B
:201AA2001F7633002292419623760100267601012218FA002128FFFF1029103B419222960F
:201AC2002576006F1B76F0FF00E2BD0030E6000602FE422916561F763300309241962376EE
:201AE200800026760000301803002128FFFF1029103B419230962576006F1B76F0FF00E2AD
:201B0200BD0030E6000602FE422916561F76330032924196237600012676000132187500BA
:201B22002128FFFF1029103B419232962576006F1B76F0FF00E2BD0030E6000602FE42298D
:201B420016561F7633003292419623760001267600013218FD002128FFFF1029103B419298
:201B620032962576006F1B76F0FF00E2BD0030E6000602FE422916561F763300309241961E
:201B820023768000267600002C1823002128FFFF1029103B419230962576006F1B76F0FF39
:201BA20000E2BD0030E6000602FE422916561F7633003292419623760001267600013218AD
:201BC20071002128FFFF1029103B419232962576006F1B76F0FF00E2BD0030E6000602FEE7
:201BE200422916561F7633003292419623760001267600013292322B2128FFFF1029103B86
:201C0200419232962576006F1B76F0FF00E2BD0030E6000642291656237639011029257664
:201C2200006F1B76F0FF00E2BD0030E60006422916562576006F1B76F0FF00E2BD0030E6E2
:201C420000064229165610292576006F1B76F0FF00E2BD0030E6000602FE422916561F76BB
:201C620033002C92419623762000267639012C1837002128FFFF1029103B41922C96257695
:201C8200006F1B76F0FF00E2BD0030E6000602FE422916561F7633002C92419623762000AB
:201CA200267639012C922C2B2128FFFF1029103B41922C962576006F1B76F0FF00E2BD00AE
:201CC20030E6000602FE422916561F7633002C92419623762000267639012C183300212863
:201CE200FFFF1029103B41922C962576006F1B76F0FF00E2BD0030E6000602FE42291656AF
:201D02001F7633002C92419623762000267639012C1822002128FFFF1029103B41922C960F
:201D22002576006F1B76F0FF00E2BD0030E6000602FE422916561F76330038924196237683
:201D420000082676000038189F002128FFFF1029103B419238962576006F1B76F0FF00E216
:201D6200BD0030E6000602FE422916561F7633003892419623760008267600003892382BDE
:201D82002128FFFF1029103B419238962576006F1B76F0FF00E2BD0030E6000642291656B9
:201DA2002576006F1B76F0FF00E2BD0030E60006422916562376390110292576006F1B765E
:201DC200F0FF00E2BD0030E60006422916562376391110292576006F1B76F0FF00E2BD003B
:201DE20030E600064229165610292576006F1B76F0FF00E2BD0030E6000602FE4229165699
:201E02001F763300309241962376800026760000301801002128FFFF1029103B41923096FD
:201E22002576006F1B76F0FF00E2BD0030E6000602FE422916561F7633003092419623768A
:201E42008000267600002C922C2B2128FFFF1029103B419230962576006F1B76F0FF00E27F
:201E6200BD0030E6000602FE422916561F7633002A92419623761000267610012A922A2BEE
:201E82002128FFFF1029103B41922A962576006F1B76F0FF00E2BD0030E6000602FE422932
:201EA20016561F7633002A92419623761000267610012A1802002128FFFF1029103B419221
:201EC2002A962576006F1B76F0FF00E2BD0030E6000602FE422916561F76330024924196CF
:201EE200237602002676000024181F002128FFFF1029103B419224962576006F1B76F0FF6C
:201F020000E2BD0030E6000602FE422916561F763300269241962376040026763D012692A7
:201F2200262B2128FFFF1029103B419226962576006F1B76F0FF00E2BD0030E6000602FEAF
:201F4200422916561F76330024924196237602002676000024180F002128FFFF1029103B06
:201F6200419224962576006F1B76F0FF00E2BD0030E6000602FE422916561F763300269236
:201F820041962376040026763D01261826002128FFFF1029103B419226962576006F1B7698
:201FA200F0FF00E2BD0030E6000602FE422916561F76330024924196237602002676000012
:201FC2002492242B2128FFFF1029103B419224962576006F1B76F0FF00E2BD0030E600065D
:201FE20002FE422916561F763300269241962376040026763D01261826002128FFFF102956
:20200200103B419226962576006F1B76F0FF00E2BD0030E6000602FE422916561F76330000
:20202200249241962376020026760000241808002128FFFF1029103B419224962576006F34
:202042001B76F0FF00E2BD0030E6000602FE422916561F76330026924196237604002676DC
:202062003D012692262B2128FFFF1029103B419226962576006F1B76F0FF00E2BD0030E67E
:20208200000602FE422916561F76330024924196237602002676000024180C002128FFFF46
:2020A2001029103B419224962576006F1B76F0FF00E2BD0030E6000602FE422916561F765C
:2020C2003300269241962376040026763D012692262B2128FFFF1029103B419226962576C7
:2020E200006F1B76F0FF00E2BD0030E6000602FE422916561F76330024924196237602006D
:202102002676000024180E002128FFFF1029103B419224962576006F1B76F0FF00E2BD0056
:2021220030E6000602FE422916561F763300269241962376040026763D0126183E00212817
:20214200FFFF1029103B419226962576006F1B76F0FF00E2BD0030E6000642291656102917
:202162002576006F1B76F0FF00E2BD0030E6000602FE422916561F7633002892419623764F
:2021820008002676080128180F002128FFFF1029103B419228962576006F1B76F0FF00E279
:2021A200BD0030E6000602FE422916561F76330028924196237608002676080128180F007F
:2021C2002128FFFF1029103B419228962576006F1B76F0FF00E2BD0030E6000602FE4229F1
:2021E20016561F763300289241962376080026760801281803002128FFFF1029103B4192F1
:2022020028962576006F1B76F0FF00E2BD0030E6000602FE422916561F7633002892419689
:202222002376080026760801281803002128FFFF1029103B419228962576006F1B76F0FF2D
:2022420000E2BD0030E6000602FE422916561F7633002A924196237608002676080128928F
:20226200282B2128FFFF1029103B419228962576006F1B76F0FF00E2BD0030E6000602FE68
:20228200422916561F763300289241962376080026760801281802002128FFFF1029103BB9
:2022A200419228962576006F1B76F0FF00E2BD0030E6000602FE422916561F7633003292E3
:2022C20041962376000126760001321875002128FFFF1029103B419232962576006F1B762E
:2022E200F0FF00E2BD0030E6000602FE422916561F763300329241962376000126760001C1
:202302003292322B2128FFFF1029103B419232962576006F1B76F0FF00E2BD0030E60006EF
:2023220002FE422916561F763300329241962376000126760001321831002128FFFF10292F
:20234200103B419232962576006F1B76F0FF00E2BD0030E6000602FE422916561F763300B1
:202362003292419623760001267600013292322B2128FFFF1029103B419232962576006FF8
:202382001B76F0FF00E2BD0030E6000602FE422916561F7633002E92419623764000267655
:2023A20000002E922E2B2128FFFF1029103B41922E962576006F1B76F0FF00E2BD0030E661
:2023C200000602FE422916561F7633002E92419623764000267600002E1828002128FFFF95
:2023E2001029103B41922E962576006F1B76F0FF00E2BD0030E6000602FE422916561F760F
:2024020033002E92419623764000267600002E1820002128FFFF1029103B41922E96257618
:20242200006F1B76F0FF00E2BD0030E6000602FE422916561F7633002E92419623764000E1
:20244200267600002E1838002128FFFF1029103B41922E962576006F1B76F0FF00E2BD00D5
:2024620030E6000602FE422916561F7633002E92419623764000267600002E1838002128CC
:20248200FFFF1029103B41922E962576006F1B76F0FF00E2BD0030E6000602FE4229165605
:2024A2001F7633002E92419623764000267600002E183E002128FFFF1029103B41922E9660
:2024C2002576006F1B76F0FF00E2BD0030E60006422916562376390110292576006F1B7637
:2024E200F0FF00E2BD0030E6000602FE422916561F763300229241962376010026760101CE
:20250200221848002128FFFF1029103B419222962576006F22761F767A0316D0008F806FC9
:20252200349294CDFCFF03901F76BE0118D0A8CA16961F767A03359294CDFCFF03901F762D
:20254200BE011AD0A8CA18961F767A033692019094CDFEFF1F76BE01A8CA1BD01A961F76F1
:202562007A03379201901F76BE0194CDFEFFA8CA1B961A7669FF060016D0008F806F1F76B6
:202582007A039492039018D03496949203901AD03596949201901BD03696949201903796F1
:2025A20022761F76BE011618FCFF1818FCFF1A1A01001B1A01001A7669FF0600A9881F76AA
:2025C2007A032B9200D4003102521860A640036D008F0008A641056DA9A8A91A0002A98A5F
:2025E200A642046DA9A88050A98AA643046DA9A80850A98A1F76BF0102A81F767A032B9228
:2026020003524960A69205601F76BF01041A0008015205601F76BF01041A000202520560BC
:202622001F76BF01041A8000035205601F76BF01041A0800045205601F76BF01041A020040
:20264200055205601F76BF01041A0001065205601F76BF01041A4000075205601F76BF01C5
:20266200041A0100085205601F76BF01051A0008095205601F76BF01051A00010A52056008
:202682001F76BF010D1A20000B5205601F76BF010D1A04001F767A032B9201521F60A640D3
:2026A200056DA9A8A81A0008A98AA641056DA9A8A81A0001A98AA642056DA9A8A81A000249
:2026C200A98AA643036DAA1A0200A644036DAA1A10001F76BF0104A80CA906001F767A03AA
:2026E2002B9202520660008F880A1F76BF0104A8015209602FFF00161F76BF01128F000049
:20270200021E0AA81F767A032B9203520B60A928CB0BA82800091F76BF01248F0000021EAE
:202722000AA8060022761F76BE01408F806F061800000F8F00F0A5C4071800FF08183F00A3
:20274200091800FF1BDD0BDE1606A918C0FF161EA9A818C0A89219C0C618EFFF0B18DFFF9D
:202762000B18BFFFC518F7FF1A76008FC06F1F767A03BF562A0109D0CC92C4FF01F0019087
:202782002A721F76BF010192C3FF1F767A0301F0019080FF2A721F76BF010192C5FF1F7601
:2027A2007A0301F0019081FF2A729492C2FF01F0019082FF2A942A96035203610452036022
:2027C200BF562B010152036102520360BF562B030552036106520360BF562B06075203608D
:2027E200BF562B0208520360BF562B04095213612B920152036106520360BF562F010252FD
:20280200036103520360BF562D010152066105520461056FBF562B05BF562C012B920152D6
:20282200036103520360BF562E0202520360BF562E01045217610152BF5630010360BF565B
:20284200310203520A610152086106520B601F76BF01021A80000A6F1F76BF010B1A001010
:20286200056F1F76BF010D1A001006520E6103520961015204610D1A0080096F0B1A008054
:20288200066F0B1A0040036F021A800006520B6104520961025204610B1A0004066F0B1A4E
:2028A2000040036F021A000206520661045204610B1A0020036F021A0800227604520A6297
:2028C20004522461015240610252346103522661446F0552116106524060088F8A021F7636
:2028E200BE01059AA82801FC0AA81A1E1F76BF01021A0800326F088F00001F76BE01049A1E
:20290200A82801BC0AA81A1E286F088F49031F76BE0105020AA81A1E206FA928CB0BA82879
:2029220008091F76BE010A1E059AA828257C1A1E146F088F8A0B1F76BE01059AA82801F855
:202942000AA81A1E0A6F2FFF10161F76BE010A1E059AA82813BC1A1E1A7669FF0600BDB25F
:20296200BDAABDA202FE1F767A032B9200D200D3025232601F76BF0116D0008FC0DB099235
:20298200C1FF94CDFEFF01F016D116D00190A8CAA9CDFDFF949616D0099203F01F766F033F
:2029A2000290A8CA9C9600CDFFF39492039089FFA8CA00961F76BF010040036C0102A986A1
:2029C2000042026C02DA004A026C04DA0044026C08DA10D0947A1F767A032B92015231609E
:2029E200408DC0DBA18A1F76BF01A183012916DCC418FDFF16DD0992C3FFA18A03F00290D5
:202A0200C59816DCC418FBFF0992412B008FB2DEC1FF01F00190A95D20FFFFFF40763E8090
:202A22000356A902A18A1F766F0316D0079016DCC49800CDFFE79192069089FFA8CA009697
:202A42001F767A032B9204525B60408DC0DBA18A1F76BF0116DCC418FEFF01CC0004C9FF48
:202A6200412BA95D008FB2DE20FFE80340763E8016D91F76BF010190C198014B026C01DA82
:202A82000148026C02DA0945026C04DA0942026C08DA014A026C10DA0147026C20DA0944CC
:202AA200026C40DA0044046CA9AA8009A9860149056CA9AA18FF0100A9860941056CA9AA6A
:202AC20019FF0100A986004B056CA9AA1AFF0100A9860045056CA9AA1BFF0100A9860940B8
:202AE200056CA9AA1CFF0100A986004A056CA9AA1DFF0100A98610D0008FC0DB947A1F76BE
:202B02007A032B92065210601F76BF010046026D01DA0048026D02DA004B026D04DA10D0C1
:202B2200008FC0DB947A1F767A032B920552E0FF89001F76BF010945036D01DA026F10DB83
:202B42000944036D02DA026F40DB0042036D04DA056FA9A21CFF0100A9820044036D08DA22
:202B6200056FA9A21DFF0100A9820046036D10DA056FA9A21EFF0100A9820040036D20DAFA
:202B8200056FA9A21FFF0100A9820048036D40DA056FA9A21FFF0200A982004A056DA9AA3F
:202BA2008009A986056FA9A21FFF0400A9820043066DA9AA18FF0100A986056FA9A21FFF22
:202BC2000800A9820045066DA9AA19FF0100A986056FA9A21FFF1000A9820047066DA9AA48
:202BE2001AFF0100A986056FA9A21FFF2000A9820041066DA9AA1BFF0100A986056FA9A252
:202C02001FFF4000A982004B066DA9AA1CFF0100A986056FA9A21FFF8000A9820049066D89
:202C2200A9AA1DFF0100A986056FA9A21FFF0001A9821F767A0310D0008FC0DB38A2947AE6
:202C4200008FC06FCC92013B1F76BF01C4FF01F0019009D0A985A9860192C3FF01F0019073
:202C620080FFA9850156A2000192C5FF01F0019081FFA9850156A2009492C2FF01F00190C3
:202C820082FFA9850156A20017D0008FC0DB82FE947ABE82BE86BE8B060006000052A88890
:202CA200C48A096509520763FF9CC4CDF8FF0790A8CAC496A69245520D614E5208614F5224
:202CC2000D60C41A2000C418BFFF086FC418DFFF056FC41A2000C41A4000A592015203603F
:202CE200C4187FFF02520360C41A8000C418EFFFC418F7FF0600BDB200D5013B008FC0DD15
:202D0200A9A8A581A98AC47D01DDA5924652F76433D1008FC0DD34D0BF569C0CBF56940C18
:202D22001F76400335D03BD1BF56940836D0BF56940937D0BF56941038D0BF56940839D0BD
:202D4200BF56940C3AD0BF56940C3DD0BF569C053CD10092FE9C949641D00092FF9C94966F
:202D62003ED0BF56940810D0BF56DC08BF56E465BF56F408BF56940DBF56EC1BBF569C12B5
:202D8200BE8B0600A9BD120F00770077BDB21F7671038BE60100A48B50E8094088E23C002D
:202DA200407679AF88E6000000770077A9BF120FC18AA993B7FFFF91D497C18AFF90DC96CA
:202DC200BE8B06000852A927A4C50960089A01D54E9B4076BB93008D3B03972BAB9209521C
:202DE2000B60089AA78A01D54E9B4076BB93008D3B03BF5697010600A71EBDB2A492BDAA81
:202E02000152BDA22A60008F5070C08D40D01F76410300A822761F76BE01408F28AE09CDE0
:202E2200FFF7A81A0004008FE3AD099709CDFFFD1F763700A81A000100A01F76BE01099720
:202E42001F76370002A81F763300321A0100321A0200237600011A7602523360008F507730
:202E6200C08DC0D31F764F0300A82276408F806F1F76BE01FDCDFFEF80769EADA58AA81A4D
:202E82000020079716DD07CDFF3F1ADCA81A008007971F763700C518CFFF408F59ADC41A6D
:202EA200040004C21F763300321A04001F76370006A01F763300321A0800237600011A7676
:202EC200D396A38A01D54E9B69FF089AC3864076BB93A2C4A2830BD0A28A0CDE0CDDC61AFF
:202EE20000400ADCC518FFDFCA18BFFFCA18DFFFCA18F7FFCA18FBFFCA1A0200CA1A010010
:202F0200C418FFBF92CCE0FF0BD0015092964076E893A38AA70640762F94D39202520560E2
:202F22001F76BF01081A0400C38A099ABF56E402A38A40764F94408D33030CD0932BA28A9A
:202F4200008D9E01932B9B2B0BDCC41A4000CA1A2000BE82BE86BE8B06001F764103BF56F5
:202F620002011F764F03BF5602021F764003009606000002008D4203941E0600BDB2BDAA76
:202F8200A486008D3A0392923660A9AA13FF6700A98A008D360301020156C4009206008D79
:202FA2003803920F0466C28ABF56E40208D092C5A7C408D0090201DE92C2C207A98A008D49
:202FC2003603C792C4969206008D3803920F4966C28AE446FE6CA28A099A40764F94D292A7
:202FE200025205601F76BF01081A0400008D9E01922B376F008D3803928A408D3803A492EA
:20300200008D36030190A98801DC9AA89206008D3803920F0466C28ABF56E402A6920B60B2
:2030220008D092830902C207A98AC592A7FFFF90C4960D6F08D09283A5C408D0090201DE20
:2030420092C2C207A98AC592FF90C496008D36039206008D3803920F0466C28AE446FE6CCD
:203062001F763300211A0001BE86BE8B0600BDB200BEACA0BDAAA486BDA2A98201DEA61B83
:203082003075FD69D292025205601F76BF010818FBFF00BE01DEA61B1027FD69408D360396
:2030A200A9AB08D09AA20109921E008D3A03922BC28AE446FE6CA28A089A40764F9401BE5F
:2030C200008D38030102A30F92C21C68A7AB0902C207A98AC792C496C28AE446FE6C00BEEF
:2030E20001DEA61BE803FD69A28A099A40764F94D292025210601F76BF01009A081A040038
:203102000B6FC28A0902A7ABBF56E401C207A98AC792C496009ABE82BE86BE8B0600BDB205
:20312200BDAAA486EFFF3901C28AFCCCFF00A958EC47EDFF2C01408DA0019A92E0FF2D01CD
:20314200408D3B039A920152116000BE408D3D03BF569A01408D34039AC2408D3F039A2BC3
:20316200408D3E039A2B0DD19A2B408D3F039A92E0FF1301408D3D039A924F60F2C4208F5C
:203182000000A9A8A60F06662F8F0000A9A8A60F0867608F00000AD1208F0000F2A09AA83B
:2031A2000CD19A923A52E0FFF800408DA0019A922E60408D34039AC4A692A94001DE9AC2BB
:2031C200066DF28A0356A008C496076FF28AA9A80109F21EA092C498008D34039206E20F6B
:2031E200E8FFDB000FD10CD0BF569A33A28A099ABF56923340764F94408D3F03008DA001EE
:20320200BF569A01BF569201EFFFC700008D3F03BF569201EFFFC100408D3E039A923E60A1
:20322200A0921F760403115425611F767C032454036024921F60A088408D31039A0EA60F29
:203242000560408D33039A921560A0921F767C032354076023920561408D33039A920A618A
:20326200408D3F03008D3D03BF569A01922BEFFF9400408D32039A78408D3E039A80019AAA
:20328200013BA7949A96A9AAA781A98A0ED1089A9C78A28A40764F947F6F9A80019A013B9E
:2032A200A7949A96A9AAA781A98A0ED19C78408D3E039A9207520E600DD19A9210520A6029
:2032C200408D33039A9206600A9A1F767703A0941096408D3E039A9203520B600DD19A59FF
:2032E200A19204520660059A008FC0DDA0949C96408D3E039A9202521A60A0920DD103523F
:203302009A78336842523166008FC0DD949203522C68A09233520B600CD19A923A5225605C
:20332200A09233520460008D3D03922B0DD09258408D3E03008FC0DD9A9294540467A91BA2
:2033420090012A68A28A099A40764F94408D3D039A2B0DD0408D3F03BF569A01408DA00104
:20336200BF569A01922B186FA28A099A40764F94408D3E039A2B0DD0408D3D03BF569A0182
:20338200408D3F039A2B922B076FC28ACC18DFFFC28ACC1A2000C28AEC46EDFFC7FE1F7600
:2033A20033000BDC211A0001C41A4000BE86BE8B0600BDB2BDAAA486A61EBDA2A582D29256
:2033C200025205601F76BF010818FBFF408D360308D09AC292A2008D3A03BF569201C28A97
:2033E200E446FE6CA28A089A40764F94008D38030102921EC28300BE0902BF56E501C20783
:20340200A98AC392A7FFFF90C496A692BE82BE86BE8B06000600A983C57C0600BDB2BDAA39
:20342200BDA206FE1F767B03A482BF5634010EDCEC92FF90A95AE492FF90A988A9AA37FFEB
:20344200A6AFA986DC92FF90A988A9AA37FFA6AFA986D492FF90A98809D0A9AA37FFA6AFCE
:20346200A9869492FF9008D0A9599492FF90A988A9B237FFA6AFA98BFC92FF90A988008DB1
:203482003203A9B237FFA6AFA98BF492FF90A988408FFFFFA9B237FFA6AFA98BA9A210FF54
:2034A200A101A71E441EA98A9392C7960202BF56CC3440762BB0A90E461EA28A465DA9B29D
:2034C200407601B0419644830102A38A4076A49544830102A38ABF56C5344076A4954192FF
:2034E200A90E461EC38AE446FE6CA9B2A38AA28340764697C38AE446FE6CA9A210FFA101B1
:20350200A983A38A4692A993FF91A7FFFF90C597CD960602D52BDD2B4076A49586FEBE82F5
:20352200BE86BE8B060006000600A98AC4920600A988BDB21F767103A9A8008D3203A48B70
:20354200BF560101BDAA10FFA101408FFFFFA71EA986A98A9193C7970202CF7E40762BB0E2
:20356200A9CDFF00A283A7FFFF90A18AD597DD960602E52BED2B4076A495BE86BE8B0600BE
:20358200BDB202FEA48B0EDCEC92FF90A980E492FF90A988A70637FFA6AFA71EDC92FF903B
:2035A200A9880129A70637FFA6AFA71ED492FF90A988412BA70637FFA6AFA71EFC92FF9005
:2035C200A9934196F492A838419620FF0080A70F0666A706415C40767897086FAD5CA79210
:2035E200029B81DCA45C40765B9E399AA18A4076059882FEBE8B0600BDB2BDAA02FE1F7695
:203602007103A486BF5601010EDCEC92FF90A980E492FF90A988A70637FFA6AFA71EDC9232
:20362200FF90A988A70637FFA6AFA71ED492FF90A988A70637FFA6AFA71E012920FF0080DF
:20364200A70F0666A706407602984196086FAD5CA792029B81DCA45C40769E9EA9AA008DED
:20366200320310FFA1011F767803A71EA98BA98A9292408FFFFFC796BF56CF384192FF905A
:20368200D7964192A7FFFF90DF961892A9CDFF00A7FFFF90E197E996060240762BB0A9CDE4
:2036A200FF0009D0A7FFA183A28AFF9008D1F597FD960A029D2B952B4076A49582FEBE866C
:2036C200BE8B060002FEA61EAC281F00013B2256A60740FF0156A400C492A640036CFF900D
:2036E200036FA7FFFF9082FE0600BDB2A48BBDAAE1C50AD09183A706A58A02194076CF98EE
:20370200A927A706A58A01194076CF98A1C5008D3203408FFFFF0EDF0356A908AB94A95A96
:20372200A78A9192C7960202BF56CF3340762BB00AD0A95DE106918A0219407601B0A98895
:20374200A20EA60F1061008D3C03912BD192025205601F76BF01081A0400A18A099A4076EE
:203762004F94096FA18A339A40760598008D3C03BF569101BE86BE8B0600A4830EDDED920A
:20378200FF90A980E592FF90A988A70637FFA6AFA71EDD92FF90A988A70637FFA6AFA71E0F
:2037A200D592FF90A98809D0A70637FFA6AFA71E9592FF9008D0A90EE41E9592FF90A988DC
:2037C200E40637FFA6AFE41EFD92FF90A988E40637FFA6AFE41EF592FF90A988E40637FF43
:2037E200A6AFE41E02020156E4000AD01F767B033A9AF4C394C3BF563401407605980600BF
:203802000600BDB2BDAABDA2A482008DA00193923D61408DA0010FD09B2B935A008FC0DD28
:20382200013BA9A8A281A98AC49203523268A91B90012F66A29233521A61008FC0DDA9A8C3
:20384200A281A98AC458A059408FFFFFA38A82D981D8A1880EDC035694089CCAA959A60631
:2038620040762BB0A188A90EA60F05600CD0A292937A1C6FD392025205601F76BF01081A7E
:203882000400A38A099A40764F94A928FFFF0E6FD392025205601F76BF01081A0400A38AA7
:2038A200099A40764F94A928FFFFBE82BE86BE8B0600BDB206FEA48B0EDCEC92FF90A90ED8
:2038C200421EE492FF90A988420637FFA6AF421EDC92FF90A988420637FFA6AF421ED49256
:2038E200FF90A98809D0420637FFA6AF421E9492FF9008D0A90E441E9492FF90A988440624
:2039020037FFA6AF441EFC92FF90A988440637FFA6AF441EF492FF90A9880DD0440637FF90
:20392200A6AF441E9492FF900CD0A90E461E9492FF90A9880BD0460637FFA6AF461E949200
:20394200FF90A9880AD0460637FFA6AF461E9492FF90A9880ED0460637FFA6AF461E94CC31
:20396200FF0004520A61055212604206448A46C4A69340769E9E076F4206448A46C4A693A2
:2039820040765B9E3C9AA18A4076059886FEBE8B0600BDB2A9A8BDAA10FFA101A98BA48619
:2039A200408FFFFFA98ABF56C1100602BF56C904D12BD92BE12BBF56E93040762BB0A9CDF4
:2039C200FF00008D9E01A7FFFF90F197A28AA183F9960802BF5692014076A495BE86BE8BF0
:2039E2000600BDB200BE00D0408FC0DBAA2B008F80DCA9A8A00DA98A9580C427A70EAB0FF8
:203A02000361C47F01BE01D8A0928052F168A6921061408D80DC809AA18A40763CB080D0FF
:203A2200A82802019196A18AA9287E3F40765B9EBE8B0600BDB200BE008DA101A9A8A60D73
:203A4200A71EA9A8A60DA98301DE0EDFC7929596A6920852F468A483408D9E010EDD03565A
:203A6200E508DD58EDCAA988A9A8408FC0DB10FFA101957EA983BF569C010A024076A495E2
:203A8200BE8B0600BDB2BDAABDA202FEA4860EDC0356E408DC2FECCAA927A9AA10FFA101B2
:203AA200A71E00D51F767C032492C7960356AB01BF56CF03D796AB922061A588AA92A672AB
:203AC200008FC0DB03D1A9A8A60DA98A0356A501A980A9AA10FFA101A61EA792A17204D09F
:203AE200C492C7FF9E96A792A07201DDC492FF909696AB92A554E2660356AB014196A993A4
:203B0200039A408FFFFFA894A959A9AA10FFA101A982A98AA10E40762BB0A9CDFF0004D010
:203B2200A7FF9B974193A073FF90AB280500089B9396AB9241944195A958069A4194A9800A
:203B4200079A4194932BA758A859932BA958A28AA383A10E932B008D9E019B2BBF56920117
:203B62004076A49582FEBE82BE86BE8B0600BDB2AC2BAB280800807608DF0C3505D106D016
:203B8200A483A172A072A9800EDD03569D089594AC5807D19696AB92A794A958A793A173CD
:203BA200009B95929DCA00520261019BAC92AC58408F00DF019C0852A92D9597DF68BE8B10
:203BC2000600BDB210FEAD5C89DCA45DAD5CC07600C18FDCA45C08F6852400D0C07609C10F
:203BE20005F68424008FC0DB942B01D8A0928052FC68A4C51F767A032A921F767A037EDF50
:203C0200C7962B920452086160D162D0BF569C0ABF569408116F1F76700300D0BF5620026B
:203C2200AD5C8FDCA45C9492008F22DC949601D8A0920652F66861D0008FC0DB1F767A0303
:203C4200BF5694653192046163D0BF5694141F767A0330921B611F767A032A882A92085212
:203C620081DE03652A8882DE00D00129008F34DC0356A603C07640DEA00D0156A700C79276
:203C8200949601D8A0920852F4681F767A032B9201521A601F767A033188012920FFF2FF96
:203CA20000D0A60F1161008FC0DBA9A8A00DA98A30D101D8BF569C4648D1BF569C3C319216
:203CC2000E9CA054F1661F767A032B920252216000D0008FC0DBA9A8A00DA98A01D830D144
:203CE200A092BF569CAA065248D1BF569C96F26806D0008FC0DBA9A8A00DA98A01D830D118
:203D0200A092BF569C73085248D1BF569C69F2681F767A032B920352116000D0008FC0DBD5
:203D2200A9A8A00DA98A01D830D1A092BF569C46145248D1BF569C3CF2681F767A032A92B9
:203D420009521B6000D0013BAD5C89DCA480008F80DEA7069481A71E008F08DCC792949683
:203D620001D8A0920F52F1683DD1008FC0DB3ED0BF569C46BF5694461F767A032B92065229
:203D82002B60008FC0DB30D032D19428A401A4C531D09428A40133D09C2884037ADF4BD17A
:203DA2009428840348D094282C0149D094282C014AD0942820039C282003C792A4C56ED0DB
:203DC20051D194967BDF6FD0C792949650D0BF569406BF569C101F767A032F920A6100D0DB
:203DE200008F30DC9428000801D8A0920452FB684076D88390FEBE8B0600BDB2408D80DC18
:203E0200A9287E3FA8280201A18A40769E9E809AA18A40763CB0A98080D0A988910EA70F3C
:203E22000E60A688012920FFFFFFA60F08611F767A032A887ED0910EA60F156140764E9B04
:203E4200408DC0DB7FD0912B40765E9A1F767A032E9217617FD91F767103C11A1000112870
:203E6200FFFF0F6F00D0008F80DC9492008FC0DB949601D8A0928052F7681F7670033F2BE1
:203E8200BE8B0600C4A0D41A01000600C4A0D41A02000600D493009A039100530260019A39
:203EA20006001F76BF010118F7FF06001F76BF01011A08000600227608D0408F806F1F764F
:203EC200BE0195CCFCFF015008960BDD08CCF7FF0450089608CCDFFF1050089608183FFF24
:203EE2001F76BF01C51A08000118F7FF1A761F76C10169FF0002BF560007BF56011F022BA6
:203F0200BF56040D0A2800800B2B0C2BBF560F10D42BC41E001A800006001F7676032588EA
:203F2200BDB2A48BA6921352E6FF5801C07612C10129A7060456A601A71EC7C52076C18AF3
:203F4200260ED40F0561BF562511EFFF470108D091C5673E1F767603252B262BD118F7FF00
:203F6200D118FDFFEFFF3A011F76C1010246ECFF3501C18A1F767603260EC407A71E1F76BF
:203F8200C10107921F767603C796BF562513260AEFFF24011F76C1010246ECFF1F01079286
:203FA2001F767603BF5625112796EFFF17011F76C1010246ECFF120107921F767603BF568A
:203FC200250F2796EFFF0A011F76C1010246ECFF050108D091C5673E1F76C10107400B6D7C
:203FE200D118FBFF1F767603D118FEFF252B262BEFFFF4001F767603BF562509EFFFEE0038
:204002001F76C1010246ECFFE90007921F767603BF56250B2796EFFFE1001F76C101024614
:20402200ECFFDC0007881F767603277EC18A260ED40F0561BF562507EFFFD00008D091C580
:20404200673E1F767603BF562509EFFFC7001F76C1010246ECFFC20007921F767603BF56AB
:2040620025072796EFFFBA001F76C1010246ECFFB50007921F767603BF5625052796EFFFDD
:20408200AD001F76C1010246ECFFA800079208D01F767603279691C5673E1F767603BF56E5
:2040A2002503EFFF9B00D140086CBF5625010AD0D11A040091C5673ED141ECFF8F001F76A8
:2040C20076030AD0BF56250DD11A080091C5673EEFFF84001F76C101BF56008F082B021A9A
:2040E20020001F767603BF562512776F1F76C101BF56008FC18AE4920896021A20001F7633
:204102007603BF562510696F1F76C101BF56008708280003021A20001F767603BF56250E4A
:204122005C6F1F76C101082B021A20001F767603BF56250C526F0AD091C5673E1F76C101AB
:20414200BF56008708280005021A20001F767603BF56250A426F26801F76C101BF56008FAC
:20416200C18AA706C407A71EC79208961F767603260A1F76C101021A20001F767603BF56CA
:2041820025082B6F1F76C101BF56008FC18AE4920896021A20001F767603BF5625061D6FE6
:2041A2000AD091C5673E1F76C101BF56008708280002021A20001F767603BF5625040D6FFF
:2041C2001F76C101BF56008708280006021A20001F767603BF562502BE8B06001F7630001A
:2041E200A880A927A48E142820400002008FB4DD1F767803181E4076B79C0052FD61A7929D
:20420200A793C0FF0191A995A880A7922661408FA8DDAB9220BE1F90A674A792A654026717
:20422200A7881F767603A65C0356AB01283AA90E2AA82C1E008FB4DD4076AF9C4076B79CD9
:204242000052FD61A93AA60DA98EAB92A694A927A792A69EA980DE601F7630001428104063
:2042620006001F763000A880A927A48E142820400002008FB4DD1F767803181E4076B79C3A
:204282000052FD61A792A793C0FF0191A995A880A7922661408FAEDDAB9220BE1F90A67444
:2042A200A792A6540267A7881F767603A65C0356AB012E3AA90E30A8321E008FB4DD4076FF
:2042C200B39C4076B79C0052FD61A93AA60DA98EAB92A694A927A792A69EA980DE601F7647
:2042E200300014281040060002FE1F76760338C5008FB4DD673E22761F763400008FDEB1AB
:204302001CA81A7669FF4076EBB01F7671030F8F40423A0642A8C0004EB2A9BD120F00777D
:20432200007702E84116008F16DE89E6000040762AB12376002082FE060002FE22761F76D4
:204342007A032B9204520460008FCFAA036F008F4AA31F7634001AA81A760F8F40421F76A1
:20436200710369FF3A0642A8C0004EB2A9BD120F0077007702E8D123008F0EDE89E6000038
:2043820040762AB11F7630000C2820402376001082FE0600BDB2BDAABDA2407697AA00D303
:2043A200103B69FF407678B2267600002F76000040763FB340765AB14076FF901F767A0367
:2043C200009A2A93407620AC0D9A40761A95418F00C201D4A9A0407669941F767A033192BE
:2043E2000860418F00C202D4A9A040766994076F012902D420FF00E1407669944076E19E91
:2044020040762990008FC06FA48300D20BDC0CDDC51A0100C41A0100012920FF50C34076D3
:2044220049B1008FC06FA48301DAA2920EDC0FDDC51A0100C41A01000A52EF64008FC06F8A
:20444200A4830BDC0ADDC51A0100C41A01004076F78F40762AB31F767A03109B2A924076A8
:2044620056B340760A9F407697B21F767A032B920452056140760DA5407638844076AE8585
:2044820040766A9C4076D8831F767A032B920652036040764EA81F767A03C076C0DB2A9278
:2044A2007EDFC79622761F76C001BF56292F1A761F767103BF5604011F76710303927D61B6
:2044C20063D0032B008FC0DB94920E611F76740363D03D0A94923D5407663D2B008FC0D386
:2044E20069FF4076369A00D2008F32DF013B408FC0DBA9A8A281A98AA9A0A281A98360D045
:20450200C40A9592C4545566005253611F767C0332924F61408F30DFC42BA9A0A281A98AD7
:20452200C49280520868008F30DF013BA9A8A281A98AC42B013B086F109AA794A9CCF0FF75
:20454200C4968052F167008F30DFA9A8A281A98AC4800356A203408FF0D8A61EA792C3FFF8
:20456200A927A606AB0D0156A500A7CD0F00A82DC59262FFA988E161013B0A6F008F30DF33
:20458200A9A8A281A98AA692A0FFA988C40AA640F66C408D30DF013BA9B2A281A98B008FFB
:2045A200C0DB69FF009AC19340760DADC108030001DAA292025299647FD0008FC0DB94411E
:2045C200076C7FDC69FFC418FDFF40764E9B7FD0008FC0DB9442076C7FDC69FFC418FBFFD1
:2045E20040765E9A7FD0008FC0DB9443076C7FDC69FFC418F7FF40766A9C7FD0008FC0DB7E
:204602009445076C7FDC69FFC418DFFF4076538069FF40761C921F767A032B9201521360E5
:2046220016D0408FC0DB9592A58AC1FF01F016D0A3CE0356A9027FDC0790C49895CC040013
:20464200C1FFA95B2B9206525A607FD0008FC0DB94921F767403A99300B6D6FFC5FF0191FD
:204662000190A9883E92026001B6A892A7CE1B61008FC06FA4831F767A030BDDC51A004064
:204682002B9206520761045205610DDCC41A0020056F1F76BF01041A0800008FE8031F76FA
:2046A2007B0308A81F7674033F9200B63E97026001B6A693A7CF16611F767A032B931F76BE
:2046C200BF010B1A000406530661045304610B1A0020036F021A0800008FE8031F767B030B
:2046E20008A81F7674033F7E1F767B03080607601F76BF010D1A00400D1A000400D2A292CA
:204702000461408D40D0036F408DC0D3A18A40766E99A91BFFFF59611F76BF0100BE0F1AE3
:2047220001001F76780337523EC213623752326133520A6233523A610352446104523E614C
:2047420006523861426F34522D61355227613D6F3A5208623A5212613852186139521261F0
:20476200346F3B5207613C523060A18A4076C6992C6FA18A40766D99286FA18A40762A9984
:20478200246FA18A40762D98206FA18A407669981C6FA18A40760098186FA18A4076019868
:2047A200146FA18A40767B97106FA18A4076E2980C6FA18A4076879A086FA18A4076249B13
:2047C200046FA18A4076AF9A01DAA2920252E3FF75FE966F1B76F0FF0500BDABBDAABDA8C4
:2047E200BDA0BDC2BDC300E2BD0003E2BD0003E2BD0103E2BD0203E2BD0303E2BD0430E672
:20480200000602FE69FF422916561F7633002292419623760100267601012218FA00212849
:20482200FFFF10291F767B03240604610102415624001F7671030492E1FF99011F767103BD
:2048420011920D61FF9C11960A60008FC0DBA4837FDC7FDDC518EFFFC41A04001F767A03D2
:204862002F92196100D2008F0871013BA9A8A281A98AD492C3FFA988008F3CD7A9A8A281CF
:20488200A98A69FFA292C47E4076568601DAA2920452EA641F767A032B9206523A601F766A
:2048A200C4010992C3FFA90EA9BD120F0077007763D0808DC0DB8BE60400008F40D78CE640
:2048C200200069FF13E29200CFE62000407617B26ED16FD0013B008FC0DB9A92929EA98505
:2048E200A9BD160F6FD0C8E29402CFE6040020E7A00089E60900407679AF50E800C800777F
:2049020090E8008800778CE600001DD013E292001F767A032B920552436000D21F76710394
:2049220006921F767B03210A21540262212B008F0871013BA9A82181A98AC492C3FFA90E41
:20494200A9BD120F212D69FF008F40D712358BE604000156A400CFE62000407617B2013B2B
:204962001F767B03008F21DD8EE60000A9A82181A98A13E2C400008F80DEA9A82181A98A2F
:2049820001DAC4920852056121924076EE82056F2192009B40761181A2920652C0641F76FC
:2049A2007A032E92E1FFE3001F767B0320881D0EA60F1A601F767A032C931F767B03219249
:2049C20000530F611F767103055402600D9A1F767B0321931F767103059F015302600C9AD7
:2049E20069FF40764B901F767B031E92205472671F767A032E9200D26D651F767B03212DD5
:204A0200008F0871013B1F767A032E12A294A959A9A8A281A98AC492C3FFA980A7BD160F55
:204A2200A188008F21DDA9A8A681A98A8BE60C00C4E2C400007720E7000100778CE60000C4
:204A420000771F767B03A9BF120FA98556FF009B1F540267019B1F5422970767008F34DF6F
:204A6200A9A8A281A98AC40A008F88DDA9A8A181A98A009AC49300530260019A22CA246173
:204A8200A12D008F40D71235CFE6200069FF0156A400407617B21F767B03240608618EE688
:204AA200200000770077A6BF120F076F8EE6000000770077A6BF120F008F21DD013BA9A8E8
:204AC200A181A98AC47E01DA1F767A03A2922E5495641F767B031C92200A20544766202B4A
:204AE20069FF4076DB9000D21F767A032E9220651F767B03212D1F767A032E12A294009B7E
:204B0200A95940761181013BC07634DF008F88DDA706A281A71EA9A8A181A98A01DA1F7625
:204B22007A03C792C496A292C72B2E54E2641F76710305921F767B03029C210A21541662EC
:204B42001F767A03319200D21F767B03212B0E651F7671030692019BA2944076118101DA44
:204B62001F767A03A2923154F464008F0071A4831F76330019DC01DDC51A0040C41A100041
:204B8200BF562101103B419282FE2296AFE2BE04AFE2BE03AFE2BE02AFE2BE01AFE2BE00F1
:204BA20080E2BE00BEC5BEC4BE83BE8ABE86BE870300303BF1FF177602761B76F0FF0500D4
:204BC200BDABBDA8BDA0BDC2BDC300E2BD0003E2BD0003E2BD0103E2BD0203E2BD0330E667
:204BE200000602FE69FF42291656227601021F767803015610002376001026763911102994
:204C02001A767FD0008FC0DB944F046D69FF407672A91F767103020A029214520468022B54
:204C2200BF56030116D1008FC0DB7FD09C9294CA0190A9880C9301F10191A6CB10601F7612
:204C42007A032B93065306611F76BF010B1A0008146F1F76BF010B1A00200F6F1F767A0328
:204C62002B93065306611F76BF010F1A0008056F1F76BF010F1A00200653E1FF4B011F7602
:204C82007103150A15930A53E0FFA1001F767A032B931F7671030553152B03601B932260F6
:204CA2001F767A032B93015305601F7671031A9319601F767A032B9306530F6104530D61DC
:204CC200025306611F76BF010B1A0004226F1F76BF010B1A00401D6F1F76BF01021A00024E
:204CE200186F1F767A032B9306530F6104530D61025306611F76BF010D1A00040A6F1F7683
:204D0200BF010D1A0040056F1F76BF01041A00021F76710319930F601F767A032B93035337
:204D2200136101531161065319601F76BF01021A8000186F1F767A032B9303530F61015303
:204D42000D61065306611F76BF010B1A00100A6F1F76BF01041A8000056F1F76BF010D1A3D
:204D620000101F7671031A9315601F767A032B9306530B610353046101531561196F1F76BF
:204D8200BF010B1A0040226F1F76BF01021A80001D6F1F767A032B930653146103530D617C
:204DA200015306611F76BF010B1A00800F6F1F76BF010D1A00800A6F1F76BF010D1A00408D
:204DC200056F1F76BF01041A020000523E601F767103158062D0940EA70F37601F767A0327
:204DE2002B9303530F6101530D61065306611F76BF010D1A00100A6F1F76BF01021A8000B5
:204E0200056F1F76BF010B1A001006530E6103530961015304610D1A0080096F0B1A00808D
:204E2200066F0B1A0040036F021A800006530B6104530961025304610B1A0004066F0B1A85
:204E42000040036F021A00021F767103009A1C9300530260019AA693A9CF04611428F40197
:204E6200162B140AC4E214001C7E12E8D01F14AD5364160A1693019100B6142B1797169375
:204E82000791026101B6A692187F3C601F767A032A92095224611F76710316D0BF56190127
:204EA20094937FD0D0FF9492C9FFA8CAA940026C197F0C42116D0C430C6D0C44036D1A2BC3
:204EC2002B6F1892009B00520260019B1A97246F17921A96216FBF561A011E6F1F767103AE
:204EE2000C41BF561B01036C1792026F009A0C401A96036D192B106F179317921B9719962C
:204F02000B6F17931788179219971B961A7E046F69FF4076BDA882FEAFE2BE03AFE2BE0211
:204F2200AFE2BE01AFE2BE0080E2BE00BEC5BEC4BE83BE8ABE870300303BF1FF177602767A
:204F420002FE2276008F57A11F7635000AA81A7669FF4076F8B21F763300221A200023769F
:204F6200010000D5013B008F88DDA9A8A581A98AC42B008F21DDA9A8A581A98A01DDA59244
:204F8200C42B1C52F1641F767A032B9206522360008F00711F76C401D4CCF0FF05500296DD
:204FA200DCCCF0FF0350039603CC1FFF1050039603CCFFF1A91A0005039603CCFF0FA91AC6
:204FC20000400396E4CCF0FF0750049604CC0FFF205004961F767A032B9203521460008F57
:204FE20000711F76C401D4CCF0FF02500296DC18F0FF03CC1FFF1050039603CCFFF0A91A21
:20500200000203961F767A032B9201522860008F00711F76C401D4CCF0FF06500296DCCCCA
:20502200F0FF0550039603CC0FFF4050039603CCFFF7A91A0007039603CCFF0FA91A0020A3
:205042000396E4CCF0FF0350049604CC0FFF6050049604CCFFF1A91A000104961F767A03D1
:205062002B9202520960408F0071A58A02DCC418F0FFDD18F0FF2B9205524C60408F0071B8
:20508200A58A1F76C40102DCC41A0F00DDCCF0FF0250039603CC3FFF3050039603CCFFF053
:2050A200A91A0006039603CCFF0FA91A00C00396E5CCF8FF0A50049604CCBFFFB0500496CF
:2050C20004CCFFF7A91A0007049604CCFF0FA91A00400496EDCCF0FF0550059605CC1FFFA2
:2050E2001050059605CCFFFEA91A000E05960518FF0FF5CCF8FF08500696061AF00006CCC0
:20510200FFFDA91A000D069606CCFF0FA91A00900696408F0071C0760068A5C41F76C401B5
:20512200A78A1AD019DD01DEC61A000119DC011A0008C51A1000001A10000018BFFF001A7B
:20514200000F011A00401F763300BF5621011F76A001C41A000819CCFFFCA91A0004199672
:2051620097CCFFFDA91A00011A96BF56098000CC7FFCA91A0001009600CCFFE3A91A0008A2
:20518200009600CC001CC9FFA92D019A66FFA98800CC800304600102AC1E076F00CC80037B
:2051A200C6FF80FFA985AC1EA6851F7671034456A900421E3A06C0004EB2008FA60E42A8AD
:2051C200C0004EB21F767A03008F4C1D2B931F76A00105960018FCFF1F767B03025326A82B
:2051E2000C60008F8A66BF561C0FBF561D04BF561E09BF561F1426A81F767A032B920352D6
:205202000E601F767B03008FF22BBF561C0ABF561D01BF561E04BF561F1426A81F767A0392
:205222002C920E611F767B03008FF22BBF561CFABF561D19BF561E96BF561F1426A81F7696
:205242007A032B9206520660008F7C921F767B0326A805520660008FA60E1F767B0326A8F5
:205262001F767B03260682FE241E0600005206601F76BF01041A0001056F1F76BF01021A14
:2052820000010600005206601F76BF01041A4000056F1F76BF01021A400006004076A3A670
:2052A200019A4076AFA6009A4076A3A6010240765BB3009A4076AFA61E0240765BB3060057
:2052C200009A4076AFA61E0240765BB3019A4076A3A61E0240765BB3009A4076A3A61E020C
:2052E20040765BB30600BDB2BDAABDA20EFE00D2A98BA288A492A52D0252A65BE3FFF00042
:20530200A9B2026301D256FFA983AC9205640452036301D3026FAC2BAC92A58B4B2B0B65A4
:205322000A02421EA9B2C0004EB24B0AA98BAC924B54F762A9B20A650A02421EA9B2C000D4
:205342004EB201DE58FFA98BF862A292A58BA694A988026001BEA692AC944B2B0452A98822
:205362000F650A02421EA9B2C0004EB2AC80A98B4B0AA69281DFFC9CA72D4B54F362AC9245
:205382000263AC2B019A66FFA9580152026000D08076E803A9B242C2C0004EB2441EA9B28C
:2053A20042C2C0005DB2A61E6402421EA606C0004EB2461E6402421EA9B2C0005DB2A61E0A
:2053C2000A02421EA606C0004EB2481E0A02421EA9B2C0005DB24A1EA61E460648074407E5
:2053E200A607046000D0A02DAC5AA3921561039A013B4B96AD888ADEA6880356A90101566D
:20540200A600C6060960AC924B5406610F024B0BC61E4B92F062A2922061019A013B4B9684
:20542200AD5D8ADDA55D0356A9010156A5000F02C50F09614B9203520661019C04524B963C
:20544200F0640B6FAD5D8ADDA55D0ABE4B920356A9010156A500C5C2009A4B2B013BAD5D88
:205462008ADDA55D0356A9010156A5008076B0DAA606C507A61EC685C51E019A4B2D66FF60
:20548200A0CE046180020156C5004B0A4B920452E76448A3AB92AA2BFF90A927A9A9AC2844
:2054A200180037FF5AFF4A064E1E4E92FF904E964D2B4E06ABCAAACB4E1E4606009BFF909C
:2054C2003FFF5AFF4E06ABCAAACB4E1E44063B565AFF4E06ABCAAACB4E1E026F4EB2408F6B
:2054E2001EDF013BA9A0A481A98A4B2BC45BA3921052246200D14E92013B0190A9884E061B
:2055020040FF4E1EA6924076BBA601D9A1920852F364A35A00D1A293A292B0FF0190A85A58
:205522004076BBA601D9A1920652F6644076CDA601DB4B0A4B920452DB648EFEBE82BE86B7
:20554200BE8B0600009A019C1952FE640600005206601F76BF010D1A0010056F1F76BF01E3
:205562000B1A00100600BDB21F76BF01BDAA0D1A0008BDA2A95B010240765BB300D1808D8C
:20558200C06FA28AA392CEFF0BDCC41A0080407614A8A39280FFA95B010240765BB30DDA8F
:2055A2000102C21A008040765BB301D9A1921052E7641F76BF010B1A0008BE82BE86BE8BBD
:2055C20006001F767B03008F5902BF5600050128701706A80600BDB2BDAABDA202FE79D0CA
:2055E200008FC0DBAC1E013BA98B94854C82A61E4456A90042A2C0004EB278D0A98342A25B
:20560200215694004456A100C0004EB27FD0A607A5039449046C7AD0013B9485A918FF0F23
:20562200A95AA91A0080407620A87BD0A9B2408FC0DB34FF957AA61EA9B242A232FFA60771
:20564200C0004EB2A98A42A2C802AC1EA9B24456A900C0004EB21CD0A49E82FE289C9596E2
:20566200BE82BE86BE8B0600A9280290407620A81F767A032B9206520F6104520D610252C5
:2056820006611F76BF010F1A00040A6F1F76BF010F1A0040056F1F76BF01061A00020600F7
:2056A20002FE1F767B03080604610102415608000092020A0254E6FFA8000606022BE0FF27
:2056C20084007FD0008FC0DB9447566C0592346050D0013B9492FC9CA985A9BD120F0077BD
:2056E20000770077007789E6000051D003E20A009492FC9CA985A9BD160F007720E80000CE
:2057020003E20A0032E8000589E6090003E20A0003E20C0112E8010C14AD056502E8000CF8
:2057220003E20A0094E6010014AD06628FE800E0007703E20C000192C0FF03540267030AF6
:205742000192030A035402670396AFE20A00AFE20C01C4E20103C4E2030220E709004FE879
:2057620000604FE8096000E7180000E75100007710E74000086F0492032B90E5019CA91834
:20578200FF0304967FD09493A892C6FF0190059604920E61A8480C6D8CE600000188013B25
:2057A200A9BF120F42C2A985407658A82D6F4076A1A81F767B03008FC0DBBF5604017FDC29
:2057C200C418FFFE216F06060119A61E061E20FF5802A60F136120FFF401060F0F6120FFF6
:2057E2009001060F0B6120FF2C01060F0761C802060F04616402060F07604076A1A81F7612
:205802007B03BF56040182FE060011D0008F107094920F9004520E60CCCC8001C6FF0252BD
:20582200096022761F76C001BF562555BF5625AA1A7669FF060022761F76C001BF5629680A
:205842001A7669FF0600BDB202FE1F76C001A888A9801143026C257611CC80010561227671
:2058620011187FFE1A762276408F1070A58AA79211D00F9001DCC41A400095CDF0FFA8CA63
:2058820021961A76A79204600102A98B026FA759A92880C3A828C90169FFAC1E0556A1009E
:2058A200407688A9A1A91140FF6C22761118BFFF1A76A6930153036102530A602276A6926A
:2058C20011CD7FFE039086FFA8CA11961A76A6930A60A9B2013BAC281E0040FF2256A1071F
:2058E20041FFA98BA69301530A60A9B2013BAC281E0040FF2256A10741FFA98BA693025351
:205902000960A9B2AC281F00013B2256A10740FFA98BA7921460A69203521160227611CCDF
:205922007FFFA91A000169FF119620FFDA0540765BB31F76C001111A80011A761F767103B7
:2059420082FE69FF3AB2BE8B0600BDB202FE22761F76C001BF561A011B2B1A92036001BE81
:20596200046F03561A01A9881F76710342C269FF3A06C0004EB23E1E1F76C0011B920360D6
:2059820001BE046F03561B01A9881F76710342C23A06C0004EB2408D1070A18315D0008F3B
:2059A200200B3C1E0CDD1F762C0094CCF8FF015014DC3596C41A04003418F7FFC51A080048
:2059C200787680001F76C0011C1A1000A18A1C1A00041C1A00081C1A20000DDC10D91C1ABA
:2059E20000011C1A00101C1A00201C1A00401C1A00801C18FBFFC41A01001D1A02001D1A5F
:205A020004001D1A08001D1A10001D1A20001C1A04001D1A00041D1A00081D1A00101D1A71
:205A220000201D1A00011D1A00021D1A00401D1A0080C11A0001201A0002201A0004201A15
:205A42000008201A0010201A00201A7669FF82FEBE8B0600407688A9049A029B407690A9C0
:205A6200407612AA060002FE22761F762B002028FFFF2128FFFF2228FFFF2328FFFF2428EA
:205A8200FFFF2528FFFF2628FFFF2728FFFF1A761F76FFCF69FF38924196399241963A92B8
:205AA20041963B9241963C9241963D9241963E9241963F921F762B0041962F9201F00190CC
:205AC20082FE06001B76F0FF0500BDABBDA8BDA0BDC2BDC300E2BD0003E2BD0003E2BD01AC
:205AE20003E2BD0203E2BD0330E6000669FF4229165600D1227601021F767803015610001D
:205B02002376391110291A767FD0008FC0DB944F046D69FF407672A91F767103020A029228
:205B220014520668022B1F767103BF560301008FC06FA4831F767A0306DDC51A01002B92C9
:205B420006520E6104520C61025205610FDCC41A00040A6F1F76BF010F1A0040056F1F76F2
:205B6200BF01061A00021F767A032B9206520861045206611F76BF010F1A0020056F1F764D
:205B8200BF01061A080001021F7678033E07A61E008F204E3E1EA9A8A60F02673EA83B0A0C
:205BA2003B920A5202643B2B3792AC2B1261008FC0DBA9A8AC0DA98A62D094923B54046524
:205BC200019A66FFA172AC92019C3754A92DF0683A0A3A92025202653A2B7FD0008FC0DB73
:205BE2009493A89216D094CAA940EDFF8300A84B586D20FF204E3E0F30693A920A60013B09
:205C02001F766F0300D401D569FF00854076E0A61F7678033A9201520A60008FC0DB013BA9
:205C220001D569FFCC8501D44076E0A6A192408DC0DB02D400D569FFD1CEA90E4076E0A682
:205C42001F7678033A9202527B60013B03D400D5D9854076E0A6746F3A92076000D40002C9
:205C620000D569FF4076E0A61F7678033A920152076001D4000200D569FF4076E0A602D4ED
:205C8200000200D569FF4076E0A61F7678033A920252566003D4000200D54076E0A6506FF8
:205CA2003A92086020FFB82200D401D569FF4076E0A61F7678033A920152086020FFB822D7
:205CC20001D401D569FF4076E0A6A10E02D400D569FF4076E0A61F7678033A9202523060B5
:205CE200012903D400D520FFFFFF4076E0A6286F69FF4076C0B23A920760013B00D404D530
:205D020036854076E0A61F7678033A9201520760013B01D404D536854076E0A61F76780303
:205D220002D400D53C064076E0A61F7678033A92025206603C0603D400D54076E0A6AFE2E7
:205D4200BE03AFE2BE02AFE2BE01AFE2BE0080E2BE00BEC5BEC4BE83BE8ABE870300303B2F
:205D6200F1FF1776027634FEA892FF9C0564105204640F9A026F009A22761F76BE01AB287F
:205D8200F0FFAA28457F09CDFFDF013B08BEA81A001008D4A0A908B6099709CDFF3FA81A9B
:205DA20000400997A9851F7680015AFF2AC25D56A000A5A92CA8AB2BAA28467F1F7684017C
:205DC200AB0302C3AB28FEFFAA28FFFF00B60AC21F76800103BE00C31F76840100A0081EB2
:205DE2001F76800102A900C200BE0002011960C2601A80F2081E000260C401190C1E0002A4
:205E020001191E1E00020119221E00020119181E14C21844FF6C16065E1E5E18FFFD5E1A5D
:205E220000015D1800FF5D1A05005E1A7F005E18FAFF5EC416C26018FFEF6006141E1844B5
:205E4200FF6D0002488F70641F768301541E088F7064541A010000A00031531A020001027F
:205E620000BE02A8541A06001F768001408FA1B000D4301E54C5020232A82EA9008F76B069
:205E82001F76370008A01F768001241E26C220C31F7637000AA81F763300321A1000321A7B
:205EA2002000237600011A761F767B0369FF000200B60E2B141EB4FE10C212C30600BDB22A
:205EC20006FE00021F7678030ED03E1E94C4A606A80EA9580CD19CC5467EA0CC00804396EE
:205EE200A0CC00404296A0CC00204196A018FF1FA70645974392447F00520861A092805203
:205F020005674692008FC0DB9496429201D80861A092805205674592008FC0DB9496419263
:205F220001D80861A092805205674492008FC0DB94961F76BF010F1A010086FEBE8B060031
:205F42001F767B030F92A88809611F7680010806A940046D0A06A9403E6C02D5A692013B85
:205F6200AB28010001B6A572AA2B1F768001A9A8A581A98308A90AC301B6C58500915AFF86
:205F8200A692A772A9A8A781A983C5853FFFABCAAACBA71EA9A8A681A98A1F768401C485C4
:205FA20000915AFFA6853FFFAACBABCAA81A00E0061E04C322761F76800100022E1E1A7689
:205FC2000102041E1F76BF010E1A01001F767B03BF560F0169FF06001B76F0FF0500BDAB89
:205FE200BDA8BDA0BDC2BDC300E2BD0003E2BD0003E2BD0103E2BD0203E2BD0330E6000695
:2060020002FE69FF422916561F763300329241962376000126760001321875002128FFFF9F
:206022001029408FC0D369FFA58A4076269540762B95103B4192329682FEAFE2BE03AFE2FC
:20604200BE02AFE2BE01AFE2BE0080E2BE00BEC5BEC4BE83BE8ABE870300303BF1FF177601
:2060620002761B76F0FF0500BDABBDA8BDA0BDC2BDC300E2BD0003E2BD0003E2BD0103E22F
:20608200BD0203E2BD0330E6000602FE69FF422916561F76330032924196237600012676A6
:2060A2000001321871002128FFFF1029408FC0D369FFA58A407626954076FC95103B4192D3
:2060C200329682FEAFE2BE03AFE2BE02AFE2BE01AFE2BE0080E2BE00BEC5BEC4BE83BE8A86
:2060E200BE870300303BF1FF177602761B76F0FF0500BDABBDA8BDA0BDC2BDC300E2BD00A9
:2061020003E2BD0003E2BD0103E2BD0203E2BD0330E6000602FE69FF422916561F763300CC
:206122003292419623760001267600013218FD002128FFFF1029408F40D069FFA58A407698
:20614200269540762B95103B4192329682FEAFE2BE03AFE2BE02AFE2BE01AFE2BE0080E202
:20616200BE00BEC5BEC4BE83BE8ABE870300303BF1FF177602761B76F0FF0500BDABBDA8D7
:20618200BDA0BDC2BDC300E2BD0003E2BD0003E2BD0103E2BD0203E2BD0330E6000602FE58
:2061A20069FF422916561F7633003292419623760001267600013292322B2128FFFF102963
:2061C200408F40D069FFA58A407626954076FC95103B4192329682FEAFE2BE03AFE2BE0286
:2061E200AFE2BE01AFE2BE0080E2BE00BEC5BEC4BE83BE8ABE870300303BF1FF17760276A8
:206202002276008F806FA483A4C41F76BE0126DDC51A030027DE261A0C00A483261A3000B6
:20622200261AC000261A000317DD261A000C261A0030261A00C0C61A0300271A0C00271AF8
:206242003000271AC000271A0003271A000C271A0030271A00C0C51A0300A48328DD171AC9
:206262000C0016DC171A3000171AC000171A0003171A000C171A0030171A00C0C51A030027
:20628200281A0C00281A3000281AC000281A0003281A000C281A0030281A00C0C41A00C095
:2062A200161AC000161A0030161A000C1A7669FF06002276008F806FA4C4A4831F76BE0159
:2062C20018DEC61A030019DD181A0C00181A3000181AC000181A0003181A000C181A003086
:2062E200181A00C0C51A0300A48369FF191A0C0014DD15DC191A3000191AC000191A00038C
:20630200191A000C191A0030191A00C0C51A0300141A0C00141A3000141AC000141A00034D
:20632200141A000C141A0030141A00C0C41A0300151A0C00151A3000151AC000151A000339
:20634200151A000C151A0030151A00C040766DAE0600227615D0008F200B1F762C0094CC83
:20636200F8FFA483A4C5A4C40150359614DDC518FCFF0CDF3418F7FFA4830DDE341A0400B6
:20638200C41A60000EDDC41A1C00C41A0300C41A0030C41A000EC41A8001CC1A4000C41A9A
:2063A2000040C41A0080211A0300C71A60002C1A1C002C1A03002C1A00302C1A000E2C1A03
:2063C2008001C61A40002C1A00402C1A00802D1A0300C51A6000A4830FDD2E1A1C0018DCDA
:2063E2002E1A03002E1A00302E1A000E2E1A8001C51A40002E1A00402E1A00802F1A0300FE
:20640200C41A0700381A38001A7669FF40766DAE07F6007769FF0600BD3ABDB2BDAABDA234
:2064220002FE0129A9BF120F58FF5B61A85C7F91A8088000421EA493D6FFA85CA9BF160F53
:206442006761A85D7F91A8088000A859A958A593D6FFA85DA493A571A8180001A697A41812
:20646200FF00A518FF007FDCA492A59EA7964D64A90801FF3E62A193A09236FFA859A958AF
:20648200420635FF0EF6A11FA95BA3010AF6A11F2D56A204A32DA03640FF0BF6A11F33FF51
:2064A200009B30FF54FFA20CA39540FFA70801001FF677FF200940FFA70801001FF677FFBA
:2064C2005AFFA7922265A90801FF1363A9A946FF7F91A85BA95AA625A79596FFA20CA3954B
:2064E200A9BD120F82FEBE82BE86BE8BBE8E0600009B57FFA8087FFF5AFFA693F260A828A1
:206502000080AA71AB92ED6F20FF0000EA6F5AFFA493A818000196FFA85CA9A9A8087FFF63
:20652200A81C0080A4CBDD6F58FF5AFF00BE25610129A6920190A958A60640FFA407A71E17
:20654200C793A640046DA892C7FFA92DA09201520460A8CCFF00A92DAC58A592A0F201DED4
:20656200A092FF90A958A592408FC0DAC7FF9570A95DA9A9A60FDE66A5920600A71E8076A3
:20658200C0DA0A6FA5928470FF90A95881DFA592C7FF9670A95DA706F660A5920600005230
:2065A200A927FF76FFFF00BE3365A9A8013BA681A983A793C592FF90A92FAA71A880009A8B
:2065C200A740046DB0FFA880056FB0FFA81C01A0A880019C0852F564A9A8013BA681A983AA
:2065E200A793C592C7FFA92FAA71A880009AA740046DB0FFA880056FB0FFA81C01A0A880AE
:20660200019C0852F56401DEAB92A654CF62A79206001B76F0FF00E2BD0030E6000602FE67
:20662200422916561F7633003292419623760001267600013292322B2128FFFF1029010243
:206642001F767B030E0A1F768001061E1F763300211A0001103B419282FE329680E2BE0049
:20666200303BF1FF177602761B76F0FF0500BDABBDA8BDA0BDC2BDC300E2BD0003E2BD00C9
:2066820003E2BD0103E2BD0203E2BD0330E6000602FE69FF422916561F763300329241964E
:2066A20023760001267600013292322B2128FFFF1029008F006169FF4076CCAC1F76800164
:2066C20002020C1E1F763300211A0001103B4192329682FEAFE2BE03AFE2BE02AFE2BE012D
:2066E200AFE2BE0080E2BE00BEC5BEC4BE83BE8ABE870300303BF1FF1776027600021F765C
:206702003000008F000C0119021E1F767803408F100C000206A81F763000062B0119072B85
:20672200E41A1000041A20001F763000008F080C0A1E1F76300000020119121E1F763000A5
:2067420000020E2B0F2B1F7678030EA816A0081E1F763000162B172B1F763000E41A100005
:20676200E51A10000C1A20001F763000141A20001F767803181E101E060000E0E45003E23C
:20678200F40188E61000C48303E2D500C483F52BC483FD2BC483E51A1000C483E51A2000F1
:2067A200C483E518FFFBC483E518FFF7C4830002E51A0040D41E06000129BDB240FFBDAAA0
:2067C200A98B00D20861100240765BB301DAA9B2A20FFA66BE86BE8B06001F76C001201A08
:2067E200001040766DAE2276008F200BA4C4A4831F762C000ED015DE14DDC618F8FFC51A9E
:2068020003003418F7FF3418FBFF94CCBFFF20502E960FDC2ECCE3FF08502E962ECCFCFFC1
:2068220001502E962ECCFFDFA91A00102E962ECCFFF7A91A00062E962E187FFEC418BFFFF8
:206842002E18FFBF2E18FF7F2F1A03001A7607F6007769FF0600AD28000469FF1F5616568E
:206862001A5610E6000240291F76000002291B762276A9285FB3A828000001091B61C076ED
:206882005FB304290F6F009BA92401DF046C0429A82401DFA61EA1F78624A706A1810109C9
:2068A200A71EA92403635CFF043BA95901DF0900ECFF1A76A928FFFFA828FFFF01090E61C8
:2068C200FF76FFFF066F01DFBDC3A71E673EBEC5A92401DFA82458FFF7604076DDB240765F
:2068E20013B31B76F0FF0500BDABBDA8BDA0BDC2BDC300E2BD0003E2BD0003E2BD0103E259
:20690200BD0203E2BD0330E6000669FF42291656227601021F76780301561800008FB4DD7C
:2069220069FF1F7676033AC5673E1A76AFE2BE03AFE2BE02AFE2BE01AFE2BE0080E2BE0049
:20694200BEC5BEC4BE83BE8ABE870300303BF1FF17760276BDB2CFE6010008D003E2BD045C
:206962000ED103E2BD0503E2BD0603E2BD07AFE2F400AFE2D40510E394040CD012E39C1F38
:206982000ED118E394DA0AE3C4A000E3E4C600E7BB0110E700010CD010E7C00003E29C021E
:2069A20003E2940008D0F406941E03E2F401AFE2BE07AFE2BE06AFE2BE05AFE2BE04BE8B63
:2069C2000600022904295F565AFF42065F56421E00021FF617564200AB063256022920762C
:2069E200022904295F565AFF420656FF421E00021FF6175642003256022920765AFF0002C8
:206A02001FF617564200A9A920765AFF00021FF6175642002076103B1F7633002018FEFFCB
:206A2200222B242B69FF262B282B2A2B2C2B2E2B302B322B342B362B382B232B252B272BDC
:206A4200292B2B2B2D2B2F2B312B332B352B372B392B06001F763300201A01002128FFFFA8
:206A6200102969FF0600A0E514AD0962A0E51F767C0314AD90E5B4562701156F4FE803C03D
:206A820092E601008CB5050000E7CA00007700E78A000077CFE812F0007700E75100007746
:206AA20000E74000060002FE1F767803380AC4E23800007712E8D01F14AD1164390A3992D3
:206AC200382B0A520260392B3934570436963C0603610002036F000201193C1E82FE060085
:206AE200A928FFFFAA28FFFFAB28FFFFA828FFFFAB0F04ED00D400BE0B6FA927A928FFFF00
:206B0200A92FA4A9C488A928FFFF0209A98AA6924076379F060022761F76C00169FF1C1A9F
:206B22000800787680001A761F76C401028FE6491CCCFF3F69FFA91A00401C96BF5618E0E3
:206B4200A9A840765BB306000077006F1F767C03BDB22AC5A959673E1F767C032EC5A70665
:206B620003ECA192673E1F767C032C0603ECA71E673E407611B3BE8B0600608F00001F7660
:206B82007B03208F00FA38A03AA838063C1E3E2B3806046FA98A842BA9A81F767B033A0FD1
:206BA200FA680600408F00C0008F000D2276009A85C4019C805284C2FC641A7669FF0600B2
:206BC2001F767C0328A806001F767C032AA8060006001F767C032397249606000119C35616
:046BE200FFFF0600AB
:206BE6001201000000C07E8B00007E8B00007E8B00007E8B00007E8B00007E8B00007E8B7D
:206C060000007E8B00007E8B00007E8B00007E8B00007E8B00007E8B00004C8C00003F8C95
:206C26000000CF8F0000718B0000E6880000888B0000598C00001C8A0000118A0000068ABD
:206C46000000FB890000F0890000E5890000DA890000CF890000C48900003D8A0000328A38
:206C66000000278A0000B48A0000998A0000E68800009089000077890000DC8F0000488A38
:206C86000000A9890000DE8D0000A88D0000728D00003C8D0000068D0000D08C0000E688F7
:206CA6000000E6880000F98D0000C38D00008D8D0000578D0000218D0000EB8C0000E688F9
:206CC6000000E6880000A68E00008B8E0000708E0000558E00003A8E00001F8E0000E6882F
:206CE6000000E6880000B58C00009A8C0000E6880000E6880000E6880000E6880000E68893
:206D06000000E68800007E8A0000638A0000C98B0000938B0000E48B0000AE8B0000E68882
:206D26000000E6880000B48F0000998F00007E8F0000638F0000488F00002D8F0000E68874
:206D46000000E68800007F8C0000648C0000E6880000E6880000208B0000CF8A0000E68876
:206D66000000E6880000568B0000058B00003B8B0000EA8A0000128F0000DC8E0000F78E64
:206D86000000C18E0000E6880000E6880000E6880000E6880000E6880000E6880000E6889C
:206DA6000000E6880000E6880000E6880000E6880000E6880000E6880000E6880000E6885D
:206DC6000000E68800005C89000041890000268900000B890000F0880000E6880000FF8BDD
:206DE60000001A8C00002C012C01000000000F00160014000A003C000A00080006000800EE
:0A6E06000600080033000B000A002C
:206E10002800000012C1C09D00004D9E0000AE9D00003D9E0000A19D00002F9E0000949DBD
:206E30000000189E00007A9D0000089E00006D9D0000FE9D0000519D0000F19D0000449DCD
:186E50000000E39D0000379D0000D79D0000219D00000C9D00000000FB
:20040000803FFFFF02DD00000000FFFF03DD00000000FFFF04DD00000000FFFF09DD00009F
:200420001400FFFF0CDD00000100F0FFB0DA00003F0006005B004F0066006D007D00070001
:200440007F006F00400000000000000079000000FFFF9BDF00000600FFFF9DDF00000000FD
:20046000FFFF9EDF00000000FEFFA2DF000000000000FFFF82DF00000000FFFF83DF0000C4
:200480000000FFFF84DF00000100FFFF85DF00000000FEFFBCDD000069BB0000FEFFBEDD46
:2004A000000069BB0000FEFFBCDF000000000000FEFFBEDF000000000000FFFF38DF0000D1
:2004C0000000FFFF39DF00000000FBFFCCDF000008000C00100000000400FFFF3CDD000022
:2004E0000A00FFFF3DDD00000100FFFFD5DF00000100FFFFD6DF00000100FEFFD9DF0000BD
:2005000000000000FEFFDBDF000000000000FFFF00D000000100FFFF40DE00000000FFFF3B
:1205200041DC00000000FFFF01DD0000000000000000D0
:20053200733B0000008002FEA4C5A988013B008FC0DBC7924196A9A8A681A71E1F76710305
:20055200C7CC00E041CA4296C7FF01900B9842CCFFFDA98803564201A91CFF03A9180002D8
:20057200A6CA429682FEC796060010E70B0001E8EAFA20E740000DE8BA9E6FE819F000E794
:20059200100000E7490000E70000007710E740004076BEBA02E8010250E80000407696B71E
:2005B2000600A71EA59243880860C4930461C40BA6920C6F009A0A6FC427AA2BA706AB0F7C
:2005D2000362019A036FC40AA69206001F767D03BDB23392BDAA03E2BD04586179D1808D25
:2005F200C0DB78D0013B9A92929EA985A9BD120F007700770077007789E604000077CFE63E
:20061200210002E80818407696B71F76710303E21E0002E8101CCFE621000FE83033407692
:2006320096B77AD11F76710378D0013B008FC0DB03E220009A92949EA985A9BD120F0077CA
:2006520000770077007789E6010002E80818407696B77BD11F76710379D0013B008FC0DBA2
:2006720003E222009A92949EA985A9BD120F007700770077007789E6010002E80818407642
:2006920096B71F76710303E224001F767D0332922F617AD1808DC0DB78D0013B9A92929EAD
:2006B200A985A9BD120F007700770077007789E6010002E84016407696B77BD11F7671038F
:2006D20079D0013B03E222009A92929EA985A9BD120F007700770077007789E6010002E835
:2006F2004016407696B71F76710303E2240000D1008FC0DB013BA9A8A181A98A74D0C8E2B2
:200712009400008F40DFA9A8A181A98AC4920252046002E8D123056F02E8E1300AE8010091
:20073200407696B7013B008F2ADD0356A1010156A40001D9A192045203E2C400DA64AFE201
:20075200BE04BE86BE8B0600BDB2BDAA04FE0052A92DA85A06601F7671030B920B2B0C964C
:20077200008FC0DB013BA9A8AC81A98AC44F076CAC921F7671030654E4FFB401008F86DE9E
:20079200A9A8AC81A9837FD0008FC0DB944CC4E2C500EDFF9E01A9A8AC81A98AC44D3F6CE1
:2007B200AC921F76710306543A6300B6A79200BEA985013BA98E008F40DFA9A8AC81A98343
:2007D200A9A8A681A98AC592C4541460008FC0DBA9A8A681A98A1F7671031392C4CE0A60FA
:2007F200008F86DEA9A8A681A98A01DFA93AC40DA98E01DEA6921852DF64A7920761A985EB
:20081200421EA93AC0006BBAA98EA93AA9BD120F007700770077007789E60000AC921F76DF
:200832007103079EA959A2922561008F40DF013BA9A8AC81A98AC4920A521A60AC92069E28
:20085200A988008FACDFA9A8A681A98AC8E2C401008FA4DFA9A8A681A98A01E860EE0EE837
:20087200686600E74000C492036106E84016A29256601F767D03329252617FD0008FC0DB84
:20089200949316D0D3FF9492C1FFA8CAA940246C1F767C033C0620601F767D033192055291
:2008B2000C6002E849280CE8010094E6080014AD0465A1920250A959A1920E64A9A8013B05
:2008D200A181A98A8CE6000078D013E2940040765380EFFF1401AC921F7671030654E3FF5F
:2008F2000E01A1400F6C79D0C8E29401007720E74000AFE2240300E71800007790E8007619
:200912000E6F78D0C8E29401007720E74000AFE2220300E71800007790E800761F767D03D4
:2009320033925261A192E3FFAF001F767D03319202521F61AC400F6C79D0008FC0DBC8E239
:2009520094011F76710320E74000AFE2240300E718003A6F78D0008FC0DBC8E294011F76FA
:20097200710320E74000AFE2220300E718002C6F08BEAC92A672008FC0DB013BA9A8A68160
:20099200A983807686DEA606AC81A71E18D0C7929596AC9206520D6378D0C8E294011F7693
:2009B200710320E74000AFE21E0300E718000C6F78D0C8E294011F76710320E74000AFE2D6
:2009D200200300E7180016D0008FC0DB26E8000D94937FD0D0FF949232E8401AC9FFA8CA9F
:2009F200A940036C02E8001150E80148A9A8013B8CE60000AC818CE60900A98318D01F76C1
:200A12007C03A6BF120F13E29501432B3C063460A9A8AC81A98AC493A84E2E6DA61BECFFAB
:200A32002565A692C852226330D09592FB9CA6540363A845146D008FC0DBA9A8AC81A98ADC
:200A520030D0A69294540B6248D0945415651F767103431A10000B1A08000E6F1F76710354
:200A7200431A20010B1A0400076F1F767103431A01000B1A1000AD5CAC9283DCA45C40764F
:200A920000803C6F1F767C033C0616601235008F00D90156A400407634BA013B008FC0DB99
:200AB200A9A8A181A98A8CE6000078D013E2940040765380236F1235C07640D70156A7008E
:200AD200008F00D90156A40011F68424176FA9A8AC81A98A8CE6000018D013E294000E6F5B
:200AF200008FC0DBA9A8AC81A983A9A8AC81A98AC52B18D0C51A0080942B84FEBE86BE8B5A
:200B12000600BDB2BDAABDA202FE0052A95A06601F7671030B920B2B0C96008FC0DB013BE9
:200B3200A9A8A281A61EC64FEDFFC700408F86DEA9A0A281A9837FD0944CC4E2C500EDFF52
:200B5200B300408F40DFA9A0A281A9830356C501408F2ADD0156A500AFE2C50100E74000DB
:200B7200A9A88CE60000A281A98AA1BF120F18D01F767C039479422B3C06E0FF8E00C64E90
:200B9200EDFF8B00A29207525C610356A201A95B1F767D034218FFFB008D08DEA32D3E0692
:200BB200412B22560190A95DA93AA381A98A20FFE80340763E80013B019B019089FFA395C7
:200BD2004298A82D4218FFF73E06412B22560190A95DA93AAC81A98A20FFE80340763E8084
:200BF20001908AFF4298A29206522B60029A4218FFEFA394A92D013B3E06412B22560190F2
:200C1200A95DA93AAC81A98A20FFE80340763E80013B039B0190A3958BFF4298A82D4218C5
:200C3200FFDF3E062256412B0190A95DA93AAC81A98A20FFE80340763E8001908CFF42984E
:200C52004292C0FF42CDBFFF42CA008FC0DB013BC0FF42CAC0FF42CAC3FF4090A8CA42963E
:200C7200A9A8A281A98348D0A19295540F63408F1CDFA9A0A281A983421A0800A9A8C581BF
:200C9200A98AC492089084FF4298429205611F7671030B1A0200AD5CA29282DCA45C407609
:200CB2000080156FA9A8A281A98A8CE6000018D013E294000C6FA9A8A281A983A9A8A28105
:200CD200A98AC52B18D0C51A0080942B82FEBE82BE86BE8B060000BE013B008FC0DBA9A811
:200CF200A681A98A01DE18D0A692C41800E01852942BF46400BE013B008FC0DB408FB4DFC6
:200D1200A9A8A681A98A0356A6010156A50070D0C8E294001F767D0303E2C50031920652C2
:200D32001760408F40DFA9A0A681A983C59203520F60A640056D18D094288601096F008FFB
:200D5200C0DBA9A8A681A98A18D09428300201DEA6920452D264319201521060008FC0DB12
:200D72001F767103A9A80881A98AC41A0040CC1A0040D41A0040DC1A00401F767D033192CB
:200D920006520760008FC0DBC41A0040CC1A00404076538006001F767D033092A9931F76DD
:200DB2007103BDB2FF9D052B062B072B01531C69A993FD9D015311690752086109521A60FB
:200DD200BF56060FBF56070D156FBF560508BF560608BF5607080E6FBF560507BF56060EFA
:200DF200BF56070E076FBF56050ABF560614BF5607141F767D033792AC2B013BC07668DC53
:200E12001F76710306940896008F40DFA9A8AC81A98AC42B008F1CDFA9A8AC81A98A408F27
:200E320040D71235C4210156A500008F00D90156A400AC92019C11F68524A92D185211F62C
:200E52008424E3641F767D03349225611F7671030692AC2B20651F767D0333920961008F60
:200E720040DF013BA9A8AC81A98ABF56C4091F767D0332920961008F40DF013BA9A8AC81C7
:200E9200A98ABF56C408AC921F767103019CA92D0654E2641F767D033792AC2B1565013B67
:200EB2001F7671030688AC92A672008F40DFA9A8A681A98A1F767D03AC92019CBF56C40A07
:200ED200A92D3754EE641F767D03359236611F767103AC2B013BBF5612C80892AC94A988C4
:200EF200008F40DFA9A8A681A98A408FB4DFBF56C403008F1CDFA9A8A681A98AAC9201F0E5
:200F12000894C4960356AC01008FC0DB0156A500A9A8AC81A98A70D01235C8E29400008F98
:200F3200C0DD0156A40003E2C500AC92019CA92D11F684240452D2641F767D033192065241
:200F52000B601F767103008F40DF12282C01BF56DC02BF56D4021F767D0330920952346052
:200F7200008F40DF408F1CDFC42BBF56C50108D0BF56CC010ED1CD2BBF56D404BF56D503B2
:200F9200BF56DC04BF56DD02BF56E404BF56E505BF56EC04BF56ED04BF56F406BF56FC052A
:200FB200BF56940609D0BF5694070AD0BF5694060BD0BF5694060CD0BF5694060DD0BF5657
:200FD2009408BF569C081F7671030002132B0D28F915BF560E120F28F22B10283E49AC2BFF
:200FF200013B90E5131A01E01F767D033E1E008FC0DFA9A8AC81A98AC42B008FC6DFA9A85C
:20101200AC81A98A0356AC01C42B008F8EDF0156A400AC92019CA92D03E2C4000652E86474
:20103200AC2B013B00BE0356AC01008F04D70156A400AC92019CC4C2A92D1C52F564AC2B8D
:20105200013B008F08DEA9A8AC81A98AAC92019CC42BA92D2052F664AC2B013B008FA4DF8B
:20107200A9A8AC81A98AC42B008FACDFA9A8AC81A98AAC92019CC42BA92D0852F064BE8B5C
:2010920006001F767D0335921F7671030880026104DF00D5013B00D40356A5038076F0D8E1
:2010B200A4810156A60001DCA492C62B0852F56401DDA5920252F0641F767D03319204525A
:2010D2007761A79200D52D65013BA592A2FF008FF0D8CBFFA594A3FFA927A9A8AB81A61E65
:2010F2000356AB04A92D019BA592ACEA189A67FFA594C699A988A2FFCBFFA594189CA3FFBC
:20111200A92701DDA9A8AB81A98A0356AB04A92DA692ACEA019A66FFC498A792A554D662ED
:2011320000D5013B008FF0D803BEA9A8A581A71EA592A672A9A8A681A98A08D001DDC7922F
:201152009496A5920352EF641F767D033192008FF8D802520460A9280003036FA928000F5F
:20117200FC981F767D0335920961408FF0D8A58A0FDCC41AFF00F51A003F1F767D033792C9
:2011920005611F766303361A08001F767D03319206521460408FF0D8A58A08DCFC1A3000F0
:2011B200EC1A0300FD1A00E0CD1A0030076F008FF8D8C41A0F00F41AFC01008FF0D8A483BB
:2011D20008DC01DDC51A0100F41A0700FC1A00E00600BDB2BDAABDA203E2BD0403E2BD05C8
:2011F20003E2BD060AFE1F767D034496319206520860449206601F7671030B920B2B0C9601
:201212001F7671030892008F1CDF013B4494A988A9A84481A98A808DC0DBC4924696449251
:2012320001F0019047964492A0FFA92D499603354896049AAC94A95BA9AAA681A98A457EAB
:20125200C44FEDFF4002008F3CD7A9A84481A98A64BE4492A672C4E2C404A9AAA681A98A25
:201272008CE62000408DB4DF13E2C40044920356A9010156A10002E891340BE801E0AFE2CC
:20129200C10020E72000407696B7442D008FC0DD1235AFE2C10110E740000156A40003E203
:2012B200C100407634BA1F767C038CE60000AC281F003EC4013B1F767C038DE60000A606CD
:2012D2002256A60740FF3C0F0965A9AA4481A98A8CE6000070D013E294004492408F2ADDAD
:2012F200008FC0DB0356A901A71E0156A500A9A84481A98A70D0C8E29400408D8EDF21E3E9
:20131200C501A70600E70C000156A10000E72101AFE2C10620E7880102E8512B0BE8010012
:20133200407696B7AFE2C10110E74000007703E2C1004076BEBA013B008FC6DF8CE60000E1
:20135200A9A84481A98A13E2C4004792E0FFA4001F767103CFE62000AFE22601407622802F
:20137200452D008F00D912350156A400407634BA4588008F40DF013BA9A8A681A98ACFE684
:201392000600C4920352066012E8060D14AD026396E5008F40DFA9A8A681A98AC492025273
:2013B200066012E8B61414AD026396E501E8A9FDCFE6300008E89927407696B71F767C0315
:2013D200CFE605003C061660008FC0DB4588013BA9A88CE6300018D0A681A98381DEA9A878
:2013F200A681A98A13E295008CE62B0018D013E294031F767103013BAFE62400408D8EDFAE
:20141200AFE226000356A30120E720000156A10000E70100AFE2C10020E7080002E8512B38
:201432000BE80100407696B7AFE2C10110E74000007703E2C1004076BEBA013B408FC6DF1E
:201452008CE60000A9A0A381A61EABBF120F68B6C63F4892A772008FC0DBA9A8A781A61ECF
:20147200A9A04681A71EAA286900C792C696A9A04481A71E4892AA72A9A8AA81A61EAA28BA
:201492006A00C792C6964892AA72A9A8AA81A98AC43F0C6F1F767D03319201520360AFE6D5
:2014B20024001F76710303E22604008FC6DFA9A84481A983A9A84681A98AC8E2C504C8E200
:2014D200C400008FC6DFA9A8A381A98A96E604001F767C03C8E2C4003C06432B96E6040028
:2014F200E0FFEA00008FC0DBA9A84581A98AC4CC0040CDFFA959008FC6DFA9A84481A98A82
:20151200C8E2C400CFE6210020E72000407696B701E8C9F400D50CE8D1CC94E6080014ADFC
:201532000B651F767103C8E21200007794E6040014AD026501D5008FC0DF013B1F767103FE
:20155200A9A84481412BA98A0F0E40763E8000520D61009BA1920260019B0356A8084393C8
:201572000451A818FFFEA8CA4396008FC6DF013BA9A8A381A98AC8E2C400CFE6210020E799
:201592002000407696B701E8C9F400D50CE8D1CC94E6080014AD0B651F767103C8E2120092
:2015B200007794E6040014AD026501D5008FC0DF013B1F767103A9A8412BA381A98A0F0E82
:2015D20040763E8000520D61009BA1920260019B0356A80843930451A818FFFEA8CA4396BD
:2015F2001F767D03319206526660479264604588008FC0DB013BA9A8A681A98A30D0C8E2BE
:201612009400007794E6050014AD0D65009BA1920260019B0356A80843932051A818FFFE22
:20163200A8CA4396008F40DFA9A8A681A98AC49203522860008FC0DBA9A8A681A98A48D0D4
:20165200412BC8E2940000D594E6050014AD026301D5008FDBDF1F767103A9A84981A98ADE
:201672000F0E40763E8000520D61009BA1920260019B0356A80843930851A818FFFEA8CAD4
:2016920043964588008F40DF013BA9A8A681A98AC49202521060008FC0DBA9A8A681A98A0E
:2016B20048D0C8E29400007794E6050014AD0365431A1000AD5C459283DCA45C40760080C1
:2016D2000E6F008FC0DBA9A8A681A983A9A8A681A98AC52B18D0C51A0080942B8AFEAFE2F3
:2016F200BE06AFE2BE05AFE2BE04BE82BE86BE8B06001B76F0FF00E2BD0030E600064229F4
:2017120016562576006F1B76F0FF00E2BD0030E6000602FE422916561F76330038924196C6
:2017320023760008267600003892382B2128FFFF1029103B419238962576006F1B76F0FF37
:2017520000E2BD0030E6000602FE422916561F7633003892419623760008267600003818EF
:2017720090002128FFFF1029103B419238962576006F1B76F0FF00E2BD0030E6000602FE16
:20179200422916561F763300389241962376000826760000381890002128FFFF1029103B0F
:2017B200419238962576006F1B76F0FF00E2BD0030E6000602FE422916561F7633003892C8
:2017D2004196237600082676000038189C002128FFFF1029103B419238962576006F1B76F0
:2017F200F0FF00E2BD0030E6000602FE422916561F763300389241962376000826760000B0
:2018120038189E002128FFFF1029103B419238962576006F1B76F0FF00E2BD0030E6000617
:2018320002FE422916561F7633002292419623760101221868002128FFFF1029103B419291
:2018520022962576006F1B76F0FF00E2BD0030E6000602FE422916561F763300229241964F
:20187200237601012292222B2128FFFF1029103B419222962576006F1B76F0FF00E2BD003B
:2018920030E6000602FE422916561F763300229241962376010026760101221878002128BD
:2018B200FFFF1029103B419222962576006F1B76F0FF00E2BD0030E60006422916561029B4
:2018D2002576006F1B76F0FF00E2BD0030E600064229165610292576006F1B76F0FF00E235
:2018F200BD0030E600064229165610292576006F1B76F0FF00E2BD0030E6000642291656D1
:2019120010292576006F1B76F0FF00E2BD0030E600064229165610292576006F1B76F0FF9D
:2019320000E2BD0030E600064229165610292576006F1B76F0FF00E2BD0030E6000642291A
:20195200165610292576006F1B76F0FF00E2BD0030E600064229165610292576006F1B76E0
:20197200F0FF00E2BD0030E600064229165610292576006F1B76F0FF00E2BD0030E6000656
:201992004229165610292576006F1B76F0FF00E2BD0030E600064229165610292576006FC6
:2019B2001B76F0FF00E2BD0030E600064229165610292576006F1B76F0FF00E2BD0030E68B
:2019D200000602FE422916561F7633002292419623760100267601012292222B2128FFFF45
:2019F2001029103B419222962576006F1B76F0FF00E2BD0030E6000602FE422916561F7615
:201A120033002C92419623762000267639012C922C2B2128FFFF1029103B41922C9625764D
:201A3200006F1B76F0FF00E2BD0030E6000602FE422916561F7633002C92419623762000FD
:201A5200267639012C1832002128FFFF1029103B41922C962576006F1B76F0FF00E2BD009F
:201A720030E6000602FE422916561F7633002292419623760100267601012218F80021285B
:201A9200FFFF1029103B419222962576006F1B76F0FF00E2BD0030E6000602FE422916560B
:201AB2001F7633002292419623760100267601012218FA002128FFFF1029103B41922296FF
:201AD2002576006F1B76F0FF00E2BD0030E6000602FE422916561F763300309241962376DE
:201AF200800026760000301803002128FFFF1029103B419230962576006F1B76F0FF00E29D
:201B1200BD0030E6000602FE422916561F76330032924196237600012676000132187500AA
:201B32002128FFFF1029103B419232962576006F1B76F0FF00E2BD0030E6000602FE42297D
:201B520016561F7633003292419623760001267600013218FD002128FFFF1029103B419288
:201B720032962576006F1B76F0FF00E2BD0030E6000602FE422916561F763300309241960E
:201B920023768000267600002C1823002128FFFF1029103B419230962576006F1B76F0FF29
:201BB20000E2BD0030E6000602FE422916561F76330032924196237600012676000132189D
:201BD20071002128FFFF1029103B419232962576006F1B76F0FF00E2BD0030E6000602FED7
:201BF200422916561F7633003292419623760001267600013292322B2128FFFF1029103B76
:201C1200419232962576006F1B76F0FF00E2BD0030E6000642291656237639011029257654
:201C3200006F1B76F0FF00E2BD0030E60006422916562576006F1B76F0FF00E2BD0030E6D2
:201C520000064229165610292576006F1B76F0FF00E2BD0030E6000602FE422916561F76AB
:201C720033002C92419623762000267639012C1837002128FFFF1029103B41922C96257685
:201C9200006F1B76F0FF00E2BD0030E6000602FE422916561F7633002C924196237620009B
:201CB200267639012C922C2B2128FFFF1029103B41922C962576006F1B76F0FF00E2BD009E
:201CD20030E6000602FE422916561F7633002C92419623762000267639012C183300212853
:201CF200FFFF1029103B41922C962576006F1B76F0FF00E2BD0030E6000602FE422916569F
:201D12001F7633002C92419623762000267639012C1822002128FFFF1029103B41922C96FF
:201D32002576006F1B76F0FF00E2BD0030E6000602FE422916561F76330038924196237673
:201D520000082676000038189F002128FFFF1029103B419238962576006F1B76F0FF00E206
:201D7200BD0030E6000602FE422916561F7633003892419623760008267600003892382BCE
:201D92002128FFFF1029103B419238962576006F1B76F0FF00E2BD0030E6000642291656A9
:201DB2002576006F1B76F0FF00E2BD0030E60006422916562376390110292576006F1B764E
:201DD200F0FF00E2BD0030E60006422916562376391110292576006F1B76F0FF00E2BD002B
:201DF20030E600064229165610292576006F1B76F0FF00E2BD0030E6000602FE4229165689
:201E12001F763300309241962376800026760000301801002128FFFF1029103B41923096ED
:201E32002576006F1B76F0FF00E2BD0030E6000602FE422916561F7633003092419623767A
:201E52008000267600002C922C2B2128FFFF1029103B419230962576006F1B76F0FF00E26F
:201E7200BD0030E6000602FE422916561F7633002A92419623761000267610012A922A2BDE
:201E92002128FFFF1029103B41922A962576006F1B76F0FF00E2BD0030E6000602FE422922
:201EB20016561F7633002A92419623761000267610012A1802002128FFFF1029103B419211
:201ED2002A962576006F1B76F0FF00E2BD0030E6000602FE422916561F76330024924196BF
:201EF200237602002676000024181F002128FFFF1029103B419224962576006F1B76F0FF5C
:201F120000E2BD0030E6000602FE422916561F763300269241962376040026763D01269297
:201F3200262B2128FFFF1029103B419226962576006F1B76F0FF00E2BD0030E6000602FE9F
:201F5200422916561F76330024924196237602002676000024180F002128FFFF1029103BF6
:201F7200419224962576006F1B76F0FF00E2BD0030E6000602FE422916561F763300269226
:201F920041962376040026763D01261826002128FFFF1029103B419226962576006F1B7688
:201FB200F0FF00E2BD0030E6000602FE422916561F76330024924196237602002676000002
:201FD2002492242B2128FFFF1029103B419224962576006F1B76F0FF00E2BD0030E600064D
:201FF20002FE422916561F763300269241962376040026763D01261826002128FFFF102946
:20201200103B419226962576006F1B76F0FF00E2BD0030E6000602FE422916561F763300F0
:20203200249241962376020026760000241808002128FFFF1029103B419224962576006F24
:202052001B76F0FF00E2BD0030E6000602FE422916561F76330026924196237604002676CC
:202072003D012692262B2128FFFF1029103B419226962576006F1B76F0FF00E2BD0030E66E
:20209200000602FE422916561F76330024924196237602002676000024180C002128FFFF36
:2020B2001029103B419224962576006F1B76F0FF00E2BD0030E6000602FE422916561F764C
:2020D2003300269241962376040026763D012692262B2128FFFF1029103B419226962576B7
:2020F200006F1B76F0FF00E2BD0030E6000602FE422916561F76330024924196237602005D
:202112002676000024180E002128FFFF1029103B419224962576006F1B76F0FF00E2BD0046
:2021320030E6000602FE422916561F763300269241962376040026763D0126183E00212807
:20215200FFFF1029103B419226962576006F1B76F0FF00E2BD0030E6000642291656102907
:202172002576006F1B76F0FF00E2BD0030E6000602FE422916561F7633002892419623763F
:2021920008002676080128180F002128FFFF1029103B419228962576006F1B76F0FF00E269
:2021B200BD0030E6000602FE422916561F76330028924196237608002676080128180F006F
:2021D2002128FFFF1029103B419228962576006F1B76F0FF00E2BD0030E6000602FE4229E1
:2021F20016561F763300289241962376080026760801281803002128FFFF1029103B4192E1
:2022120028962576006F1B76F0FF00E2BD0030E6000602FE422916561F7633002892419679
:202232002376080026760801281803002128FFFF1029103B419228962576006F1B76F0FF1D
:2022520000E2BD0030E6000602FE422916561F7633002A924196237608002676080128927F
:20227200282B2128FFFF1029103B419228962576006F1B76F0FF00E2BD0030E6000602FE58
:20229200422916561F763300289241962376080026760801281802002128FFFF1029103BA9
:2022B200419228962576006F1B76F0FF00E2BD0030E6000602FE422916561F7633003292D3
:2022D20041962376000126760001321875002128FFFF1029103B419232962576006F1B761E
:2022F200F0FF00E2BD0030E6000602FE422916561F763300329241962376000126760001B1
:202312003292322B2128FFFF1029103B419232962576006F1B76F0FF00E2BD0030E60006DF
:2023320002FE422916561F763300329241962376000126760001321831002128FFFF10291F
:20235200103B419232962576006F1B76F0FF00E2BD0030E6000602FE422916561F763300A1
:202372003292419623760001267600013292322B2128FFFF1029103B419232962576006FE8
:202392001B76F0FF00E2BD0030E6000602FE422916561F7633002E92419623764000267645
:2023B20000002E922E2B2128FFFF1029103B41922E962576006F1B76F0FF00E2BD0030E651
:2023D200000602FE422916561F7633002E92419623764000267600002E1828002128FFFF85
:2023F2001029103B41922E962576006F1B76F0FF00E2BD0030E6000602FE422916561F76FF
:2024120033002E92419623764000267600002E1820002128FFFF1029103B41922E96257608
:20243200006F1B76F0FF00E2BD0030E6000602FE422916561F7633002E92419623764000D1
:20245200267600002E1838002128FFFF1029103B41922E962576006F1B76F0FF00E2BD00C5
:2024720030E6000602FE422916561F7633002E92419623764000267600002E1838002128BC
:20249200FFFF1029103B41922E962576006F1B76F0FF00E2BD0030E6000602FE42291656F5
:2024B2001F7633002E92419623764000267600002E183E002128FFFF1029103B41922E9650
:2024D2002576006F1B76F0FF00E2BD0030E60006422916562376390110292576006F1B7627
:2024F200F0FF00E2BD0030E6000602FE422916561F763300229241962376010026760101BE
:20251200221848002128FFFF1029103B419222962576006F22761F767D0316D0008F806FB6
:202532003A9294CDFCFF03901F76BE0118D0A8CA16961F767D033B9294CDFCFF03901F760E
:20255200BE011AD0A8CA18961F767D033C92019094CDFEFF1F76BE01A8CA1BD01A961F76D8
:202572007D033D9201901F76BE0194CDFEFFA8CA1B961A7669FF060016D0008F806F1F769D
:202592007D039492039018D03A96949203901AD03B96949201901BD03C96949201903D96C6
:2025B20022761F76BE011618FCFF1818FCFF1A1A01001B1A01001A7669FF0600A9881F769A
:2025D2007D03319200D4003102521860A640036D008F0008A641056DA9A8A91A0002A98A46
:2025F200A642046DA9A88050A98AA643046DA9A80850A98A1F76BF0102A81F767D0331920F
:2026120003524960A69205601F76BF01041A0008015205601F76BF01041A000202520560AC
:202632001F76BF01041A8000035205601F76BF01041A0800045205601F76BF01041A020030
:20265200055205601F76BF01041A0001065205601F76BF01041A4000075205601F76BF01B5
:20267200041A0100085205601F76BF01051A0008095205601F76BF01051A00010A520560F8
:202692001F76BF010D1A20000B5205601F76BF010D1A04001F767D03319201521F60A640BA
:2026B200056DA9A8A81A0008A98AA641056DA9A8A81A0001A98AA642056DA9A8A81A000239
:2026D200A98AA643036DAA1A0200A644036DAA1A10001F76BF0104A80CA906001F767D0397
:2026F200319202520660008F880A1F76BF0104A8015209602FFF00161F76BF01128F000033
:20271200021E0AA81F767D03319203520B60A928CB0BA82800091F76BF01248F0000021E95
:202732000AA8060022761F76BE01408F806F061800000F8F00F0A5C4071800FF08183F0093
:20275200091800FF1BDD0BDE1606A918C0FF161EA9A818C0A89219C0C618EFFF0B18DFFF8D
:202772000B18BFFFC518F7FF1A76008FC06F1F767D03BF56300109D0CC92C4FF01F001906E
:2027920030721F76BF010192C3FF1F767D0301F0019080FF30721F76BF010192C5FF1F76E2
:2027B2007D0301F0019081FF30729492C2FF01F0019082FF309430960352036104520360FD
:2027D200BF5631010152036102520360BF5631030552036106520360BF563106075203606B
:2027F200BF56310208520360BF5631040952136131920152036106520360BF5635010252D5
:20281200036103520360BF5633010152066105520461056FBF563105BF56320131920152AE
:20283200036103520360BF56340202520360BF563401045217610152BF5636010360BF5639
:20285200370203520A610152086106520B601F76BF01021A80000A6F1F76BF010B1A0010FA
:20287200056F1F76BF010D1A001006520E6103520961015204610D1A0080096F0B1A008044
:20289200066F0B1A0040036F021A800006520B6104520961025204610B1A0004066F0B1A3E
:2028B2000040036F021A000206520661045204610B1A0020036F021A0800227604520A6287
:2028D20004522461015240610252346103522661446F0552116106524060088F8A021F7626
:2028F200BE01059AA82801FC0AA81A1E1F76BF01021A0800326F088F00001F76BE01049A0E
:20291200A82801BC0AA81A1E286F088F49031F76BE0105020AA81A1E206FA928CB0BA82869
:2029320008091F76BE010A1E059AA828257C1A1E146F088F8A0B1F76BE01059AA82801F845
:202952000AA81A1E0A6F2FFF10161F76BE010A1E059AA82813BC1A1E1A7669FF0600BDB24F
:20297200BDAABDA202FE1F767D03319200D200D3025232601F76BF0116D0008FC0DB09921C
:20299200C1FF94CDFEFF01F016D116D00190A8CAA9CDFDFF949616D0099203F01F766F032F
:2029B2000290A8CA9C9600CDFFF39492039089FFA8CA00961F76BF010040036C0102A98691
:2029D2000042026C02DA004A026C04DA0044026C08DA10D0947A1F767D0331920152316085
:2029F200408DC0DBA18A1F76BF01A183012916DCC418FDFF16DD0992C3FFA18A03F00290C5
:202A1200C59816DCC418FBFF0992412B008F78DFC1FF01F00190A95D20FFFFFF40763E80B9
:202A32000356A902A18A1F766F0316D0079016DCC49800CDFFE79192069089FFA8CA009687
:202A52001F767D03319204525B60408DC0DBA18A1F76BF0116DCC418FEFF01CC0004C9FF2F
:202A7200412BA95D008F78DF20FFE80340763E8016D91F76BF010190C198014B026C01DAAB
:202A92000148026C02DA0945026C04DA0942026C08DA014A026C10DA0147026C20DA0944BC
:202AB200026C40DA0044046CA9AA8009A9860149056CA9AA18FF0100A9860941056CA9AA5A
:202AD20019FF0100A986004B056CA9AA1AFF0100A9860045056CA9AA1BFF0100A9860940A8
:202AF200056CA9AA1CFF0100A986004A056CA9AA1DFF0100A98610D0008FC0DB947A1F76AE
:202B12007D033192065210601F76BF010046026D01DA0048026D02DA004B026D04DA10D0A8
:202B3200008FC0DB947A1F767D0331920552E0FF89001F76BF010945036D01DA026F10DB6A
:202B52000944036D02DA026F40DB0042036D04DA056FA9A21CFF0100A9820044036D08DA12
:202B7200056FA9A21DFF0100A9820046036D10DA056FA9A21EFF0100A9820040036D20DAEA
:202B9200056FA9A21FFF0100A9820048036D40DA056FA9A21FFF0200A982004A056DA9AA2F
:202BB2008009A986056FA9A21FFF0400A9820043066DA9AA18FF0100A986056FA9A21FFF12
:202BD2000800A9820045066DA9AA19FF0100A986056FA9A21FFF1000A9820047066DA9AA38
:202BF2001AFF0100A986056FA9A21FFF2000A9820041066DA9AA1BFF0100A986056FA9A242
:202C12001FFF4000A982004B066DA9AA1CFF0100A986056FA9A21FFF8000A9820049066D79
:202C3200A9AA1DFF0100A986056FA9A21FFF0001A9821F767D0310D0008FC0DB3EA2947ACD
:202C5200008FC06FCC92013B1F76BF01C4FF01F0019009D0A985A9860192C3FF01F0019063
:202C720080FFA9850156A2000192C5FF01F0019081FFA9850156A2009492C2FF01F00190B3
:202C920082FFA9850156A20017D0008FC0DB82FE947ABE82BE86BE8B060006000052A88880
:202CB200C48A096509520763FF9CC4CDF8FF0790A8CAC496A69245520D614E5208614F5214
:202CD2000D60C41A2000C418BFFF086FC418DFFF056FC41A2000C41A4000A592015203602F
:202CF200C4187FFF02520360C41A8000C418EFFFC418F7FF0600BDB200D5013B008F40DE84
:202D1200A9A8A581A98AC47D01DDA5924652F76433D1008F40DE34D0BF569C0CBF56940C87
:202D32001F76400335D03BD1BF56940836D0BF56940937D0BF56941038D0BF56940839D0AD
:202D5200BF56940C3AD0BF56940C3DD0BF569C053CD10092FE9C949641D00092FF9C94965F
:202D72003ED0BF56940810D0BF56DC08BF56E465BF56F408BF56940DBF56EC1BBF569C12A5
:202D9200BE8B0600A9BD120F00770077BDB21F7671038BE60100A48B50E8094088E23C001D
:202DB200407696B788E6000000770077A9BF120FC18AA993B7FFFF91D497C18AFF90DC9695
:202DD200BE8B06000852A927A4C50960089A01D54E9B4076BB93008D3B03972BAB9209520C
:202DF2000B60089AA78A01D54E9B4076BB93008D3B03BF5697010600A71EBDB2A492BDAA71
:202E12000152BDA22A60008F5070C08D40D01F76410300A822761F76BE01408F45B609CDAB
:202E3200FFF7A81A0004008F00B6099709CDFFFD1F763700A81A000100A01F76BE010997EA
:202E52001F76370002A81F763300321A0100321A0200237600011A7602523360008F507720
:202E7200C08DC0D31F764F0300A82276408F806F1F76BE01FDCDFFEF8076BBB5A58AA81A18
:202E92000020079716DD07CDFF3F1ADCA81A008007971F763700C518CFFF408F76B5C41A38
:202EB200040004C21F763300321A04001F76370006A01F763300321A0800237600011A7666
:202ED200D396A38A01D54E9B69FF089AC3864076BB93A2C4A2830BD0A28A0CDE0CDDC61AEF
:202EF20000400ADCC518FFDFCA18BFFFCA18DFFFCA18F7FFCA18FBFFCA1A0200CA1A010000
:202F1200C418FFBF92CCE0FF0BD0015092964076E893A38AA70640762F94D39202520560D2
:202F32001F76BF01081A0400C38A099ABF56E402A38A40764F94408D33030CD0932BA28A8A
:202F5200008D9E01932B9B2B0BDCC41A4000CA1A2000BE82BE86BE8B06001F764103BF56E5
:202F720002011F764F03BF5602021F764003009606000002008D4203941E0600BDB2BDAA66
:202F9200A486008D3A0392923660A9AA13FF6700A98A008D360301020156C4009206008D69
:202FB2003803920F0466C28ABF56E40208D092C5A7C408D0090201DE92C2C207A98A008D39
:202FD2003603C792C4969206008D3803920F4966C28AE446FE6CA28A099A40764F94D29297
:202FF200025205601F76BF01081A0400008D9E01922B376F008D3803928A408D3803A492DA
:20301200008D36030190A98801DC9AA89206008D3803920F0466C28ABF56E402A6920B60A2
:2030320008D092830902C207A98AC592A7FFFF90C4960D6F08D09283A5C408D0090201DE10
:2030520092C2C207A98AC592FF90C496008D36039206008D3803920F0466C28AE446FE6CBD
:203072001F763300211A0001BE86BE8B0600BDB200BEACA0BDAAA486BDA2A98201DEA61B73
:203092003075FD69D292025205601F76BF010818FBFF00BE01DEA61B1027FD69408D360386
:2030B200A9AB08D09AA20109921E008D3A03922BC28AE446FE6CA28A089A40764F9401BE4F
:2030D200008D38030102A30F92C21C68A7AB0902C207A98AC792C496C28AE446FE6C00BEDF
:2030F20001DEA61BE803FD69A28A099A40764F94D292025210601F76BF01009A081A040028
:203112000B6FC28A0902A7ABBF56E401C207A98AC792C496009ABE82BE86BE8B0600BDB2F5
:20313200BDAAA486EFFF3901C28AFCCCFF00A958EC47EDFF2C01408DA0019A92E0FF2D01BD
:20315200408D3B039A920152116000BE408D3D03BF569A01408D34039AC2408D3F039A2BB3
:20317200408D3E039A2B0DD19A2B408D3F039A92E0FF1301408D3D039A924F60F2C4208F4C
:203192000000A9A8A60F06662F8F0000A9A8A60F0867608F00000AD1208F0000F2A09AA82B
:2031B2000CD19A923A52E0FFF800408DA0019A922E60408D34039AC4A692A94001DE9AC2AB
:2031D200066DF28A0356A008C496076FF28AA9A80109F21EA092C498008D34039206E20F5B
:2031F200E8FFDB000FD10CD0BF569A33A28A099ABF56923340764F94408D3F03008DA001DE
:20321200BF569A01BF569201EFFFC700008D3F03BF569201EFFFC100408D3E039A923E6091
:20323200A0921F760E03305425611F7674033D5403603D921F60A088408D31039A0EA60FC6
:203252000560408D33039A921560A0921F7674033C5407603C920561408D33039A920A6150
:20327200408D3F03008D3D03BF569A01922BEFFF9400408D32039A78408D3E039A80019A9A
:20329200013BA7949A96A9AAA781A98A0ED1089A9C78A28A40764F947F6F9A80019A013B8E
:2032B200A7949A96A9AAA781A98A0ED19C78408D3E039A9207520E600DD19A9210520A6019
:2032D200408D33039A9206600A9A1F767903A0941096408D3E039A9203520B600DD19A59ED
:2032F200A19204520660059A008F40DEA0949C96408D3E039A9202521A60A0920DD10352AE
:203312009A78336842523166008F40DE949203522C68A09233520B600CD19A923A522560CB
:20333200A09233520460008D3D03922B0DD09258408D3E03008F40DE9A9294540467A91B11
:2033520090012A68A28A099A40764F94408D3D039A2B0DD0408D3F03BF569A01408DA001F4
:20337200BF569A01922B186FA28A099A40764F94408D3E039A2B0DD0408D3D03BF569A0172
:20339200408D3F039A2B922B076FC28ACC18DFFFC28ACC1A2000C28AEC46EDFFC7FE1F76F0
:2033B20033000BDC211A0001C41A4000BE86BE8B0600BDB2BDAAA486A61EBDA2A582D29246
:2033D200025205601F76BF010818FBFF408D360308D09AC292A2008D3A03BF569201C28A87
:2033F200E446FE6CA28A089A40764F94008D38030102921EC28300BE0902BF56E501C20773
:20341200A98AC392A7FFFF90C496A692BE82BE86BE8B06001F76BF0100920093C5FFD7FF64
:2034320001F001F10190019190FFA9CB0092CAFF01F0019081FFA8CA060009D0008FC06F05
:203452001F76BF0194CD0004D9FF09CC004090FFCDFFA9CBC492C2FF01F0019081FFA8CA59
:2034720006001F767403BDB20593A9800153BDAAE0FFFD001F767D0331930653E0FFF70059
:203492001F7671030493E1FFF2001F767403039302CBE0FFEA007FD0008FC0DB1193948837
:2034B2001660A646036C1546086CA647036D1547046D00530C600F6F061B7C0103680628BC
:2034D2007B01122B1128E803A71A0001061BF702E7FFC800A7920552056012930361A71AB4
:2034F2000002AC28F802AB282A00AA2B0B30608F0000ACA9080D6556A900A9A90156A500D2
:203512001E06C5961E06CD97D57FDD7E40767797E59640768A971F767E03ED9608921F7605
:203532007E03F5960680008FC0DBFD7FA4C508D009D11CDC7BDFC792A4C5008FC0DB9596BD
:2035520000D0C7929D96A9A80AD1A00DA71E5AFFA092A17218DFC7929D96A7A9A0920ED1DD
:20357200A17201D8C7929D96A0920452ED681F76740312D01392C076D1DF13D1959614D078
:20359200C7929D9615D1CF92959616D0D792A4C59D9614921F767D0350DF959617D018928A
:2035B2009596A9A851095AFFC792A7A918D119D09D96C7929596A9A87909A71EC792A4C53E
:2035D2001AD11BD078DF9D96C7929596A9A87A09A71EC792A4C51CD06FDF9596C792A4C573
:2035F2001DD01ED11F7674036EDF008F86DE95961FD0C7929D9620D11892959621D0199289
:203612009D9622D11A92959600D01B929D9623D11C929D9624D1A092A172949301D8A092AA
:203632009D970452F868C076DDDF28D129D01F767403C7929D96CF929596157EE5921696D0
:20365200A928F802ED93080A179708540260082B061BF8020267060A010201562000066FD9
:20367200BF561201036FBF560503BE86BE8B0600BDB2A888A98001D1BDAA0876303BBE5AEC
:20369200008F0010AA2BA727A9A8AB0F2A60A6935161A9A8AB0F2560A693015322601F7622
:2036B2007D03319206521D601F767103049219611F767403059201521461062BC076C0DB5A
:2036D200082B112B102B072B7FDF0A2BC7921596032B022B019ABF56050140769E972F6FCB
:2036F20020FF0110AB0F0B601F767403059201520661A6930461A61BE8031A6920FF021008
:20371200AB0F0460A61BF8020F68A78020FF0310A70F0860A692015205661F767403107E40
:203732000E6F00D10C6F1F767403077E086F097E066F1F767403BF560503112BBD7A007698
:20375200A192BE86BE8B06001F76740306930B8808920F0A0B1C0100112B062B0D970C7EE3
:203772000E96082B0600BDB20876303BBE591F767403059201521860010201561E000A0AF1
:2037920009920A5405660A2B019A40769E971F76740311920961FF9C11960660059A4076E2
:2037B2009E9740761199BD790076BE8B0600BDB20876303BBE59049A40769E97BD790076C3
:2037D200BE8B06000052A88005611F7674030D93046F1F7674030693005203610E88026F27
:2037F2000888005203610C27026F0B27A7550366009A1B6FA692A89EA794A908F802A91BEA
:20381200F8020668A90808FDA91BF802FC67AC28B07CAB32AC282A00A930AB07A40D208F91
:2038320000000156A400C4920600A927AB93A80800F00F5337660356AB01A988A60800E0AE
:20385200C076DAC3A706A60DA71EC7C52076A9284D55EFFF99002A9AEFFF9600A928F8022F
:20387200EFFF92001F7674030992EFFF8D001F7674031E06EFFF88001F7674031E06A80E08
:20389200EFFF82001F767D0331927D6F1F767D033092796FA928E803766F1F7674031192D3
:2038B200726FAB1B10105A68AB1B88101A671F76740310930460059301531361AB92A9082D
:2038D200F0EF2A9BA927C0005BBBA95C2ABEAB0E0FF6A61FA9931092079540764F99536F42
:2038F200AB1B00113B68AB1B7C1138671F767403069302530468AA280200026F062F200644
:20391200AB0800EFAA01A61EAB920360A6923B6F01520460A606A80E366F02520360AA9251
:20393200326F035205601F7674030F922C6FFC9C2ABEA927AB0E0FF6A61FA95DAA93A555C2
:203952000D69AB922A9BC0005BBBA95C0693AA9F009AA59540764F99166F009A146F1F7677
:203972007403109205611F7674030D920C6F06920A6F1F76740310920361039A046F1F76C8
:203992007403059206001F7674030592BDB2015227601F767D033192065222600876303B7A
:2039B200BE597FD0008FC0DB94881F767403150EA60F116040767797A9881F767403160ECF
:2039D200A60F096040768A97A9881F767403170EA60F0461039A40769E97BD790076BE8BE7
:2039F20006001F767403052B00B600BE062B009B00D0008FD1DF0F2B0E2B0D2B122B112B00
:203A1200102B142B132B0B2BBF560C01072B082BBF5609140A2B1EC320C2942B01D8A0922B
:203A32000352FC6800D0008FDDDF942B01D8A0920252FC681F7674031A2B192B182B1C2BFF
:203A52001B2B1597169717970600BDB2BDAA04FEA92F1F767D03A82D31920652426008762C
:203A7200303BBE59AACCFF1FAB28008000D04321A980427C417DAB92AACE1761A75A20FFA5
:203A92003101A20F0860AD8883DEA6881F767F0396921D96A79208520860AD8883DEA68854
:203AB2001F767F0396921E96AB9201D8C0FF01DFA927A0920352E0681F76740305920152B7
:203AD2000E6013578076D1DFC621029ACE7CD67D140A40769E97BD790076036FBD79007663
:203AF20084FEBE86BE8B0600608F00001F767403208F00FA22A024A82206261E282B220686
:203B1200046FA98A842BA9A81F767403240FFA680600BDB2A9A8BDAA10FFA101A98BA48610
:203B3200408FFFFFA98ABF56C1100602BF56C904D12BD92BE12BBF56E930407648B8A9CD3D
:203B5200FF00008D9E01A7FFFF90F197A28AA183F9960802BF5692014076A495BE86BE8B5E
:203B72000600BDB200BE00D0408FC0DBAA2B008F80DCA9A8A00DA98A9580C427A70EAB0F66
:203B92000361C47F01BE01D8A0928052F168A6921061408D80DC809AA18A407659B880D049
:203BB200A82802019196A18AA9287E3F40768FA5BE8B0600BDB2BDAABDA2AD5A88DAAD08B4
:203BD2008200A48B0ED90356D108D9CAA988A482A61B00100367009A3E6F0356E108E9CA98
:203BF2000876303BBE93AD5CAD5D08D09297A40880FFA5087FFFA6934196A45CA55DC992A2
:203C1200407663A0A98008D09292BD9600761F767403AD5CA9A23D8809D0A40880FF10FFB3
:203C3200A101417EC988A983A45CA98B427E9292439620FF9001447F4076DE9E00520A6141
:203C5200008D9E01A90EA38AA183BF5693014076A495019AAD087EFFBE82BE86BE8B0600E6
:203C7200A888A927BDB2A9A8A48B1F767403BDAA10FFA101408FFFFFA71EA986A98AAB92EE
:203C92003D278050C73FCF960302D77E407648B8A9CDFF00A7FFA283008D9E01FF90A18A3D
:203CB200DD97E5960502BF5691014076A495BE86BE8B0600BDB2A48B4076479B00523760B4
:203CD20000D5008DA101A9B2A50DA71EA9B2A50DA98A01DD0EDFC7929496A5920852F46881
:203CF200A18A0EDC0356D408DCCAA9580356E408A093ECCA80531667008FC0DB9496A092BD
:203D12007F52036040764499A9B2008D9E01A18A10FFA101BF569101A9830A024076A49599
:203D3200066F069A029BA18A40769D9BBE8B0600BDB2BDAABDA202FEA4864076479B00520E
:203D52007E60A28A0EDC0356D408DCCAA9270356E408ECCAA988FF9C7D526C67AB9280523A
:203D72006967809AAB9EA6546568A9AA10FFA101A71E00D41F7674033D92C7960356A60162
:203D9200BF56CF03D796A6921E61A458AB92408FC0DB03D1A0720356A401A980A9AA952F3F
:203DB20010FFA101A983A792A17204D0AA92C7FF9D96A792A07201DCAACCFF009596A692BF
:203DD200A454E4660356A6014196A993039A408FFFFFA894A959A9AA10FFA101A982A98A72
:203DF200A10E407648B8A9CDFF0004D0A7FF9B974193A073FF90AB280500089B9396AB92D4
:203E120041944195A958069A4194A980079A4194932BA758A859932BA958A28AA383A10E52
:203E3200932B008D9E019B2BBF5692014076A495066F039A029BA28A40769D9B82FEBE82A0
:203E5200BE86BE8B0600BDB2AC2BAB2808008076ACDF0C3505D106D0A483A172A072A980B9
:203E72000EDD03569D089594AC5807D19696AB92A794A958A793A173009B95929DCA0052D4
:203E92000261019BAC92AC58408FA4DF019C0852A92D9597DF68BE8B0600BDB210FEAD5C68
:203EB20089DCA45DAD5CC0768CC38FDCA45C08F6852400D0C0769CC305F68424008FC0DBB8
:203ED200942B01D8A0928052FC68A4C51F767D0330921F767D037EDFC7963192045208613F
:203EF20060D162D0BF569C0ABF569408116F1F76700300D0BF562002AD5C8FDCA45C9492B8
:203F1200008F22DC949601D8A0920652F66861D0008FC0DB1F767D03BF569465379204616B
:203F320063D0BF5694141F767D0336921B611F767D0330883092085281DE0365308882DE5E
:203F520000D00129008F34DC0356A603C076C0DEA00D0156A700C792949601D8A09208524D
:203F7200F4681F767D03319201521A601F767D033788012920FFF2FF00D0A60F1161008F9A
:203F9200C0DBA9A8A00DA98A30D101D8BF569C4648D1BF569C3C37920E9CA054F1661F7619
:203FB2007D0331920252216000D0008FC0DBA9A8A00DA98A01D830D1A092BF569CAA0652ED
:203FD20048D1BF569C96F26806D0008FC0DBA9A8A00DA98A01D830D1A092BF569C7308525A
:203FF20048D1BF569C69F2681F767D0331920352116000D0008FC0DBA9A8A00DA98A01D880
:2040120030D1A092BF569C46145248D1BF569C3CF2681F767D03309209521B6000D0013BE5
:20403200AD5C89DCA480008F40DFA7069481A71E008F08DCC792949601D8A0920F52F168EC
:204052003DD1008FC0DB3ED0BF569C46BF5694461F767D03319206522B60008FC0DB30D03D
:2040720032D19428A401A4C531D09428A40133D09C2884037ADF4BD19428840348D0942825
:204092002C0149D094282C014AD0942820039C282003C792A4C56ED051D194967BDF6FD01A
:2040B200C792949650D0BF569406BF569C101F767D0335920A6100D0008F30DC9428000865
:2040D20001D8A0920452FB684076D88390FEBE8B0600BDB2408D80DCA9287E3FA828020123
:2040F200A18A4076D2A5809AA18A407659B8A98080D0A988910EA70F0E60A688012920FF66
:20411200FFFFA60F08611F767D0330887ED0910EA60F15614076BA9C408DC0DB7FD0912B0D
:2041320040761E9B1F767D03349217617FD91F767103C11A10001128FFFF0F6F00D0008F4B
:2041520080DC9492008FC0DB949601D8A0928052F7681F7670033F2BBE8B06004076A59887
:2041720006000652A888436103520361019A486FA5921C60A492FF9C7D523F67A61B001026
:204192003C68A61B10100667A9281010A69EA4543667A61B10103168A61B88101F67A92827
:2041B2008810A69EA4541A682A6FA68020FF0010A70F0460A49210522261A68020FF10100F
:2041D200A70F0C60A49228521A6150521861785216612A52146154521261A68820FF0011BC
:2041F200A60F0B60A4927C520860096FA61B00100468A61B03100369029A026F009A06007F
:20421200407682990600BDB2BDAABDA206FEA927A85B44A052C44F92A4864196505D46C218
:204232004406036146060360009A366FAB92415CA39340761E9E468A0052C4962860A9AAF7
:204252002361AB9203520461E20604601D6FD2061B61AB9203520961E2C5C28AA3924193AD
:20427200673E00521161136F419200D11561A192D2C5C28AA394673E448A9C9601D9419288
:20429200A154F666096F468ABF56C403448AC47B4193029ACC9786FEBE82BE86BE8B060060
:2042B200A993FF90D7FFC497CC960600A9838076FFFFA9A00360A692146F8492FF90A6F2C4
:2042D20081DD009BA640046CC07601A0026F00B6A692019DC0FFA770A9880853EB67F36F93
:2042F2000600BDB2BDAAABA0BDA2A982A9A04C884B804A58495AA4833061A2922E61F7520A
:204312002C66A0927F522966A792FF52266600522160A9A02261A092035208600352086006
:20433200A692FF9C7C520468186F06521660A09206520460A69202521060A7920B60A09249
:20435200065206610356A601059CA90E046F0802026F0502A30F036900BE4A6FA4A9A79224
:20437200C47ACC782A60A09206521B610356A601D49600D0A6920F610356A001A980A9A9C2
:20439200A70DA98A959203DC4076BD9E01D8A692A054F3660356A601039CA90EAC1E126F0E
:2043B200C59202DC4076BD9EA4A9CD9204DC4076BD9E0602AC1E066FCC1A80000302D47F03
:2043D200AC1EA4A94076C39EA6A9A980A4ABA9AB0156A600A5A901DCA7CDFF00C697A9A839
:2043F20001DC0156A500A4C4A792C7FFC596BE82A606BE86BE8B0600BDB2BDAABDA2AD5A55
:204412008CDAAD0886000ED092A0D28010D0C227CA88927F0CD0DA5B921E0ED092060E61B5
:204432000CD092C5FD02A70F0966A392FF9CF752056710D092927F5203690002216FAD5DB1
:20445200A5087FFFA580AD5D413FA50880FF422BA69344C3A55D4076709EAD5C11D1417B2A
:2044720010D0A40880FF92930ED04297A45C9A934397449692830CD092064076DE9EAD08F2
:204492007AFFBE82BE86BE8B0600BDB2BDAA0AFEAD88C076A2C3AD58808D6D9E408D1B9E6D
:2044B20053278ADEA688522F512D8AD805F6862448AA46B2417DA483A05C42214357443F89
:2044D2004076699F8AFEBE86BE8B0600BDB20AFEAD88C07696C3AD588ADEA6884F27408DD8
:2044F2006D9E8AD805F6862480761B9E48B246C2413FBF56420144A0A483A05C4076709E44
:204512008AFEBE8B0600A4C4BDB2A827A95C4680452FA6061461A9A01261A49202520F68EF
:204532007C520D66A4400B6DC0FFAB540869AA92FF9CFF520467A792FF520369009A1A6FF1
:20455200A68A0356AB01A9599C92A58A4076BD9E01D0A192A072969202DC4076BD9EA58A48
:20457200A928001FAB9404DC4076BD9EF557089AFD7FBE8B0600BDB2BDA20AFEA827A92FD3
:20459200A9A0A5825487528851802C61A9AB2A61417FAD5DAA92AB93427E8ADDA55D407684
:2045B200F09F00521F61012903564A0849AF3FFFA71E03564808A988A38AA706A6AF47AFB9
:2045D200C41E0356460845AF3FFFA71E03564408A988A4ABA706A6AF43AFA71E089AC4C342
:2045F200026F009A8AFEBE82BE8B0600BDB20AFEAD88C076A8C3AD588ADEA6884F27408D5C
:204612006D9E8AD805F6862480761B9E48B246C2413F422B44A0A483A05C4076709E8AFE85
:20463200BE8B0600C493CC92A8380600BDB2BDAABDA204FEA61EABA0A9A0A48B52874D5A40
:2046520050821F61A9A21D610802A60F1A60FD02AC0F1766A292FF9CF7521367A4A9C48892
:20467200A20EA60F0E6000D09492FF520A6601D8A0920852FA6808024076C39E0052036100
:204692000002156FA4A902DC40767FA0A4A9A98804DC40767FA0A4A9417AA383CC934297E9
:2046B200A18A437E4496A9AB4076699F84FEBE82BE86BE8B0600BDB2BDAA04FEAC1EA5C4B0
:2046D200A9A0A48650C54EA34C8E3961A93A3761A9A93561A70633610802AC0F3060A9AB8E
:2046F20000D40D61A683A9A80156A500C592FF52266601DCA483A9ABA50FF566A68A04DC45
:2047120040767FA0A95D20FF001FA50F1860A683F5921561A4A9C496A68A40767FA0A927A0
:2047320002DC40767FA04196BF564201AB93A28A44C3FD92A0834076709E026F009A84FE11
:20475200BE86BE8B0600A988FF9C105203670253036900310B6F0129AB28FFFFAA28B9002A
:204772000356A804A60D0156AB00A9A906000600A983C57C0600BDB2BDAABDA206FE1F76CE
:204792007403A482BF5602010EDCEC92FF90A95AE492FF90A988A9AA37FFA6AFA986DC92A7
:2047B200FF90A988A9AA37FFA6AFA986D492FF90A98809D0A9AA37FFA6AFA9869492FF9059
:2047D20008D0A9599492FF90A988A9B237FFA6AFA98BFC92FF90A988008D3203A9B237FF4C
:2047F200A6AFA98BF492FF90A988408FFFFFA9B237FFA6AFA98BA9A210FFA101A71E441ECE
:20481200A98A9392C7960202BF56CC34407648B8A90E461EA28A465DA9B240761EB841965A
:2048320044830102A38A4076A49544830102A38ABF56C5344076A4954192A90E461EC38A51
:20485200E446FE6CA9B2A38AA28340764697C38AE446FE6CA9A210FFA101A983A38A469264
:20487200A993FF91A7FFFF90C597CD960602D52BDD2B4076A49586FEBE82BE86BE8B060010
:2048920006000600A98AC4920600A988BDB21F767103A9A8008D3203A48BBF560101BDAA02
:2048B20010FFA101408FFFFFA71EA986A98A9193C7970202CF7E407648B8A9CDFF00A2831E
:2048D200A7FFFF90A18AD597DD960602E52BED2B4076A495BE86BE8B0600BDB202FEA48B37
:2048F2000EDCEC92FF90A980E492FF90A988A70637FFA6AFA71EDC92FF90A9880129A7064E
:2049120037FFA6AFA71ED492FF90A988412BA70637FFA6AFA71EFC92FF90A9934196F492F0
:20493200A838419620FF0080A70F0666A706415C407625A1086FAD5CA792029B81DCA45C74
:2049520040768FA5399AA18A4076B2A182FEBE8B0600BDB2BDAA02FE1F767103A486BF5667
:2049720001010EDCEC92FF90A980E492FF90A988A70637FFA6AFA71EDC92FF90A988A706F5
:2049920037FFA6AFA71ED492FF90A988A70637FFA6AFA71E012920FF0080A70F0666A706FA
:2049B2004076AFA14196086FAD5CA792029B81DCA45C4076D2A5A9AA008D320310FFA10162
:2049D2001F767803A71EA98BA98A9292408FFFFFC796BF56CF384192FF90D7964192A7FFD7
:2049F200FF90DF963A92A9CDFF00A7FFFF90E197E9960602407648B8A9CDFF0009D0A7FF82
:204A1200A183A28AFF9008D1F597FD960A029D2B952B4076A49582FEBE86BE8B060002FE17
:204A3200A61EAC281F00013B2256A60740FF0156A400C492A640036CFF90036FA7FFFF9031
:204A520082FE0600BDB2A48BBDAAE1C50AD09183A706A58A021940767CA2A927A706A58AAE
:204A7200011940767CA2A1C5008D3203408FFFFF0EDF0356A908AB94A95AA78A9192C79657
:204A92000202BF56CF33407648B80AD0A95DE106918A021940761EB8A988A20EA60F1061A3
:204AB200008D3C03912BD192025205601F76BF01081A0400A18A099A40764F94096FA18ABB
:204AD200339A4076B2A1008D3C03BF569101BE86BE8B0600A4830EDDED92FF90A980E59228
:204AF200FF90A988A70637FFA6AFA71EDD92FF90A988A70637FFA6AFA71ED592FF90A98894
:204B120009D0A70637FFA6AFA71E9592FF9008D0A90EE41E9592FF90A988E40637FFA6AF0A
:204B3200E41EFD92FF90A988E40637FFA6AFE41EF592FF90A988E40637FFA6AFE41E0202D9
:204B52000156E4000AD01F7674033A9AF4C394C3BF5602014076B2A106000600BDB2BDAA3D
:204B7200BDA2A482008DA00193923D61408DA0010FD09B2B935A008F40DE013BA9A8A28150
:204B9200A98AC49203523268A91B90012F66A29233521A61008F40DEA9A8A281A98AC458FD
:204BB200A059408FFFFFA38A82D981D8A1880EDC035694089CCAA959A606407648B8A18841
:204BD200A90EA60F05600CD0A292937A1C6FD392025205601F76BF01081A0400A38A099AE1
:204BF20040764F94A928FFFF0E6FD392025205601F76BF01081A0400A38A099A40764F94BC
:204C1200A928FFFFBE82BE86BE8B0600BDB206FEA48B0EDCEC92FF90A90E421EE492FF902B
:204C3200A988420637FFA6AF421EDC92FF90A988420637FFA6AF421ED492FF90A98809D09E
:204C5200420637FFA6AF421E9492FF9008D0A90E441E9492FF90A988440637FFA6AF441E4C
:204C7200FC92FF90A988440637FFA6AF441EF492FF90A9880DD0440637FFA6AF441E94921D
:204C9200FF900CD0A90E461E9492FF90A9880BD0460637FFA6AF461E9492FF90A9880AD0C0
:204CB200460637FFA6AF461E9492FF90A9880ED0460637FFA6AF461E94CCFF0004520A6188
:204CD200055212604206448A46C4A6934076D2A5076F4206448A46C4A69340768FA53C9AE4
:204CF200A18A4076B2A186FEBE8B0600C4A0D41A01000600C4A0D41A02000600D493009AE7
:204D1200039100530260019A06001F76BF010118F7FF06001F76BF01011A08000600227617
:204D320008D0408F806F1F76BE0195CCFCFF015008960BDD08CCF7FF0450089608CCDFFFD6
:204D52001050089608183FFF1F76BF01C51A08000118F7FF1A761F76C10169FF0002BF5634
:204D72000007BF56011F022BBF56040D0A2800800B2B0C2BBF560F10D42BC41E001A8000C4
:204D920006001F767C030188BDB2A48BA6921352E6FF5801C076B2C30129A7060456A60162
:204DB200A71EC7C52076C18A020ED40F0561BF560111EFFF470108D091C5673E1F767C0312
:204DD200012B022BD118F7FFD118FDFFEFFF3A011F76C1010246ECFF3501C18A1F767C035C
:204DF200020EC407A71E1F76C10107921F767C03C796BF560113020AEFFF24011F76C10101
:204E12000246ECFF1F0107921F767C03BF5601110396EFFF17011F76C1010246ECFF12011D
:204E320007921F767C03BF56010F0396EFFF0A011F76C1010246ECFF050108D091C5673E99
:204E52001F76C10107400B6DD118FBFF1F767C03D118FEFF012B022BEFFFF4001F767C03FE
:204E7200BF560109EFFFEE001F76C1010246ECFFE90007921F767C03BF56010B0396EFFF5D
:204E9200E1001F76C1010246ECFFDC0007881F767C03037EC18A020ED40F0561BF560107D4
:204EB200EFFFD00008D091C5673E1F767C03BF560109EFFFC7001F76C1010246ECFFC2001B
:204ED20007921F767C03BF5601070396EFFFBA001F76C1010246ECFFB50007921F767C03C9
:204EF200BF5601050396EFFFAD001F76C1010246ECFFA800079208D01F767C03039691C5AB
:204F1200673E1F767C03BF560103EFFF9B00D140086CBF5601010AD0D11A040091C5673EC4
:204F3200D141ECFF8F001F767C030AD0BF56010DD11A080091C5673EEFFF84001F76C1010B
:204F5200BF56008F082B021A20001F767C03BF560112776F1F76C101BF56008FC18AE4924E
:204F72000896021A20001F767C03BF560110696F1F76C101BF56008708280003021A2000D1
:204F92001F767C03BF56010E5C6F1F76C101082B021A20001F767C03BF56010C526F0AD065
:204FB20091C5673E1F76C101BF56008708280005021A20001F767C03BF56010A426F028019
:204FD2001F76C101BF56008FC18AA706C407A71EC79208961F767C03020A1F76C101021AB2
:204FF20020001F767C03BF5601082B6F1F76C101BF56008FC18AE4920896021A20001F7688
:205012007C03BF5601061D6F0AD091C5673E1F76C101BF56008708280002021A20001F768C
:205032007C03BF5601040D6F1F76C101BF56008708280006021A20001F767C03BF560102B8
:20505200BE8B06001F763000A880A927A48E142820400002008F10DF1F7678033A1E4076C6
:20507200EBA30052FD61A792A793C0FF0191A995A880A7922661408F04DFAB9220BE1F907A
:20509200A674A792A6540267A7881F767C03A65C0356AB01043AA90E06A8081E008F10DFB7
:2050B2004076E3A34076EBA30052FD61A93AA60DA98EAB92A694A927A792A69EA980DE60B6
:2050D2001F7630001428104006001F763000A880A927A48E142820400002008F10DF1F76C7
:2050F20078033A1E4076EBA30052FD61A792A793C0FF0191A995A880A7922661408F0ADF35
:20511200AB9220BE1F90A674A792A6540267A7881F767C03A65C0356AB010A3AA90E0CA804
:205132000E1E008F10DF4076E7A34076EBA30052FD61A93AA60DA98EAB92A694A927A79232
:20515200A69EA980DE601F76300014281040060002FE1F767C0314C5008F10DF673E227693
:205172001F763400008FFBB91CA81A7669FF407608B91F7671030F8F40423A0642A8C000CB
:205192006BBAA9BD120F0077007702E84116008F38DE89E60000407647B92376002082FE1F
:2051B200060002FE22761F767D03319204520460008F25B4036F008F77AC1F7634001AA896
:2051D2001A760F8F40421F76710369FF3A0642A8C0006BBAA9BD120F0077007702E8D1233A
:2051F200008F30DE89E60000407647B91F7630000C2820402376001082FE0600BDB2BDAA7D
:20521200BDA24076EDB300D3103B69FF407695BA267600002F760000407648BB407677B95C
:205232004076FF901F767D03009A3093407620A90D9A40761A95418F00C201D4A9A04076B4
:2052520069941F767D0337920860418F00C202D4A9A040766994076F012902D420FF00E11F
:2052720040766994407615A640762990008FC06FA48300D20BDC0CDDC51A0100C41A010043
:20529200012920FF50C3407666B9008FC06FA48301DAA2920EDC0FDDC51A0100C41A010042
:2052B2000A52EF64008FC06FA4830BDC0ADDC51A0100C41A01004076F78F4076E19A407698
:2052D2005E9A1F767D03109B309240766ABB40763EA64076B4BA1F767D0331920452056115
:2052F20040763CAE407638844076AE854076D69D4076D8831F767D0331920652036040761E
:2053120011B01F767D03C076C0DB30927EDFC79622761F76C001BF56292F1A761F76710364
:20533200BF56040169FF40768BA81F76710303927B6163D0032B008FC0DB94920D611F76C2
:205352007F0363D0140A949214540666142B008FC0D34076F69A00D2008FD7DF013B408FA5
:20537200C0DBA9A8A281A98AA9A0A281A98360D0C40A9592C4545466005252611F767F032E
:2053920017924E61408FBEDEC42BA9A0A281A98AC49280520868008FBEDE013BA9A8A28137
:2053B200A98AC42B013B086F109AA794A9CCF0FFC4968052F167008FBEDEA9A8A281A98A67
:2053D200C4800356A203408FF0D8A61EA792C3FFA927A606AB0D0156A500A7CD0F00A82D9B
:2053F200C59262FFA988E161013B0A6F008FBEDEA9A8A281A98AA692A0FFA988C40AA6402D
:20541200F66C408DBEDE013BA9B2A281A98B008FC0DB009AC193407638AAC108030001DA6A
:20543200A29202529A647FD0008FC0DB9441066C7FDCC418FDFF4076BA9C7FD0008FC0DB5C
:205452009442066C7FDCC418FBFF40761E9B7FD0008FC0DB9443066C7FDCC418F7FF4076AD
:20547200D69D7FD0008FC0DB9445066C7FDCC418DFFF4076538040761C921F767D03319209
:205492000152136016D0408FC0DB9592A58AC1FF01F016D0A3CE0356A9027FDC0790C49834
:2054B20095CC0400C1FFA95B319206525A607FD0008FC0DB94921F767F03A99300B6D6FF5F
:2054D200C5FF01910190A9881592026001B6A892A7CE1B61008FC06FA4831F767D030BDDD5
:2054F200C51A0040319206520761045205610DDCC41A0020056F1F76BF01041A0800008FD7
:20551200E8031F767E0308A81F767F03169200B61597026001B6A693A7CF16611F767D0353
:2055320031931F76BF010B1A000406530661045304610B1A0020036F021A0800008FE80346
:205552001F767E0308A81F767F03167E1F767E03080607601F76BF010D1A00400D1A000456
:205572004076309A00D2A2920461408D40D0036F408DC0D3A18A40761BA3A91BFFFF596164
:205592001F76BF0100BE0F1A01001F767E03375222C213623752326133520A6233523A6197
:2055B2000352446104523E6106523861426F34522D61355227613D6F3A5208623A52126184
:2055D2003852186139521261346F3B5207613C523060A18A407673A32C6FA18A40761AA3D2
:2055F200286FA18A4076D7A2246FA18A4076DAA1206FA18A407616A21C6FA18A4076ADA1D7
:20561200186FA18A4076AEA1146FA18A407628A1106FA18A40768FA20C6FA18A4076C79B45
:20563200086FA18A4076909C046FA18A4076059C01DAA2920252E3FF77FE966FBDB2BDAA4A
:205652000AFE1F767D03219225611F76800108421A6D0A420A6D1F767803FABE32061F76A3
:205672007D032E03A60F7C6904021F768001061E0A42766C1F767D03212B1E2B1F7680019F
:205692000A1E0D6F1F767D030402212B1F768001081E1F767D031E921F5423661F767D03DB
:2056B2001A921C610876303BBE5A1B59AD5D1C93008F40DD1D88A1CCFF0089DD1A2BA55D17
:2056D200417E4076D39F1F767D03A1CD00FF1F2B49CB1E962097BD7A00761E921F5440690D
:2056F2001F7680010406A9403B6D1F767D032092AD5CAD5DC7FF1F93419686DC88DDA488CB
:2057120020C6D0FF4296A55D008F40DD1E9244C2407628A0005205601F767D031E2B206F64
:205732001F76780332C5040204BE1F768001468A48A3081E1F767D031F0802001F7680013D
:205752000AC21F76840116A81F767D03BF5621012EC31F76840114A91F768001041E8AFEBF
:20577200BE86BE8B0600BDAA34FEA892FF9C0564105204640F9A026F009A22761F76BE0143
:20579200AB28F0FFAA28457F09CDFFDF013B08B6A81A0010A4A908BE099700D209CDFF3F86
:2057B200A81A00400997A9851F7680015AFF2AC35D56A400A0A9AB2BAA28467F08D42CC2D4
:2057D200ACA91F7684015AFF5D56AC0002A8A5A9AB28E0FFAA28457F0AC3AB03AB28FAFF09
:2057F200AA28FFFF12C21F76800107BE00AA1F768401003A08A0101E1F76800102A900C2C1
:2058120000BE0002011960C2601A80F2081E000260C401190C1E000201191E1E000201198A
:20583200221E00020119181E14C21844FF6C16065E1E5E18FFFD5E1A00015D1800FF5D1AB9
:2058520005005E1A7F005E18FAFF5EC416C26018FFEF6006141E1844FF6D0002488F70645E
:205872001F768301541E088F7064541A010000A00031531A0200010200BE02A8541A060092
:205892001F768001408FBEB800D4301E54C5020232A82EA9008F93B81F76370008A01F76C8
:2058B2008001241E26C220C31F7637000AA81F763300321A1000321A2000237600011A7610
:2058D2001F767D0369FF000200B6182B261EB4FE22C224C3BE86060006FE00021F767E0317
:2058F2000ED0221E94A3AA8820FF001F0CD094C5A60F3D61A9A9A80EA958463FA0CC0080CF
:205912004396A0CC00404296A0CC00204196A706A018FF1F45974392447F00520861A092D1
:20593200805205674692008FC0DB9496429201D80861A092805205674592008FC0DB94963A
:20595200419201D80861A092805205674492008FC0DB9496A9A9455C445DA80E46934076AD
:20597200929A1F76BF010F1A0100146F0AD094920F9008520F60A9A9A91800FF009158FF85
:2059920009611F767D03A7061B3F1C971D7FBF561A0186FE06001F767D031992A88809610C
:2059B2001F7680010806A940046D0A06A9403E6C02D5A692013BAB28010001B6A572AA2BF2
:2059D2001F768001A9A8A581A98308A90AC301B6C58500915AFFA692A772A9A8A781A9839D
:2059F200C5853FFFABCAAACBA71EA9A8A681A98A1F768401C48500915AFFA6853FFFAACB88
:205A1200ABCAA81A00E0061E04C322761F76800100022E1E1A760102041E1F76BF010E1A44
:205A320001001F767D03BF56190169FF06001B76F0FF0500BDABBDAABDA8BDA0BDC2BDC38C
:205A520000E2BD0003E2BD0003E2BD0103E2BD0203E2BD0303E2BD0430E6000602FE69FFDD
:205A7200422916561F7633002292419623760100267601012218FA002128FFFF10291F7669
:205A92007C033C060461010241563C001F7671030492E1FF99011F76710311920D61FF9C2A
:205AB20011960A60008FC0DBA4837FDC7FDDC518EFFFC41A04001F767D033592196100D2E6
:205AD200008F0871013BA9A8A281A98AD492C3FFA988008F3CD7A9A8A281A98A69FFA2928B
:205AF200C47E4076568601DAA2920452EA641F767D03319206523A601F76C4010992C3FF8C
:205B1200A90EA9BD120F0077007763D0808DC0DB8BE60400008F40D78CE6200069FF13E262
:205B32009200CFE62000407634BA6ED16FD0013B008FC0DB9A92929EA985A9BD160F6FD010
:205B5200C8E29402CFE6040020E7A00089E60900407696B750E800C8007790E8008800772A
:205B72008CE600001DD013E292001F767D0331920552436000D21F76710306921F767C03D4
:205B9200390A39540262392B008F0871013BA9A83981A98AC492C3FFA90EA9BD120F392D1D
:205BB20069FF008F40D712358BE604000156A400CFE62000407634BA013B1F767C03008FB6
:205BD20086DE8EE60000A9A83981A98A13E2C400008F40DFA9A83981A98A01DAC49208526D
:205BF200056139924076EE82056F3992009B40761181A2920652C0641F767D033492E1FFAF
:205C1200E3001F767C033888350EA60F1A601F767D0332931F767C03399200530F611F7638
:205C32007103055402600D9A1F767C0339931F767103059F015302600C9A69FF40764B909A
:205C52001F767C033692385472671F767D03349200D26D651F767C03392D008F0871013BB4
:205C72001F767D033412A294A959A9A8A281A98AC492C3FFA980A7BD160FA188008F86DEF2
:205C9200A9A8A681A98A8BE60C00C4E2C400007720E7000100778CE6000000771F767C036D
:205CB200A9BF120FA98556FF009B37540267019B37543A970767008FD9DFA9A8A281A98AE3
:205CD200C40A008FA2DEA9A8A181A98A009AC49300530260019A3ACA2461A12D008F40D7F1
:205CF2001235CFE6200069FF0156A400407634BA1F767C033C0608618EE62000007700772E
:205D1200A6BF120F076F8EE6000000770077A6BF120F008F86DE013BA9A8A181A98AC47E76
:205D320001DA1F767D03A292345495641F767C033492380A38544766382B69FF4076DB906B
:205D520000D21F767D03349220651F767C03392D1F767D033412A294009BA959407611810F
:205D7200013BC076D9DF008FA2DEA706A281A71EA9A8A181A98A01DA1F767D03C792C496FA
:205D9200A292C72B3454E2641F76710305921F767C03029C390A395416621F767D03379285
:205DB20000D21F767C03392B0E651F7671030692019BA2944076118101DA1F767D03A29235
:205DD2003754F464008F0071A4831F76330019DC01DDC51A0040C41A1000BF562101103B7D
:205DF200419282FE2296AFE2BE04AFE2BE03AFE2BE02AFE2BE01AFE2BE0080E2BE00BEC54E
:205E1200BEC4BE83BE8ABE86BE870300303BF1FF177602761B76F0FF0500BDABBDA8BDA0CA
:205E3200BDC2BDC300E2BD0003E2BD0003E2BD0103E2BD0203E2BD0330E6000602FE69FFA0
:205E520042291656227601021F76780301563200237600102676391110291A767FD0008FEF
:205E7200C0DB944F046D69FF4076C8B21F767103020A029214520468022BBF56030116D1E1
:205E9200008FC0DB7FD09C9294CA0190A9880C9301F10191A6CB10601F767D0331930653F3
:205EB20006611F76BF010B1A0008146F1F76BF010B1A00200F6F1F767D03319306530661B3
:205ED2001F76BF010F1A0008056F1F76BF010F1A00200653E1FF4B011F767103150A1593C3
:205EF2000A53E0FFA1001F767D0331931F7671030553152B03601B9322601F767D033193CD
:205F1200015305601F7671031A9319601F767D03319306530F6104530D61025306611F76CF
:205F3200BF010B1A0004226F1F76BF010B1A00401D6F1F76BF01021A0002186F1F767D0380
:205F5200319306530F6104530D61025306611F76BF010D1A00040A6F1F76BF010D1A00406C
:205F7200056F1F76BF01041A00021F76710319930F601F767D033193035313610153116199
:205F9200065319601F76BF01021A8000186F1F767D03319303530F6101530D610653066184
:205FB2001F76BF010B1A00100A6F1F76BF01041A8000056F1F76BF010D1A00101F767103D0
:205FD2001A9315601F767D03319306530B610353046101531561196F1F76BF010B1A004028
:205FF200226F1F76BF01021A80001D6F1F767D0331930653146103530D61015306611F76C6
:20601200BF010B1A00800F6F1F76BF010D1A00800A6F1F76BF010D1A0040056F1F76BF0191
:20603200041A020000523E601F767103158062D0940EA70F37601F767D03319303530F61E0
:2060520001530D61065306611F76BF010D1A00100A6F1F76BF01021A8000056F1F76BF01ED
:206072000B1A001006530E6103530961015304610D1A0080096F0B1A0080066F0B1A0040FA
:20609200036F021A800006530B6104530961025304610B1A0004066F0B1A0040036F021A0F
:2060B20000021F767103009A1C9300530260019AA693A9CF04611428F401162B140AC4E2DE
:2060D20014001C7E12E8D01F14AD5564160A1693019100B6142B179716930791026101B644
:2060F200A692187F3C601F767D033092095224611F76710316D0BF56190194937FD0D0FF09
:206112009492C9FFA8CAA940026C197F0C42116D0C430C6D0C44036D1A2B2D6F1892009BA4
:2061320000520260019B1A97266F17921A96236FBF561A01206F1F7671030C41BF561B0186
:20615200036C1792026F009A0C401A96036D192B126F179317921B9719960D6F1793178860
:20617200179219971B961A7E066F69FF407680B04076209982FEAFE2BE03AFE2BE02AFE285
:20619200BE01AFE2BE0080E2BE00BEC5BEC4BE83BE8ABE870300303BF1FF1776027602FE89
:2061B2002276008F84AA1F7635000AA81A7669FF407616BB1F763300221A200023760100BF
:2061D20000D5013B008FA2DEA9A8A581A98AC42B008F86DEA9A8A581A98A01DDA592C42B53
:2061F2001C52F1641F767D03319206522360008F00711F76C401D4CCF0FF05500296DCCC99
:20621200F0FF0350039603CC1FFF1050039603CCFFF1A91A0005039603CCFF0FA91A0040AB
:206232000396E4CCF0FF0750049604CC0FFF205004961F767D03319203521460008F00719A
:206252001F76C401D4CCF0FF02500296DC18F0FF03CC1FFF1050039603CCFFF0A91A00020D
:2062720003961F767D03319201522860008F00711F76C401D4CCF0FF06500296DCCCF0FF52
:206292000550039603CC0FFF4050039603CCFFF7A91A0007039603CCFF0FA91A0020039677
:2062B200E4CCF0FF0350049604CC0FFF6050049604CCFFF1A91A000104961F767D03319222
:2062D20002520960408F0071A58A02DCC418F0FFDD18F0FF319205524C60408F0071A58ABE
:2062F2001F76C40102DCC41A0F00DDCCF0FF0250039603CC3FFF3050039603CCFFF0A91A3D
:206312000006039603CCFF0FA91A00C00396E5CCF8FF0A50049604CCBFFFB050049604CC3F
:20633200FFF7A91A0007049604CCFF0FA91A00400496EDCCF0FF0550059605CC1FFF10508F
:20635200059605CCFFFEA91A000E05960518FF0FF5CCF8FF08500696061AF00006CCFFFDA1
:20637200A91A000D069606CCFF0FA91A00900696408F0071C0760068A5C41F76C401A78AFE
:206392001AD019DD01DEC61A000119DC011A0008C51A1000001A10000018BFFF001A000F1B
:2063B200011A00401F763300BF5621011F76A001C41A000819CCFFFCA91A0004199697CC9C
:2063D200FFFDA91A00011A96BF56098000CC7FFCA91A0001009600CCFFE3A91A00080096ED
:2063F20000CC001CC9FFA92D019A66FFA98800CC800304600102AC1E076F00CC8003C6FFCA
:2064120080FFA985AC1EA6851F7671034456A900421E3A06C0006BBA008FA60E42A8C0000A
:206432006BBA1F767D03008F4C1D31931F76A00105960018FCFF1F767C0302533EA80C60B5
:20645200008F8A66BF56340FBF563504BF563609BF5637143EA81F767D03319203520E60D0
:206472001F767C03008FF22BBF56340ABF563501BF563604BF5637143EA81F767D0332923E
:206492000E611F767C03008FF22BBF5634FABF563519BF563696BF5637143EA81F767D03D9
:2064B200319206520660008F7C921F767C033EA805520660008FA60E1F767C033EA81F7623
:2064D2007C033E0682FE3C1E0600009A019C1952FE640600005206601F76BF010D1A0010B9
:2064F200056F1F76BF010B1A00100600BDB21F76BF01BDAA0D1A0008BDA2A95B0102407610
:206512006FBB00D1808DC06FA28AA392CEFF0BDCC41A00804076D7AFA39280FFA95B0102C8
:2065320040766FBB0DDA0102C21A008040766FBB01D9A1921052E7641F76BF010B1A000807
:20655200BE82BE86BE8B06001F767E03008F5902BF5600050128701706A80600BDB2BDAA02
:20657200BDA202FE79D0008FC0DBAC1E013BA98B94854C82A61E4456A90042A2C0006BBA46
:2065920078D0A98342A2215694004456A100C0006BBA7FD0A607A5039449046C7AD0013BEF
:2065B2009485A918FF0FA95AA91A00804076E3AF7BD0A9B2408FC0DB34FF957AA61EA9B2E2
:2065D20042A232FFA607C0006BBAA98A42A2C802AC1EA9B24456A900C0006BBA1CD0A49EA6
:2065F20082FE289C9596BE82BE86BE8B0600A92802904076E3AF1F767D03319206520F61FC
:2066120004520D61025206611F76BF010F1A00040A6F1F76BF010F1A0040056F1F76BF0167
:20663200061A0002060002FE1F767E03080604610102415608000092020A0254E6FFCF004D
:206652000606022BE0FFAB007FD0008FC0DB9447706C05924C6050D0013B9492FC9CA985AA
:20667200A9BD120F007700770077007789E6000051D003E20A009492FC9CA985A9BD160FAF
:20669200007720E8000003E20A0032E8000589E6090003E20A0003E20C0112E8010C14AD3A
:2066B200056502E8000C03E20A0094E6010014AD06628FE800E0007703E20C00AFE20A017A
:2066D200AFE20C0090E8092090E800201F76740350E8094850E800488EE609008EE60000CC
:2066F20013E21A011F76740313E21B001F767E030192C0FF03540267030A0192030A035430
:2067120002670396AFE20A00AFE20C01C4E20103C4E2030220E709004FE800604FE8096090
:2067320000E7180000E75100007710E74000086F0492032B90E5019CA918FF0304968EE644
:20675200000003887FD0A9BF120F01931F767403187E1F76740319971F7674031C969488F8
:206772001F767E03A693D6FF0191059704930A61A648086D0188013BA98542C240761BB0D8
:206792002D6F407664B01F767E03008FC0DBBF5604017FDCC418FFFE216F06060119A61E79
:2067B200061E20FF5802A60F136120FFF401060F0F6120FF9001060F0B6120FF2C01060FD6
:2067D2000761C802060F04616402060F0760407664B01F767E03BF56040182FE0600005247
:2067F20006601F76BF01041A0001056F1F76BF01021A00010600005206601F76BF01041A96
:206812004000056F1F76BF01021A4000060040765CB1019A407668B1009A40765CB101026E
:2068320040766FBB009A407668B11E0240766FBB0600009A407668B11E0240766FBB019AF3
:2068520040765CB11E0240766FBB009A40765CB11E0240766FBB0600BDB2BDAABDA20EFEBF
:2068720000D2A98BA288A492A52D0252A65BE3FFF000A9B2026301D256FFA983AC920564EC
:206892000452036301D3026FAC2BAC92A58B4B2B0B650A02421EA9B2C0006BBA4B0AA98B85
:2068B200AC924B54F762A9B20A650A02421EA9B2C0006BBA01DE58FFA98BF862A292A58BF2
:2068D200A694A988026001BEA692AC944B2B0452A9880F650A02421EA9B2C0006BBAAC8059
:2068F200A98B4B0AA69281DFFC9CA72D4B54F362AC920263AC2B019A66FFA95801520260D5
:2069120000D08076E803A9B242C2C0006BBA441EA9B242C2C0007ABAA61E6402421EA60685
:20693200C0006BBA461E6402421EA9B2C0007ABAA61E0A02421EA606C0006BBA481E0A02B4
:20695200421EA9B2C0007ABA4A1EA61E460648074407A607046000D0A02DAC5AA392156105
:20697200039A013B4B96AD888ADEA6880356A9010156A600C6060960AC924B5406610F02F6
:206992004B0BC61E4B92F062A2922061019A013B4B96AD5D8ADDA55D0356A9010156A5009D
:2069B2000F02C50F09614B9203520661019C04524B96F0640B6FAD5D8ADDA55D0ABE4B9223
:2069D2000356A9010156A500C5C2009A4B2B013BAD5D8ADDA55D0356A9010156A50080766B
:2069F200B0DAA606C507A61EC685C51E019A4B2D66FFA0CE046180020156C5004B0A4B9276
:206A12000452E76448A3AB92AA2BFF90A927A9A9AC28180037FF5AFF4A064E1E4E92FF906F
:206A32004E964D2B4E06ABCAAACB4E1E4606009BFF903FFF5AFF4E06ABCAAACB4E1E44063D
:206A52003B565AFF4E06ABCAAACB4E1E026F4EB2408FCCDF013BA9A0A481A98A4B2BC45B33
:206A7200A3921052246200D14E92013B0190A9884E0640FF4E1EA692407674B101D9A19219
:206A92000852F364A35A00D1A293A292B0FF0190A85A407674B101D9A1920652F66440766A
:206AB20086B101DB4B0A4B920452DB648EFEBE82BE86BE8B060011D0008F107094920F90D6
:206AD20004520E60CCCC8001C6FF0252096022761F76C001BF562555BF5625AA1A7669FFEC
:206AF200060022761F76C001BF5629681A7669FF0600BDB202FE1F76C001A888A98011437A
:206B1200026C257611CC80010561227611187FFE1A762276408F1070A58AA79211D00F90F9
:206B320001DCC41A400095CDF0FFA8CA21961A76A79204600102A98B026FA759A92880C3E5
:206B5200A828C90169FFAC1E0556A1004076DEB2A1A91140FF6C22761118BFFF1A76A693C7
:206B72000153036102530A602276A69211CD7FFE039086FFA8CA11961A76A6930A60A9B2A2
:206B9200013BAC281E0040FF2256A10741FFA98BA69301530A60A9B2013BAC281E0040FF23
:206BB2002256A10741FFA98BA69302530960A9B2AC281F00013B2256A10740FFA98BA792E2
:206BD2001460A69203521160227611CC7FFFA91A000169FF119620FFDA0540766FBB1F76F8
:206BF200C001111A80011A761F76710382FE69FF3AB2BE8B0600BDB202FE22761F76C001FD
:206C1200BF561A011B2B1A92036001BE046F03561A01A9881F76710342C269FF3A06C00091
:206C32006BBA3E1E1F76C0011B92036001BE046F03561B01A9881F76710342C23A06C00076
:206C52006BBA408D1070A18315D0008F200B3C1E0CDD1F762C0094CCF8FF015014DC359686
:206C7200C41A04003418F7FFC51A0800787680001F76C0011C1A1000A18A1C1A00041C1A52
:206C920000081C1A20000DDC10D91C1A00011C1A00101C1A00201C1A00401C1A00801C187F
:206CB200FBFFC41A01001D1A02001D1A04001D1A08001D1A10001D1A20001C1A04001D1A27
:206CD20000041D1A00081D1A00101D1A00201D1A00011D1A00021D1A00401D1A0080C11A47
:206CF2000001201A0002201A0004201A0008201A0010201A00201A7669FF82FEBE8B06005A
:206D12004076DEB2049A029B4076E6B2407668B3060002FE22761F762B002028FFFF2128D4
:206D3200FFFF2228FFFF2328FFFF2428FFFF2528FFFF2628FFFF2728FFFF1A761F76FFCF91
:206D520069FF38924196399241963A9241963B9241963C9241963D9241963E9241963F926C
:206D72001F762B0041962F9201F0019082FE06001B76F0FF0500BDABBDA8BDA0BDC2BDC3F3
:206D920000E2BD0003E2BD0003E2BD0103E2BD0203E2BD0330E6000669FF4229165600D188
:206DB200227601021F767803015632002376391110291A767FD0008FC0DB944F046D69FFAC
:206DD2004076C8B21F767103020A029214520668022B1F767103BF560301008FC06FA483C0
:206DF2001F767D0306DDC51A0100319206520E6104520C61025205610FDCC41A00040A6F5C
:206E12001F76BF010F1A0040056F1F76BF01061A00021F767D033192065208610452066161
:206E32001F76BF010F1A0020056F1F76BF01061A080001021F767E032207A61E008F204EAE
:206E5200221EA9A8A60F026722A81F0A1F920A5202641F2B1B92AC2B1261008FC0DBA9A84F
:206E7200AC0DA98A62D094921F540465019A66FFA172AC92019C1B54A92DF0681E0A1E927D
:206E9200025202651E2B7FD0008FC0DB9493A89216D094CAA940EDFF8300A84B586D20FF8F
:206EB200204E220F30691E920A60013B1F766F0300D401D569FF0085407699B11F767E037E
:206ED2001E9201520A60008FC0DB013B01D569FFCC8501D4407699B1A192408DC0DB02D4F8
:206EF20000D569FFD1CEA90E407699B11F767E031E9202527B60013B03D400D5D9854076FC
:206F120099B1746F1E92076000D4000200D569FF407699B11F767E031E920152076001D4B3
:206F3200000200D569FF407699B102D4000200D569FF407699B11F767E031E92025256601B
:206F520003D4000200D5407699B1506F1E92086020FFB82200D401D569FF407699B11F76FA
:206F72007E031E920152086020FFB82201D401D569FF407699B1A10E02D400D569FF40768F
:206F920099B11F767E031E9202523060012903D400D520FFFFFF407699B1286F69FF407643
:206FB200DEBA1E920760013B00D404D51A85407699B11F767E031E9201520760013B01D4F7
:206FD20004D51A85407699B11F767E0302D400D52006407699B11F767E031E9202520660C0
:206FF200200603D400D5407699B1AFE2BE03AFE2BE02AFE2BE01AFE2BE0080E2BE00BEC5C8
:20701200BEC4BE83BE8ABE870300303BF1FF177602761B76F0FF0500BDABBDA8BDA0BDC27D
:20703200BDC300E2BD0003E2BD0003E2BD0103E2BD0203E2BD0330E6000602FE69FF4229A2
:2070520016561F763300329241962376000126760001321875002128FFFF1029408FC0D377
:2070720069FFA58A4076269540762B95103B4192329682FEAFE2BE03AFE2BE02AFE2BE0127
:20709200AFE2BE0080E2BE00BEC5BEC4BE83BE8ABE870300303BF1FF177602761B76F0FFB9
:2070B2000500BDABBDA8BDA0BDC2BDC300E2BD0003E2BD0003E2BD0103E2BD0203E2BD0363
:2070D20030E6000602FE69FF422916561F76330032924196237600012676000132187100EE
:2070F2002128FFFF1029408FC0D369FFA58A407626954076FC95103B4192329682FEAFE256
:20711200BE03AFE2BE02AFE2BE01AFE2BE0080E2BE00BEC5BEC4BE83BE8ABE870300303B4B
:20713200F1FF177602761B76F0FF0500BDABBDA8BDA0BDC2BDC300E2BD0003E2BD0003E274
:20715200BD0103E2BD0203E2BD0330E6000602FE69FF422916561F763300329241962376BF
:207172000001267600013218FD002128FFFF1029408F40D069FFA58A4076269540762B953B
:20719200103B4192329682FEAFE2BE03AFE2BE02AFE2BE01AFE2BE0080E2BE00BEC5BEC410
:2071B200BE83BE8ABE870300303BF1FF177602761B76F0FF0500BDABBDA8BDA0BDC2BDC3DE
:2071D20000E2BD0003E2BD0003E2BD0103E2BD0203E2BD0330E6000602FE69FF4229165615
:2071F2001F7633003292419623760001267600013292322B2128FFFF1029408F40D069FFFB
:20721200A58A407626954076FC95103B4192329682FEAFE2BE03AFE2BE02AFE2BE01AFE28B
:20723200BE0080E2BE00BEC5BEC4BE83BE8ABE870300303BF1FF177602762276008F806F12
:20725200A483A4C41F76BE0126DDC51A030027DE261A0C00A483261A3000261AC000261A2C
:20727200000317DD261A000C261A0030261A00C0C61A0300271A0C00271A3000271AC000A7
:20729200271A0003271A000C271A0030271A00C0C51A0300A48328DD171A0C0016DC171A6B
:2072B2003000171AC000171A0003171A000C171A0030171A00C0C51A0300281A0C00281A66
:2072D2003000281AC000281A0003281A000C281A0030281A00C0C41A00C0161AC000161AA5
:2072F2000030161A000C1A7669FF06002276008F806FA4C4A4831F76BE0118DEC61A030040
:2073120019DD181A0C00181A3000181AC000181A0003181A000C181A0030181A00C0C51A2D
:207332000300A48369FF191A0C0014DD15DC191A3000191AC000191A0003191A000C191A8A
:207352000030191A00C0C51A0300141A0C00141A3000141AC000141A0003141A000C141AF7
:207372000030141A00C0C41A0300151A0C00151A3000151AC000151A0003151A000C151AD7
:207392000030151A00C040768AB60600227615D0008F200B1F762C0094CCF8FFA483A4C5E1
:2073B200A4C40150359614DDC518FCFF0CDF3418F7FFA4830DDE341A0400C41A60000EDDB4
:2073D200C41A1C00C41A0300C41A0030C41A000EC41A8001CC1A4000C41A0040C41A0080C5
:2073F200211A0300C71A60002C1A1C002C1A03002C1A00302C1A000E2C1A8001C61A4000A0
:207412002C1A00402C1A00802D1A0300C51A6000A4830FDD2E1A1C0018DC2E1A03002E1A87
:2074320000302E1A000E2E1A8001C51A40002E1A00402E1A00802F1A0300C41A0700381AF9
:2074520038001A7669FF40768AB607F6007769FF0600BD3ABDB2BDAABDA202FE0129A9BF54
:20747200120F58FF5B61A85C7F91A8088000421EA493D6FFA85CA9BF160F6761A85D7F91A8
:20749200A8088000A859A958A593D6FFA85DA493A571A8180001A697A418FF00A518FF00D4
:2074B2007FDCA492A59EA7964D64A90801FF3E62A193A09236FFA859A958420635FF0EF68A
:2074D200A11FA95BA3010AF6A11F2D56A204A32DA03640FF0BF6A11F33FF009B30FF54FF54
:2074F200A20CA39540FFA70801001FF677FF200940FFA70801001FF677FF5AFFA79222655E
:20751200A90801FF1363A9A946FF7F91A85BA95AA625A79596FFA20CA395A9BD120F82FEFC
:20753200BE82BE86BE8BBE8E0600009B57FFA8087FFF5AFFA693F260A8280080AA71AB926F
:20755200ED6F20FF0000EA6F5AFFA493A818000196FFA85CA9A9A8087FFFA81C0080A4CB28
:20757200DD6F58FF5AFF00BE25610129A6920190A958A60640FFA407A71EC793A640046DB9
:20759200A892C7FFA92DA09201520460A8CCFF00A92DAC58A592A0F201DEA092FF90A95863
:2075B200A592408FC0DAC7FF9570A95DA9A9A60FDE66A5920600A71E8076C0DA0A6FA592BB
:2075D2008470FF90A95881DFA592C7FF9670A95DA706F660A59206000052A927FF76FFFFD7
:2075F20000BE3365A9A8013BA681A983A793C592FF90A92FAA71A880009AA740046DB0FF67
:20761200A880056FB0FFA81C01A0A880019C0852F564A9A8013BA681A983A793C592C7FFF9
:20763200A92FAA71A880009AA740046DB0FFA880056FB0FFA81C01A0A880019C0852F56454
:2076520001DEAB92A654CF62A79206001B76F0FF00E2BD0030E6000602FE422916561F76EB
:2076720033003292419623760001267600013292322B2128FFFF102901021F767D03180A18
:207692001F768001061E1F763300211A0001103B419282FE329680E2BE00303BF1FF17762C
:2076B20002761B76F0FF0500BDABBDA8BDA0BDC2BDC300E2BD0003E2BD0003E2BD0103E2C9
:2076D200BD0203E2BD0330E6000602FE69FF422916561F7633003292419623760001267640
:2076F20000013292322B2128FFFF1029008F006169FF4076D9A91F76800102020C1E1F766D
:207712003300211A0001103B4192329682FEAFE2BE03AFE2BE02AFE2BE01AFE2BE0080E2DE
:20773200BE00BEC5BEC4BE83BE8ABE870300303BF1FF1776027600021F763000008F000CE1
:207752000119021E1F767803408F100C000228A81F763000062B0119072BE41A1000041AA2
:2077720020001F763000008F080C0A1E1F76300000020119121E1F76300000020E2B0F2BFC
:207792001F76780330A838A02A1E1F763000162B172B1F763000E41A1000E51A10000C1A7F
:2077B20020001F763000141A20001F7678033A1E321E060000E0E45003E2F40188E610005A
:2077D200C48303E2D500C483F52BC483FD2BC483E51A1000C483E51A2000C483E518FFFBC6
:2077F200C483E518FFF7C4830002E51A0040D41E06000129BDB240FFBDAAA98B00D208610F
:20781200100240766FBB01DAA9B2A20FFA66BE86BE8B06001F76C001201A001040768AB6F4
:207832002276008F200BA4C4A4831F762C000ED015DE14DDC618F8FFC51A03003418F7FFD9
:207852003418FBFF94CCBFFF20502E960FDC2ECCE3FF08502E962ECCFCFF01502E962ECC97
:20787200FFDFA91A00102E962ECCFFF7A91A00062E962E187FFEC418BFFF2E18FFBF2E185D
:20789200FF7F2F1A03001A7607F6007769FF0600AD28000469FF1F5616561A5610E6000210
:2078B20040291F76000002291B762276A92800C0A828000001091B61C07600C004290F6FDC
:2078D200009BA92401DF046C0429A82401DFA61EA1F78624A706A1810109A71EA92403632E
:2078F2005CFF043BA95901DF0900ECFF1A76A928FFFFA828FFFF01090E61FF76FFFF066F78
:2079120001DFBDC3A71E673EBEC5A92401DFA82458FFF7604076FBBA407631BB1B76F0FF54
:207932000500BDABBDA8BDA0BDC2BDC300E2BD0003E2BD0003E2BD0103E2BD0203E2BD03DA
:2079520030E6000669FF42291656227601021F76780301563A00008F10DF69FF1F767C0384
:2079720016C5673E1A76AFE2BE03AFE2BE02AFE2BE01AFE2BE0080E2BE00BEC5BEC4BE833D
:20799200BE8ABE870300303BF1FF17760276BDB2CFE6010008D003E2BD040ED103E2BD05BC
:2079B20003E2BD0603E2BD07AFE2F400AFE2D40510E394040CD012E39C1F0ED118E394DA16
:2079D2000AE3C4A000E3E4C600E7BB0110E700010CD010E7C00003E29C0203E2940008D0B5
:2079F200F406941E03E2F401AFE2BE07AFE2BE06AFE2BE05AFE2BE04BE8B060002290429F6
:207A12005F565AFF42065F56421E00021FF617564200AB06325602292076022904295F561C
:207A32005AFF420656FF421E00021FF6175642003256022920765AFF00021FF617564200B0
:207A5200A9A920765AFF00021FF6175642002076103B1F7633002018FEFF222B242B69FF2B
:207A7200262B282B2A2B2C2B2E2B302B322B342B362B382B232B252B272B292B2B2B2D2B7E
:207A92002F2B312B332B352B372B392B06001F763300201A01002128FFFF102969FF0600A3
:207AB2000000A0E514AD0962A0E51F76740314AD90E5B4560101156F4FE803C092E6010039
:207AD2008CB5050000E7CA00007700E78A000077CFE812F0007700E75100007700E7400038
:207AF200060002FE1F767E031C0AC4E21C00007712E8D01F14AD11641D0A1D921C2B0A5261
:207B120002601D2B1D3457041A96200603610002036F00020119201E82FE0600A928FFFFA0
:207B3200AA28FFFFAB28FFFFA828FFFFAB0F04ED00D400BE0B6FA927A928FFFFA92FA4A949
:207B5200C488A928FFFF0209A98AA69240766BA6060022761F76C00169FF1C1A0800787633
:207B720080001A761F76C401028FE6491CCCFF3F69FFA91A00401C96BF5618E0A9A8407672
:207B92006FBB06000077006F1F767603BDB23EC5A959673E1F767E033EC5A70603ECA192AE
:207BB200673E1F767E033C0603ECA71E673E40762FBBBE8B0600408F8CC2008F000D22761D
:207BD200009A85C4019C805284C2FC641A7669FF0600A697009B0FF6A61F2076A697009B8D
:207BF2000FF6A61FA89220761F7676033CA806001F7676033EA8060006001F7674033C9702
:0C7C12003D9606000119C356FFFF060056
:207C1E00250100008CC27E8B00007E8B00007E8B00007E8B00007E8B00007E8B00007E8B93
:207C3E0000007E8B00007E8B00007E8B00007E8B00007E8B00007E8B00004C8C00003F8C4D
:207C5E000000CF8F0000718B0000E6880000888B0000598C00001C8A0000118A0000068A75
:207C7E000000FB890000F0890000E5890000DA890000CF890000C48900003D8A0000328AF0
:207C9E000000278A0000B48A0000998A0000E68800009089000077890000DC8F0000488AF0
:207CBE000000A9890000DE8D0000A88D0000728D00003C8D0000068D0000D08C0000E688AF
:207CDE000000E6880000F98D0000C38D00008D8D0000578D0000218D0000EB8C0000E688B1
:207CFE000000E6880000A68E00008B8E0000708E0000558E00003A8E00001F8E0000E688E7
:207D1E000000E6880000B58C00009A8C0000E6880000E6880000E6880000E6880000E6884A
:207D3E000000E68800007E8A0000638A0000C98B0000938B0000E48B0000AE8B0000E6883A
:207D5E000000E6880000B48F0000998F00007E8F0000638F0000488F00002D8F0000E6882C
:207D7E000000E68800007F8C0000648C0000E6880000E6880000208B0000CF8A0000E6882E
:207D9E000000E6880000568B0000058B00003B8B0000EA8A0000128F0000DC8E0000F78E1C
:207DBE000000C18E0000E6880000E6880000E6880000E6880000E6880000E6880000E68854
:207DDE000000E6880000E6880000E6880000E6880000E6880000E6880000E6880000E68815
:207DFE000000E68800005C89000041890000268900000B890000F0880000E6880000FF8B95
:207E1E0000001A8C00002C012C01000000000F00160014000A003C000000000000000000C5
:207E3E000000000000000A00080006000800060008000000000000000000000000000000F6
:107E5E000000000000000000000033000B000A00CC
:207E6E0048000000B2C3F4A4000081A50000E2A4000071A50000D5A4000063A50000C8A4F0
:207E8E0000004CA50000AEA400003CA50000A1A4000032A5000085A4000025A5000078A485
:207EAE00000017A500006BA400000BA5000055A4000040A40000949900002A9A0000269AAB
:207ECE0000001C9A0000989900009B9900009F990000A4990000A9990000AF990000B3992E
:187EEE000000B7990000009A0000209A0000BA9900002C9A00000000BF
:00000001FF

View File

@@ -2,7 +2,7 @@
TMS320C2000 Hex Converter v5.2.7
********************************************************************************
INPUT FILE NAME: <C:\Dima\Project\Balsam_167\Bin\UKSSTMS320F28335.out>
INPUT FILE NAME: <UKSSTMS320F28335.out>
OUTPUT FORMAT: Binary
PHYSICAL MEMORY PARAMETERS
@@ -12,20 +12,20 @@ PHYSICAL MEMORY PARAMETERS
BOOT LOADER PARAMETERS
Table Type: SERIAL PORT (SCI 8 bit Mode)
Entry Point: 0x0000b198
Entry Point: 0x0000b9b5
OUTPUT TRANSLATION MAP
--------------------------------------------------------------------------------
00000000..003fffff Page=0 Memory Width=8 ROM Width=8
--------------------------------------------------------------------------------
OUTPUT FILES: C:\Dima\Project\Balsam_167\Bin\UKSSTMS320F28335.bin [b0..b7]
OUTPUT FILES: UKSSTMS320F28335_34a95bc5.bin [b0..b7]
CONTENTS: 00000000..00006e67 BOOT TABLE
.cinit : dest=0000b35f size=00000283 width=00000002
.text : dest=00008000 size=0000335f width=00000002
.econst : dest=0000c000 size=00000112 width=00000002
.switch : dest=0000c112 size=00000028 width=00000002
CONTENTS: 00000000..00007f05 BOOT TABLE
.cinit : dest=0000c000 size=0000028b width=00000002
.text : dest=00008000 size=00003b73 width=00000002
.econst : dest=0000c28c size=00000125 width=00000002
.switch : dest=0000c3b2 size=00000048 width=00000002
--------------------------------------------------------------------------------
00000000..003fffff Page=1 Memory Width=8 ROM Width=8 "*DEFAULT PAGE 1*"

Binary file not shown.

288
Doc/DAC_SPI_REVIEW.md Normal file
View File

@@ -0,0 +1,288 @@
# SPI и управление ЦАП в Бальзам 167
Дата анализа: 23.09.2026. Рассмотрена текущая рабочая копия проекта `167`.
Документ описывает существующий код и предложения; прошивка в рамках этого анализа не изменялась.
## 1. Как устроено сейчас
ЦАП обслуживает **программный SPI через GPIO**, реализованный в `DAC.c`.
Аппаратный SPI-A используется отдельно для EEPROM в `spise2p.c`.
Изменение `SpiaRegs.SPIBRR` не меняет скорость передачи в ЦАП.
| Сигнал ЦАП | Вывод DSP | Имя в таблице платы | Действие |
|---|---|---|---|
| CS | GPIO59 | csdac, 1:13B | 0 на время кадра, затем 1 |
| DIN / MOSI | GPIO60 | didac, 1:13A | данные от DSP к ЦАП |
| SCLK | GPIO63 | clkdac, 1:14A | 16 тактов на слово |
Обозначения контактов взяты из комментариев `GPIO_table.h`, а не из проверенной схемы.
MISO в драйвере отсутствует: код отправляет команды, но не читает подтверждение или статус ЦАП.
Для платы нагрузки `get_Mode()` выбирает обычные GPIO и выходные направления этих линий.
Цепочка работы:
```text
CPU Timer1: 1000 Гц, период 1 мс
→ cpu_timer1_isr_SENS(), только Desk == dsk_LOAD
→ Load_runner()
→ каждые 5 вызовов: расчёт задания / инициализация
→ Anal_output(kod, time_dac)
→ dSEND(16-битное слово)
→ GPIO59, GPIO60, GPIO63
→ ump_log_tick()
```
`READY_FREQ=1000`, `DAC_FREQ=200`, поэтому `period_dac=5`.
200 Гц — частота обновления задания, **не частота SCLK**.
`LOAD_TIME=30`, `time_dac=6000` — количество шагов, используемое в расчёте разгона.
Вызов `dSEND` синхронный: обработчик таймера занят, пока не выставлены все биты.
## 2. Что происходит внутри одного SPI-кадра
Функция `dSEND(word)` выполняет:
1. Опускает CS и вызывает `DSP28x_usDelay(1L)`.
2. Повторяет 16 раз: SCLK=1 → DIN=старший бит → сдвиг слова влево → задержка → SCLK=0 → задержка.
3. Поднимает CS.
Передача начинается со старшего бита: D15 … D0. После кадра SCLK остаётся в 0,
DIN — в состоянии последнего бита. Между кадрами CS остаётся в 1.
Перед первым кадром `dSEND` отдельно не устанавливает исходное состояние SCLK.
Последовательность одного бита:
```text
SCLK ↑ → выставить DIN → выдержать время → SCLK ↓ → выдержать время
```
Новый бит устанавливается **после восходящего фронта**, но до нисходящего.
Следовательно, код рассчитан на чтение данных по нисходящему фронту; это
вывод из последовательности операций, а не подтверждение режима конкретной микросхемы.
При SCLK idle=0 такое поведение соответствует замыслу SPI mode 1.
Если приёмник читает по восходящему фронту, нужного setup-time здесь нет.
Нельзя менять фронты по привычному примеру SPI mode 0 без проверки схемы и паспорта ЦАП.
Из исходников установлены такие слова:
| Вызов | Передаваемое слово |
|---|---|
| `Init_DAC()` | `0x9002` |
| Обычное обновление | `0x8000 | (out & 0x0FFF)` |
| Ручная калибровка | `0x8000 | (DAC_cal() & 0x0FFF)` |
Локальная переменная `x` в `Anal_output()` каждый раз получает 0. Ветка отправки
без `0x8000` сейчас не выполняется. Точный смысл командных битов, номера канала,
режима питания и `0x9002` нельзя достоверно назвать: маркировка ЦАП в исследованных
исходниках не указана. Нужны схема или название установленной микросхемы.
После отправки `0x9002` функция `Init_DAC()` также переключает `RES_OUT_1` —
для платы нагрузки это GPIO9. Это отдельная линия с неизвестным здесь
электрическим назначением; считать её аппаратным RESET или LDAC без схемы нельзя.
## 3. Задержки и влияние прерываний
`DSP28x_usDelay(1L)` **не задаёт 1 мкс**. Ассемблерная функция принимает счётчик
циклов своего внутреннего цикла. Для микросекунд библиотека предоставляет макрос
`DELAY_US`, который предварительно пересчитывает время.
В комментарии самой ассемблерной функции приведена модель `9 + 5 × LoopCount`
тактов процессора. Она применима с оговорками о памяти без wait-state; вызовы,
GPIO-записи, цикл C и прерывания дополнительно влияют на реальную длительность.
Поэтому по числу `1L` нельзя вычислять частоту SCLK как 500 кГц или 1 МГц.
В проекте `XCLKIN=30 МГц`, `CLKMULT=2`, PLL множитель 4, делитель 2:
расчётная частота SYSCLKOUT — **60 МГц**, если входной генератор соответствует
константе. При этом `CPU_RATE` для макроса `DELAY_US` остался `6.667 нс`
(150 МГц). Это несоответствие не участвует в прямом вызове `DSP28x_usDelay(1L)`,
но помешает простой замене на `DELAY_US(1)`: сначала надо согласовать CPU_RATE
с фактической частотой. При 60 МГц период такта примерно 16.667 нс.
В таймерном ISR выполняется `EINT` после настройки `IER/MINT13`.
В текущей таблице приоритетов Group9 имеет уровень 1, Timer1 — 4;
разрешённые прерывания CAN/UART могут удлинять части SPI-кадра.
Сам `dSEND` не запрещает прерывания и не имеет защиты от повторного входа.
В найденных вызовах передача ЦАП идёт из `Load_runner`; добавлять второго
вызывающего без организации единого владельца передачи нельзя.
Это не доказывает потерю данных: некоторые ЦАП допускают произвольное растяжение
SCLK. Следует проверить паспортные ограничения и измерить минимальные и
максимальные времена под нагрузкой CAN/RS. Полный запрет прерываний на кадр
может уменьшить разброс, но увеличит задержку обработки связи.
## 4. Инициализация и расчёт аналогового выхода
`Setup_DAC_time()` задаёт `WAKEpowse=601`. Счётчик уменьшается с частотой 200 Гц.
Во время примерно трёхсекундной стартовой фазы `Init_DAC()` вызывается шесть раз,
при остатках 600, 500, 400, 300, 200, 100. После этого начинается обычный вывод.
Команда `cInitDac` вызывает повторную инициализацию; на этом шаге слово задания
не отправляется. При остановленном УМП счётчик `x` в `Load_runner` также вызывает
периодическую инициализацию примерно раз в 5.12 с. Это другая переменная `x`,
не связанная с постоянным нулём в `Anal_output`.
Расчёт кода:
```text
out = DAC_min + vrot × DAC_max / maxx − vrot × DAC_min / maxx
при cCalibrDac: out = DAC_cal
затем out &= 0x0FFF
```
Два деления здесь целочисленные. Их нельзя без проверки заменить одним:
`DAC_min + vrot × (DAC_max − DAC_min) / maxx` может дать другое округление.
Сначала нужно определить требуемое округление и допустимость изменения результата.
В `modbus[0x7B]` сохраняется отправленный 12-битный код, а в `modbus[0x1C]` —
расчётное задание в десятых долях мА. Это **не измерение выходного тока**.
В режиме `cCalibrDac` эти значения могут описывать разные вещи: в ЦАП уходит
ручной код, а `0x1C` остаётся результатом формулы разгона.
## 5. Что стоит исправить в первую очередь
### 5.1. Порядок запуска таймера — высокий приоритет
В `main()` выполняются `timer_Init(); EnableInterrupts();`, а затем загрузка
параметров и только после неё `Setup_DAC_time()`.
В `cpu_timer1_isr_SENS` перед `Load_runner()` нет проверки `READY`.
До настройки глобальные `period_dac`, `time_dac`, `WAKEpowse` нулевые.
Если в этом промежутке сработает Timer1 на плате нагрузки, условие счётчика
проходит при нулевом `period_dac`, стартовая задержка отсутствует, и путь может
дойти до `Anal_output(..., 0)` — деления на ноль. Это найденный путь выполнения,
не результат воспроизведения на железе.
Предложение: до допуска обслуживания ЦАП настроить GPIO в известное состояние,
загрузить/проверить параметры и выполнить `Setup_DAC_time`. Для этого можно
отдельно разрешать ветку ЦАП флагом готовности или запускать Timer1 позднее.
Нельзя просто отключить все прерывания на время загрузки: EEPROM использует Timer2.
Дополнительно проверять `maxx > 0` и допустимость `period_dac` перед расчётом.
### 5.2. Ошибка ограничения уставки
В `Load_runner` есть строка:
```c
if (dac_stop > 16) dac_go = 16;
```
При превышении конечной уставки меняется начальная. Вероятное намерение —
ограничивать `dac_stop`, но это надо подтвердить требованиями к разгонной
характеристике. Ранее `dac_go` ограничивается диапазоном 0..5, а эта строка
может сразу заменить его на 16. Следующая проверка способна поднять `dac_stop`
до 17. Это влияет на ток независимо от исправности SPI.
Предложение: описать допустимые пары начальной/конечной уставок в мА,
проверять их совместно и протестировать границы. Внутри алгоритма из обеих
уставок вычитается 4 мА; ограничения должны учитывать это смещение.
### 5.3. Маскирование вместо насыщения
`out & 0xFFF` обрезает старшие биты, но не ограничивает числовое значение:
4096 превращается в 0, −1 — в 4095. При ошибочной калибровке или выходе
за диапазон это создаёт скачок кода.
Предложение: сначала проверить входные данные и ограничить результат
диапазоном 0..4095, затем сформировать командное слово. Для ошибочных параметров
явно определить поведение: отказ, удержание предыдущего кода или заданное
проектом аварийное значение. Не выбирать «0» автоматически: код и ток связаны
калибровкой и внешней схемой.
### 5.4. Реальная длительность разгона
После половины диапазона `count_load` увеличивается дважды за шаг:
один раз в `if(count_load > time_dac/2)`, второй — в `++count_load`.
Поэтому достижение конца при `LOAD_TIME=30` занимает примерно **22.5 с**,
а не 30 с, без учёта начальной фазы и задержек исполнения.
Это может быть намеренной двухступенчатой характеристикой.
Предложение: явно описать её либо перейти к расчёту по прошедшему времени,
если требование действительно состоит в линейном разгоне за 30 с.
## 6. Улучшения непосредственно SPI
| Изменение | Польза | Что проверить |
|---|---|---|
| Явный `dac_bus_init`: CS=1, SCLK в idle, DIN определён; затем включение выходов | Предсказуемый первый кадр | Схема, подтяжки, активные уровни |
| Именованные задержки setup/hold/high/low/CS-high | Понятные временные ограничения | Паспорт ЦАП и фактическая частота DSP |
| Имена констант вместо `0x9002`, `0x8000`, `0xFFF` | Ясный смысл команд | Сначала установить модель ЦАП |
| Один владелец передачи и флаг занятости | Исключает наложение двух кадров | Все вызывающие и разрешённые ISR |
| Отдельные функции расчёта кода и отправки слова | Проверка алгоритма без железа | Сохранение округления и масштаба |
| Диагностика отправок/максимальной длительности | Показывает нагрузку и задержки | Счётчик отправок не считать ACK от ЦАП |
| Удаление неиспользуемого `wast()` и недостижимой ветки `x` | Упрощает чтение | Не затронуть другой `x` в Load_runner |
Не следует повышать DAC_FREQ ради ускорения SPI: меняется алгоритм обновления,
число шагов и стартовые интервалы. Для других частот проверить целочисленность
отношения READY_FREQ/DAC_FREQ и диапазон 16-битного `time_dac` на C28x.
Текущие 6000 шагов помещаются; будущие LOAD_TIME/DAC_FREQ могут вызвать переполнение.
Вариант без переделки платы: сохранить GPIO-передачу, нормировать её тайминги,
измерить длительность кадра и только затем решать, нужна ли короткая критическая секция.
Не переносить отправку в основной цикл без анализа задержек: в проекте есть
блокирующие операции EEPROM. Если переносить — использовать явную очередь/последнее
задание с оговорённым временем обслуживания и отдельными командами инициализации.
## 7. Можно ли перейти на аппаратный SPI
У F28335 один SPI-A. Его выводы могут быть GPIO16/17/18/19 или GPIO54/55/56/57.
GPIO60 и GPIO63 не имеют функции SPISIMOA/SPICLKA, поэтому текущие DIN/SCLK
не переводятся на SPI-A одной настройкой mux. Нужны изменения соединений.
Это подтверждается [таблицами выводов TI, SPRS439Q](https://www.ti.com/lit/ds/symlink/tms320f28335.pdf).
В данном проекте SPI-A уже обслуживает EEPROM на GPIO16/17/18 и CS=GPIO19.
Вариант общей шины требует подключения ЦАП к тем же MOSI/SCLK и отдельного CS,
проверки электрической совместимости и последовательного доступа к SPI-A.
Если меняются длина слова/фаза/частота, переключать настройки можно только
после завершения предыдущей операции. Текущий автомат EEPROM работает через
Timer2 и сам меняет формат слова: потребуется общий владелец шины.
Сначала достаточно рассмотреть один 16-битный аппаратный кадр с ограниченным
ожиданием либо прерыванием завершения. FIFO/DMA усложнят короткую передачу;
их необходимость следует обосновывать измерениями. CS надо отпускать после
фактического окончания сдвига последнего бита, а не сразу после записи TXBUF.
Возможность DMA именно для выбранного периферийного блока отдельно проверять
по TRM, не переносить механически решение STM32.
Для будущего порта STM32 можно сохранить общий расчёт и формат слова,
а отправку реализовать аппаратным SPI на выводах конкретной платы. Нынешний
эмулятор лишь генерирует поля ЦАП в журнале; он не подтверждает физические
SPI-фронты и выходной ток устройства.
## 8. Практический порядок работ и проверка
1. Установить модель ЦАП, назначение GPIO9, схемные инверсии и требования timing.
2. Исправить порядок готовности ЦАП при запуске и защитить деление на ноль.
3. Согласовать диапазоны уставок, исправить ограничение и обрезание кода.
4. Снять текущие CS/SCLK/DIN при запуске, рабочем разгоне и нагрузке CAN/RS.
5. Нормировать программные задержки; аппаратный SPI выбирать по результатам измерений.
Логический анализатор подключить к CS, SCLK, DIN и общей земле; при необходимости
добавить GPIO9. Записать 16 бит каждого кадра, порядок битов, `0x9002`,
минимум/середину/максимум кода, setup/hold DIN, CS setup/hold, SCLK high/low,
длину кадра и интервал обновления. Отдельно проверить первый кадр после сброса.
Частоту дискретизации анализатора выбрать по измеренному SCLK с запасом.
Осциллографом проверить форму фронтов и выбросы, внешним измерителем — ток.
После правок проверить граничные и ошибочные уставки, `maxx=0`, калибровку,
разгон/останов, cInitDac, сохранение параметров EEPROM одновременно с CAN/RS.
Тесты расчёта должны фиксировать требуемое округление и поведение вне диапазона;
программная трасса GPIO — количество фронтов и порядок данных. Проверка GPIO
на компьютере не заменяет измерение времён на собранной плате.
## 9. Основания анализа
Факты о текущем поведении взяты из следующих файлов; номера строк относятся
к рабочей копии на дату анализа:
- [Формирование кадра, инициализация, расчёт выхода и разгон](C:/setcorp/git/tms_periph_28335/167/Source/Internal/DAC.c:45).
- [Запуск таймера и порядок инициализации](C:/setcorp/git/tms_periph_28335/167/Source/Internal/main.c:26).
- [Вызов Load_runner из ISR](C:/setcorp/git/tms_periph_28335/167/Source/Internal/measure.c:119).
- [Частоты и время разгона](C:/setcorp/git/tms_periph_28335/167/Source/Internal/Include/measure.h:73).
- [Назначение линий платы](C:/setcorp/git/tms_periph_28335/167/Source/Internal/Include/GPIO_table.h:294).
- [Mux и направления GPIO](C:/setcorp/git/tms_periph_28335/167/Source/Internal/peripher.c:44).
- [Аппаратный SPI EEPROM](C:/setcorp/git/tms_periph_28335/167/Source/Internal/spise2p.c:98).
- [Счётчик ассемблерной задержки](C:/setcorp/git/tms_periph_28335/167/Source/External/v120/DSP2833x_common/source/DSP2833x_usDelay.asm:62).
- [Настройки PLL и CPU_RATE](C:/setcorp/git/tms_periph_28335/167/Source/External/v120/DSP2833x_common/include/DSP2833x_Examples.h:66).
- [Приоритеты прерываний](C:/setcorp/git/tms_periph_28335/167/Source/External/v120/DSP2833x_common/include/DSP2833x_SWPrioritizedIsrLevels.h:61).
Модель ЦАП и электрическая схема не установлены. Режим выборки, назначение
командных битов и допустимые длительности нельзя считать подтверждёнными
до сверки с документацией конкретной микросхемы. Сборка/прошивка и стендовые
измерения в рамках подготовки этого документа не выполнялись.

136
Doc/EEPROM_LAYOUT.md Normal file
View File

@@ -0,0 +1,136 @@
# EEPROM 167: выбор AT25256B / M95M02
Маркировка платы `ATMLH516 5EBL` определяет AT25256B: **256 Кбит**, то есть
**32 768 байт**. Расшифровка и характеристики приведены в
[даташите Microchip](https://ww1.microchip.com/downloads/aemDocuments/documents/MPD/ProductDocuments/DataSheets/AT25128B-AT25256B-128-256-Kbit-SPI-Serial-EEPROM-Industrial-Grade-Data-Sheet-DS20006193.pdf).
Константы общей разметки находятся в
[templates/include/balsam167_eeprom_layout.h](../../newProject/SETGUI/third_party/templates/c/set-protocol/include/balsam167_eeprom_layout.h).
`spise2p.h` использует их для физического размера, количества слов и длины
страницы. `message.c` — для адреса параметров. Размер массива параметров
проверяется относительно `ANSWER_LEN` на этапе компиляции.
`F28335.cmd` включает тот же заголовок и экспортирует символы `_EEPROM_*` в
`.map`. Путь к templates/c/set-protocol добавлен в search path линкера CLI и CCS.
EEPROM не стала секцией CPU MEMORY: SPI-образ загружается в RAM загрузчиком.
Расположение `.text`, `.cinit`, `.econst`, `.switch` не менялось.
| Область | Начало, байт | Конец, исключая | Размер |
|---|---:|---:|---:|
| Прошивка SCI8 | `0x0000` | `0x7EFC` | 32 508 |
| Параметры | `0x7EFC` | `0x7FFE` | 258 |
| Неиспользуемое слово | `0x7FFE` | `0x8000` | 2 |
`check_firmware.ps1` получает размер и резерв из общего заголовка и сверяет
резерв с `ANSWER_LEN`. При нестандартном checkout передайте `-TemplatesRoot`;
`build_logger.ps1` делает это автоматически. Исторические параметры не перенесены.
Чтение с платы, единицы адресов, порядок байтов и сохранение дампа описаны в
[руководстве SETGUI](../../newProject/SETGUI/docs/BALSAM167_EEPROM.md).
Для старой прошивки reader использует CMD_PEEK (2 байта за запрос).
Версия 0.1.1 также поддерживает блочное чтение FC03, регистры 0x8000..0xBFFF,
до 120 слов (240 байт) за запрос. Полный дамп требует 137 запросов.
Границы и формат заданы в templates, GUI использует тонкий Python-порт.
Блочное чтение выполняется с разрешёнными прерываниями для работы SPI Timer2.
Запись через это окно запрещена; параметры и их расположение не изменяются.
Размер каждого нового BIN проверяется при сборке; прежний вариант с одним
PEEK занимал 32 286 байт. Точный размер новой сборки указан в её manifest.
Для реального увеличения памяти потребовались бы другая микросхема, проверка
SPI-загрузчика и драйвера, а не только правка линкера.
## Выбор типа памяти (прошивка 0.1.2)
По умолчанию остаётся AT25256B. Автоматического определения ёмкости нет:
контрольные записи для определения типа не выполняются. Выбранный тип должен
совпадать с физической микросхемой до запуска программы и чтения параметров.
### CCS12
Откройте `Source/Internal/Include/eeprom_config.h`:
```c
#define EEPROM_M95M02 0 /* AT25256B, 32 КиБ */
/* Для установленной M95M02 измените значение на 1. */
```
После изменения выполните **Project → Clean**, затем **Rebuild**. Этот файл
читают драйвер, обработчик команд и F28335.cmd; post-build использует тот же
выбор. Не задавайте противоречащий ему отдельный define только компилятору CCS:
тогда компилятор, линкер и проверка BIN могут получить разные настройки.
### Сборка скриптом
```powershell
./build_logger.ps1 -Eeprom AT25256B -OutputDirectory ./Bin/EepromProfiles/AT25256B -ImageName UKSSTMS320F28335_AT25256B
./build_logger.ps1 -Eeprom M95M02 -OutputDirectory ./Bin/EepromProfiles/M95M02 -ImageName UKSSTMS320F28335_M95M02
```
Параметр скрипта передаётся компилятору, линкеру и проверке размера; исходный
config не меняется. Скрипт по умолчанию собирает AT25256B. Рядом с BIN создаются
manifest и SHA-256; поле `eeprom` в manifest различает аппаратные варианты.
UART остаётся 115200; алгоритм UART и FIFO не изменялся.
| Параметр | AT25256B | M95M02-DR |
|---|---:|---:|
| Ёмкость, байт | 32768 | 262144 |
| Адрес SPI | 2 байта | 3 байта |
| Страница записи, байт | 64 | 256 |
| Начало параметров, байт | 0x7EFC | 0x3FEFC |
| Начало параметров, слова | 0x3F7E | 0x1FF7E |
| Конец параметров, исключая | 0x7FFE | 0x3FFFE |
| Максимальная область BIN | 32508 | 261884 |
Последние два байта не используются. У M95M02 старшие адресные биты передаются
отдельным восьмибитным тактом, затем младшие 16 бит. Адреса и длины драйвера
расширены до 32 бит только в сборке M95M02. Запись делится по физическим страницам;
готовность определяется WIP в регистре состояния. На плате с новым чипом ещё
нужна проверка записи/считывания и холодного SPI boot; тесты на ПК не заменяют её.
### SETGUI
На вкладках **EEPROM 167** и **Загрузка / запуск / прошивка** есть синхронный
чекбокс **M95M02 · 256 КиБ**. Снято — AT25256B · 32 КиБ. Он выбирает протокол
и допустимый диапазон ПК, но не перепрограммирует тип EEPROM работающей платы.
Во время чтения/загрузки переключатель блокируется.
Для полного дампа нажмите «Вся EEPROM»: 32768 либо 262144 байта. Длина блока
остаётся 240 байт. M95M02 требует блочного чтения; автоматический переход на
PEEK запрещён. Неподходящая прошивка должна отклонить запрос, а не вернуть
повторяющиеся первые 32 КиБ как полный дамп. Дамп можно передать кнопкой
«Сравнить с файлом…» напрямую в сравнение BIN.
При загрузке BIN проверяется поле `eeprom`, если оно присутствует в manifest.
Старые файлы без этого поля не позволяют проверить тип. Команда «В SEEPROM»
использует отдельный подкод M95M02; старая прошивка его не исполняет. Операция
может завершиться таймаутом при несовпадении типа; это не успешная запись.
GUI ограничивает отдельную загрузку в RAM существующим пределом 199993 байт:
ёмкость EEPROM 256 КиБ сама по себе не увеличивает буфер загрузки или RAM CPU.
### Замена микросхемы и параметры
Сначала сохраните полный дамп старой EEPROM и настройки платы. После установки
M95M02 запустите её сборку через CCS, запишите соответствующий BIN и сохраните
параметры штатной командой Save. Параметры автоматически не мигрируют с 0x7EFC
на 0x3FEFC. Простое копирование старого полного дампа в начало новой памяти
не переносит настройки в их новую область и оставляет старый вариант прошивки.
### Общий протокол templates
Реализация и границы: `balsam167_eeprom_layout.h`, `balsam167_eeprom_block.h`,
`periph28335.c`. Публичные функции `*_profile` получают 0 (AT25256B) или 1
(M95M02); старые функции и структура reader из четырёх uint32_t сохранены.
Python — тонкий ctypes-порт. Профили ПМ67/2812 и STM этим выбором не изменяются.
Для M95M02 используется частное расширение окна FC03: адрес 0x8000…0xFFFF,
quantity = 0x8000 | (bank << 8) | word_count, bank 0…3, word_count 1…120.
Каждый запрос содержит свой банк 64 КиБ; общего переключаемого банкового
регистра нет. Блок не пересекает границу банка. Это не стандартное количество
регистров Modbus — пользоваться следует общим API templates.
Подкод EXTEND записи: 4 для AT25256B, 0x44 для M95M02. Адрес назначения в словах,
размер в байтах. Обе стороны проверяют границу области прошивки.
Проверки: C-тест полного дампа 256 КиБ с нечётного адреса, все переходы банков,
CRC и выход за границы; Qt-тесты выбора и запрета fallback; host-тест реального
SPI-автомата `python tests/eeprom_profiles/run_test.py`; сборка обоих вариантов TI.

167
Doc/FIRMWARE_IDENTITY.md Normal file
View File

@@ -0,0 +1,167 @@
# 167: версия работающей прошивки, SHA-256 и выпуск
## Что подключено
167 использует общий `templates/c/firmware-info`, а не копию Climate.
Работающий ПМ35 отдаёт 12 регистров версии через RS и служебный CAN.
После сборки на компьютере создаются SHA-256 BIN и JSON-паспорт.
Общая подробная инструкция, включая перенос на TMS320F2812 и STM32:
[BUILD_IDENTITY.md](../../newProject/SETGUI/third_party/templates/c/firmware-info/BUILD_IDENTITY.md).
| Файл проекта | Роль |
|---|---|
| `UKSSTMS320F28335/firmware_version.h` | Редактируемый номер выпуска: FIRMWARE_VERSION_MAJOR/MINOR/PATCH |
| `UKSSTMS320F28335/firmware_identity.json` | Product и target; версия берётся из C-заголовка |
| `Source/Internal/shared_ump.c` | Подключение общей таблицы версии и привязка к UMP ПМ35 |
| `UKSSTMS320F28335/prepare_identity.py` | Генерация идентичности из C-заголовка перед CCS Debug/Release |
| `build_logger.ps1` | Полный CLI build: prepare, compile, link, SCI8, size check, seal |
| `build_bin.bat` | Debug post-build: проверка SCI8 и паспорт конечного BIN |
| `tests/firmware_identity/port_test.c` | Host-проверка привязки версии к реальному порту 167 |
Номер `0.1.0` — начальная версия разработки этого механизма; он не выдаётся за
историческую версию предыдущих BIN. Назначайте release-номер вручную перед выпуском.
## Сборка из PowerShell
Из корня 167:
```powershell
./build_logger.ps1 -OutputDirectory "$PWD/Bin/FirmwareIdentity" `
-ImageName UKSSTMS320F28335
```
По умолчанию применяется `-O2 --opt_for_speed=0`. Результаты:
```text
Bin/FirmwareIdentity/UKSSTMS320F28335.bin
Bin/FirmwareIdentity/UKSSTMS320F28335.bin.manifest.json
Bin/FirmwareIdentity/UKSSTMS320F28335.bin.sha256
Bin/FirmwareIdentity/generated/firmware_identity.h
Bin/FirmwareIdentity/generated/firmware_identity.json
```
Проверка файла перед передачей:
```powershell
python ../newProject/SETGUI/third_party/templates/c/firmware-info/tools/identity.py verify `
--image Bin/FirmwareIdentity/UKSSTMS320F28335.bin `
--manifest Bin/FirmwareIdentity/UKSSTMS320F28335.bin.manifest.json
```
CLI принимает `-TemplatesRoot`, если общий checkout расположен иначе. Все
исходники общего механизма собираются непосредственно из этого checkout.
## Сборка CCS
В `.cproject` добавлены pre-build и include paths `${BuildDirectory}/generated` и
`templates/c/firmware-info/include`. После изменения настроек закройте/откройте
проект в IDE, затем выполните Clean/Rebuild.
Pre-build требует Python 3.10+ и Git в PATH процесса CCS. `Generated` принадлежит
этому проекту: не запускайте Debug/Release одновременно. Для параллельных
сборок используйте CLI с разными output-каталогами.
Штатный Debug post-build создаёт в `Bin`:
```text
UKSSTMS320F28335_<commit>.bin
UKSSTMS320F28335_<commit>.bin.manifest.json
UKSSTMS320F28335_<commit>.bin.sha256
```
Имя BIN исторически содержит HEAD без dirty-суффикса; достоверные признаки dirty
находятся внутри ответа версии и паспорта. Не определяйте чистоту только по имени.
Release-конфигурация получает embedded identity через pre-build, но её старый
проект не имел автоматического BIN post-build. Для готового проверенного BIN с
паспортом используйте описанный CLI либо настройте release-конверсию по общей
инструкции; нельзя запускать Debug `build_bin.bat` на Release и ожидать другой `.out`.
Если CCS пишет `Error ... (ignored)`, сборка не считается успешной: убедитесь,
что последняя проверка и `seal` завершились без ошибок. Старый BIN с таким же
именем может оставаться на диске после неудачной сборки.
## Как прочитать версию
По прямому RS232/RS485: Modbus **03**, адрес начала **4608 (`0x1200`)**, **12 слов**.
Это zero-based адрес в запросе, а не обозначение `4xxxx` в интерфейсе терминала.
Адрес ведомого остаётся текущим `CNTRL_ADDR`. Возвращается стандартный RTU-ответ
с 24 байтами данных и CRC; дополнительного legacy padding в этом окне нет.
| Адрес | Содержимое |
|---|---|
| `0x1200` | Версия формата = 1 |
| `0x1201..0x1203` | Major, minor, patch |
| `0x1204` | Год UTC |
| `0x1205` | Месяц:день, старший:младший октет |
| `0x1206` | Час:минута UTC |
| `0x1207` | Секунда |
| `0x1208..0x120B` | 8 ASCII-символов Build ID, по два на слово |
По служебному CAN ПМ35: запрос UMP функции 03, `0x1200`, 12 слов; ответ состоит
из шести фрагментов. Используется выбранный Mode и существующий token запроса.
CAN ПМ67 не переназначается. Запись функции 06 в окно версии запрещена.
Старый образ может вернуть исключение или неизвестный контракт. Это не следует
заменять «ожидаемой» версией выбранного BIN. После прошивки переподключитесь или
явно обновите чтение: ответ должен поступить с устройства, а не из кэша GUI.
## Что сравнивать после заливки
Сравните SemVer, все поля UTC и Build ID с паспортом именно загруженного BIN.
`+` означает локальные изменения приложения **или templates**; полный Git SHA
и состояние обоих деревьев записаны в JSON. Проверка SHA на ПК подтверждает
целостность файла, но не заменяет проверку программатором записанной памяти.
В контракте нет аппаратного product ID и хеша всей памяти. Подключённый профиль
должен оставаться ПМ35/167, а файл — `product=Balsam-167-PM35`,
`target=TMS320F28335`. Не переносите файл на ПМ67 только по похожему имени.
## Влияние на память и параметры
С проверенными настройками текущий образ занимает **32 286 байт**, предел —
**32 508**, запас **222 байта**. Механизм добавил 116 байт относительно сборки
без него. Это результат конкретной сборки, не обещание для следующих изменений.
Таблица версии — часть `.econst` прошивки. Её не сохраняют в область параметров;
старые настройки не могут подменить версию после обновления. Размер буфера лога
и размещение EEPROM-параметров не менялись. Дата не разбирается на MCU, SHA-256
не вычисляется на MCU. Проверка размера `check_firmware.ps1` остаётся обязательной.
## Проверки и ограничения
Проверка соответствия паспорта **реально встроенной** таблице в собранном SCI8:
```powershell
python tests/firmware_identity/check_build.py Bin/FirmwareIdentity/UKSSTMS320F28335.bin
```
Этот независимый тест также сверяет SHA и размер, проходит boot-блоки и ищет
точное 12-словное представление версии. Он обнаружит старый объект версии или
паспорт другой сборки. Это тест для 167, не транспортный код для GUI.
Host-тест реального порта (GCC должен быть в PATH):
```powershell
$templates = '../newProject/SETGUI/third_party/templates'
gcc -std=c99 -Wall -Wextra -Werror `
"-I$templates/c/firmware-info/include" -IBin/FirmwareIdentity/generated `
"-I$templates/c/set-protocol" "-I$templates/c/set-protocol/ports/tms320f28335" `
tests/firmware_identity/port_test.c Source/Internal/shared_ump.c `
-o Bin/FirmwareIdentity/port_test.exe
./Bin/FirmwareIdentity/port_test.exe
python tests/ump_logger/test_firmware_image.py
python tests/ump_logger/run_test.py
python tests/ump_logger/run_init_test.py
```
Проверены полный TI build 167, формат SCI8, host-тесты протокола и регистратора,
общие тесты identity/SHA, компиляция общего C-кода TI C28x без FPU и ARM Cortex-M4.
Это не аппаратная проверка TMS2812/STM32 и не полноценная сборка другого проекта.
Физическое чтение нового окна версии и проверку после загрузки нужно выполнить
на стенде. В SETGUI на вкладке «Загрузка / запуск / прошивка» доступны
«Прочитать версию с платы» и «Проверить файл»: показаны SemVer, дата UTC,
Build ID и сравнение с выбранным BIN. Для проверки файла держите рядом его
`.bin.manifest.json`; GUI проверяет product/target, размер и SHA-256 и повторяет
проверку перед передачей. BIN без паспорта отмечается как непроверенный старый
образ; неверный паспорт блокирует загрузку. После RESET прочитайте версию снова.

97
Doc/GAS_167_M95M02.md Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

267
Doc/GAS_MODBUS_MAP.md Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

119
Doc/PERIPH28335_CAN.md Normal file
View File

@@ -0,0 +1,119 @@
# periph_28335: общая панель RS/CAN и регистратор УМП
## Где находятся панели
В верхнем ряду вкладок, рядом с **Altera Logic**, появилась **periph_28335**.
Внутри неё:
- **Dima / CAN terminal** — существующий CAN-терминал, его проекты, узлы и настройки адаптера;
- **rs232_periph_28335** — существующие операции RS232/485, Modbus и настройки COM;
- **Логгер УМП** — единая панель графиков и архива для обоих транспортов.
В общей группе CAN остались «Шина CAN / мост» и «DevBoard_V1».
В общей группе RS232/485 остался RS_TERMINAL_2812.
Терминалы сохраняют свои соединения: перенос вкладок не создаёт новые порты.
## Онлайн и чтение по CAN
1. Откройте **periph_28335 → Dima / CAN terminal → Настройки**.
2. Выберите Candle/gs_usb либо SLCAN/Lawicel и канал адаптера.
Для штатной прошивки Бальзам 167 используется CAN 250000 бит/с.
Нажмите «Подключить».
3. Перейдите в соседнюю вкладку **Логгер УМП**.
4. В строке **Связь логгера** выберите **CAN · адаптер Dima**.
5. Укажите **CAN-плата (Mode)**: физический номер платы в прошивке, 1..16.
Платы нагрузки Бальзам 167 имеют номера 5/6; выбирайте фактически подключённую.
Это не RS-адрес 16 и не индекс строки таблицы Dima. Выбор проекта в Dima
не меняет CAN-адрес регистратора: он явно определяется этим полем.
6. Нажмите **Начать запись** или **Онлайн**, если запись на плате уже идёт.
Остальные действия, флажки, легенда, единицы мА и CSV одинаковы для RS и CAN.
7. После команды отключения и секунды постинтервала нажмите
**Прочитать отключение**. Запись текущего банка на плате продолжается.
Кнопка **Настройки связи** открывает настройки выбранного транспорта.
Состояние адаптера/порта и адреса CAN постоянно отображаются над графиком.
**Прервать обмен** останавливает чтение GUI, не посылая команду остановки
регистратора или УМП. При переключении канала/платы незавершённые запросы
отменяются, поздние ответы не продолжают старую цепочку.
Для RS выберите **RS232/485** и настройте COM в соседней RS-панели:
обычно 115200, адрес 16. Сообщения «не подключён» и «занят запросом» разделены.
Отключение RS-порта не останавливает CAN-просмотр. CAN-разрыв не мешает RS.
Демо, если оно включено в сборке, по-прежнему работает без физической платы.
## Изменения прошивки
Для CAN требуется новая прошивка этой ветки. Предыдущая версия регистратора
умела отдавать данные только через Modbus. Старая плата игнорирует новые
служебные запросы; GUI сообщает о тайм-ауте без изменения команд УМП.
- MBOX0: прежняя передача технологических данных, ID 0xBA0010 + Mode - 1.
- MBOX1: прежний приём команд, ID 0xBA0000 + Mode - 1; дополнительно
распознаётся служебный заголовок 0x1F00 и длина ровно 8 байт.
- MBOX2: отдельные ответы регистратора, ID 0xBA0020 + Mode - 1.
Биты маски записи регистров у служебного запроса равны нулю. Обработчик
перехватывает его до изменения modbus[] и до журналирования CAN-команд:
опрос собственного журнала не заполняет журнал.
Запрос ставится в очередь из ISR. Основной цикл формирует целый снимок
под короткой блокировкой IRQ и отправляет максимум один кадр за вызов
UMP_CAN_service(). Ожидания передачи в цикле нет. Перед следующим
фрагментом приоритет отдаётся ожидающей штатной телеметрии MBOX0.
Если ACK служебного mailbox не приходит 250 тиков таймера, передача
отменяется. При этом штатные CAN-команды и MBOX0 не отменяются.
По CAN доступны те же расширенные адреса 0x1000 / 0x1010 / 0x1100,
состав записи и версия снимка 2. Новый протокол не даёт писать через
служебный запрос в технологические адреса 0..127.
## Формат кадров
CAN 2.0B, расширенный ID, 8 байт данных. Порядок соответствует существующей
прошивке: MDL (слова 1,2), затем MDH (заголовок, слово 0). Каждое слово
содержит сначала старший байт.
Запрос: `[адрес BE16, значение/длина BE16, 0x1F00 BE16, token:function BE16]`.
Функция 3 — чтение, 6 — запись; token — номер запроса 1..255.
Ответ: `[данные0 BE16, данные1 BE16, (0x1F00+индекс) BE16, token:error BE16]`.
Номер фрагмента 0..61, в нём два слова снимка. Ошибка 0 означает успех,
1 — неизвестная функция, 2 — неверный адрес/диапазон, 3 — запрещённое значение.
У записи успешный ответ содержит эхо адреса и значения.
Пример: Mode=5, token=7, чтение статуса 16 слов.
Запрос ID `0x00BA0004`, данные `10 00 00 10 1F 00 07 03`.
Ответы ID `0x00BA0024`, восемь фрагментов по два слова.
Онлайн-снимок из 124 слов передаётся 62 фрагментами.
GUI принимает только ответ выбранной платы с номером текущего запроса,
восстанавливает порядок фрагментов, игнорирует одинаковые дубликаты и
отклоняет противоречащие. Неполный снимок не попадает на график.
После потери подтверждения записи GUI прямо сообщает, что команда могла
выполниться; автоматического повторного старта регистратора нет.
Онлайн показывает последние три записи из полного снимка. При высокой
нагрузке шины/низкой скорости возможны пропуски онлайн-отображения;
они считаются существующим счётчиком. Архив читается целиком по блокам.
Предполагается один активный читатель архива: его курсор общий для RS/CAN.
Одновременное управление архивным курсором из двух независимых программ
не поддерживается.
## Проверки и ограничения
Пройдены тесты протокола, сборки всех 62 фрагментов, неверного адреса/токена,
пропущенных и повторных фрагментов, ACK и ошибок, отмены при смене канала,
иерархии вкладок и сохранения RS/демо. Набор тестов выполнен на Qt 6 и Qt 5.
В прошивке проверен настоящий код формирования ответов через host-тест;
изменённые C-файлы прошли проверку синтаксиса Clang с исходными заголовками.
Сборка TI/CCS, проверка MAP и испытание CAN на реальной плате ещё требуются.
Особенно проверить тайминги IRQ и приоритет штатной телеметрии на нагруженной
шине. Файлы прошивки Bin/*.out/hex не заменены. Архив остаётся в ОЗУ:
команда отключения фиксирует его, пропадание питания стирает.
## Общее ядро templates
Сервер CAN/RS логгера подключён через `Source/Internal/shared_ump.c`.
Для сборки требуется соседний `../../templates`. Контракт и порты:
`templates/c/set-protocol/docs/UMP_PROTOCOL.md`.

69
Doc/RS232_FIFO.md Normal file
View File

@@ -0,0 +1,69 @@
# RS232 FIFO для ПМ35 / TMS320F28335
Ветка `codex/pm35-uart-fifo`. FIFO включён **только SCI-A / COM_1 / RS232**.
SCI-B / COM_2 / RS485 сохраняет прежние настройки и обработчики без FIFO.
Скорости портов не менялись: RS232 115200; RS485 — прежние 57600/115200.
`Source/Internal/Include/RS485.h`: `RS232_USE_FIFO=1` по умолчанию.
Для сборки прежнего пути передачи определить `RS232_USE_FIFO=0`.
## Работа
- TX заполняет до 16 байт, пополняет при остатке не более 8.
- После постановки последнего байта порог переключается на 0. Следующее
прерывание завершает передачу только после пустого FIFO и `TXEMPTY`.
Ожидание внутри завершающего ISR ограничено остатком последнего символа;
передача всего FIFO внутри ISR не ожидается.
- Первый блок ставится в FIFO до разрешения TX-прерывания, под короткой
IRQ-блокировкой с восстановлением прежнего состояния.
- Убраны программные задержки перед передачей именно для SCI-A. Данные
`BM_CHAR32` и упакованный поток `BM_PACKED` сохраняют прежний порядок байтов.
Нулевая длина не обращается к указателю и не включает передатчик.
- RX читает накопленные байты из FIFO. Порог 1 сохраняет немедленный приём
коротких команд и остатка блока. `SCIRXBUF` читается один раз вместе с FE/PE.
- Ошибка/переполнение аннулирует пакет и `BS_LoadOK`, очищает FIFO. После
3–4 мс тишины обработчик таймера 1 мс возвращает SCI-A к ожиданию адреса.
Продолжающийся повреждённый поток продлевает ожидание. CMD_LOAD после
ошибки требует нового CMD_INITLOAD. Расчёт паузы предназначен для 115200.
- Счётчики отладчика: `rs_a.fifo_rx_errors`, `rs_a.fifo_overflows`.
Это UART-оптимизация. Она не меняет команды/формат логгера УМП и не подключает
экспериментальный GAS-логгер. Размеры блоков чтения УМП остаются прежними.
## Проверка
```powershell
python tests/rs232_fifo/run_test.py --cc C:/msys64/mingw64/bin/gcc.exe
```
Тест извлекает рабочие функции из `RS485.c`; заменяется только поведение
аппаратных регистров, ожидание продвижения UART и модель 16-битного char C28x.
Проверены TX-длины 0/1/2/7/8/15/16/17/31/120/253/400, упакованный блок 8194,
приём короткого/разделённого пакета и LOAD 8194, FIFO overflow, FE/PE,
восстановление после тишины, остаток сдвигового регистра и независимость SCI-B.
Полная сборка TI C2000 22.6.0.LTS:
```powershell
./build_logger.ps1 -OptimizeForSize -Rs232Fifo 1 `
-OutputDirectory "$PWD/Bin/Rs232FifoTest" -ImageName PM35_167_rs232_fifo
./build_logger.ps1 -OptimizeForSize -Rs232Fifo 0 `
-OutputDirectory "$PWD/Bin/Rs232NoFifoTest" -ImageName PM35_167_rs232_no_fifo
```
| Образ | Размер | Запас до параметров EEPROM |
|---|---:|---:|
| FIFO, `-O2 --opt_for_speed=0` | 32158 байт | 350 байт |
| Без FIFO, те же параметры оптимизации | 31234 байта | 1274 байта |
Оба BIN прошли проверку структуры SCI8 и лимита 32508 байт существующим
`check_firmware.ps1`. Старые `-O1 --opt_for_speed=3` с FIFO превышают лимит;
для этого варианта обязателен `-OptimizeForSize`. Проверка запрещает выпуск
слишком большого BIN и не даёт затронуть сохранённые параметры.
Оптимизация размера применяется ко всей сборке, поэтому временные
характеристики приложения нужно проверить на стенде.
На плату образы не загружены. Пока подтверждены сборка и тесты модели;
ускорение чтения логгера и устойчивость физического RS232 не измерены.
Для стенда сравнить одно и то же чтение архива на двух образах, проверить
CMD_LOAD/UPLOAD и параллельный RS485. FIFO не увеличивает baud rate.

241
Doc/UMP_LOGGER.md Normal file
View File

@@ -0,0 +1,241 @@
# Логгер запуска и отключения УМП: прошивка Бальзам 167 и SetGUI
## Назначение и работа оператора
В SetGUI открыть ПМ35 → Настройки, выбрать COM, скорость (обычно 115200)
и адрес контроллера (обычно 16). Затем открыть вкладку **Логгер УМП**.
Подключение используется существующее: прямой RS232/RS485 Modbus RTU.
CAN-команды от управляющего контроллера фиксируются самой платой нагрузки.
1. **Начать запись** включает только регистратор, не пуск УМП.
Период снимков по умолчанию 20 мс, диапазон 1–1000 мс.
2. Флажки выбирают отображаемые сигналы. Аналоги рисуются линиями,
дискретные сигналы — отдельными дорожками. Выбор не меняет состав
записи на плате: скрытую кривую можно включить после захвата.
3. **Онлайн** подключает график к уже идущей записи, в том числе после
восстановления соединения. Тайм-аут не посылает плате команду останова.
4. Фронт `cUMPreset` (бит 6 команды 0x7F) или спад `cUMPstart` (бит 7)
запускает фиксацию отключения. Ещё через 1000 тиков таймера / 1 секунду
банк становится архивом. Повторные команды внутри этой секунды
не продлевают интервал. Другие изменения команд не служат триггером.
5. **Прочитать отключение** загружает архив, не останавливая запись на плате.
На время чтения и просмотра архива онлайн-график приостанавливается;
вернуться к нему можно кнопкой **Онлайн**.
6. **Остановить и прочитать** останавливает только регистратор и читает
текущий банк. При этом существующий архив отключения остаётся доступным.
7. **Сохранить CSV** сохраняет все поля загруженного/онлайн-буфера,
включая невидимые кривые, время и код события. История GUI ограничена
800 последними точками; это не непрерывная запись на диск.
При разрыве связи журнал на плате продолжает работать. Архив хранится в ОЗУ
до следующей фиксации отключения либо перезагрузки/пропадания питания.
EEPROM не используется: под отключением в этой задаче понимается команда
управляющего контроллера, а не потеря питания.
## Память и точность
Использована существующая секция `.logg` по адресу 0x200000: 64000
16-битных слов. Два банка по 760 записей × 42 слова занимают 63840 слов (160 слов свободны).
Текущий банк кольцевой. При триггере сохраняются последние до 379 записей,
добавляется событие отключения, оставшаяся половина банка отведена
постинтервалу. При 20 мс это до примерно 7.6 секунды до отключения и 1 секунды
после. Дополнительные события CAN и дискретов сокращают временную глубину.
При интенсивном потоке событий или периоде 1 мс постинтервал может заполнить
свои места раньше секунды. Последнее место зарезервировано под конечный
снимок; он помечается `event & 0x200`, и GUI сообщает об усечении.
Событие отключения и предыстория при этом не вытесняются.
Время — 32-битный счётчик миллисекунд записи. Он идёт только при включённом
регистраторе и не является абсолютным временем. События в одном тике имеют
одинаковую отметку; порядок сохраняется порядком записей. На перезапуске
регистратора счётчик продолжает прежнюю шкалу, при перезагрузке платы — 0.
Онлайн-опрос возвращает две последние записи каждые 40 мс. Он не гарантирует
передачу каждого события при высоком CAN-трафике, медленном UART или паузах
GUI. Номера записей позволяют убрать дубликаты и явно показать пропуски.
Полный сохранившийся фрагмент следует читать кнопкой архива. Частота 20 мс
выбрана с учётом размера кадра; на низких скоростях нужна большая пауза
снимков и подходящий тайм-аут RS.
Все писатели и чтение одного Modbus-блока используют короткие критические
секции с восстановлением прежнего состояния IRQ. Внутри нет ожидания UART,
EEPROM, выделения памяти или копирования целого банка. Реальную задержку
прерываний и длительность критических секций нужно измерить на F28335.
## Состав записи v3: 42 слова
| Слова | Данные | Единицы/смысл |
|---|---|---|
| 0–1 | Время, младшее/старшее слово | мс записи |
| 2 | Событие | 1 период, 2 CAN RX, 3 изменение I/O, 4 RS-команда, 5 конец постинтервала |
| 2, бит 8 | Триггер отключения | флаг поверх причины события |
| 2, бит 9 | Усечён постинтервал | установлен в конечном снимке |
| 3 | Commands / modbus[0x7F] | все 16 бит, в том числе пуск, сброс, инициализация и калибровка ЦАП |
| 4 | Входы OMEGA, Start_1, Res_in | биты 0,1,2, активный уровень приведён к 1 |
| 5 | START_DPTB, STOP_DPTB, RES_OUT_2 | биты 0,1,2, активный уровень приведён к 1 |
| 6 | IMPowse | остаток импульса, мс |
| 7 | WAKEpowse | остаток инициализации, тики DAC_FREQ |
| 8 | modbus[0x7B] | 12-битный код, переданный функцией dSEND в ЦАП |
| 9 | modbus[0x1C] | расчётное задание в 0.1 мА; GUI/CSV переводит в мА |
| 10–13 | sens_data[0..3] | измеренные сигналы, знаковое 16-битное значение в исходном масштабе |
| 14–17 | modbus[0..3] | маски ошибок измерений |
| 18 | CAN заголовок | адрес регистра в младших 13 битах и маска трёх слов в старших |
| 19–21 | Три слова последнего принятого CAN-кадра | без преобразования |
| 22 | Счётчик записанных CAN RX | младшие 16 бит |
| 23 | CanTimeOutErrorTR | младшие 16 бит счётчика тайм-аутов CAN TX |
| 24–25 | DAC_go, DAC_stop | исходные начальная/конечная уставки, мА |
| 26–28 | DAC_min(), DAC_max(), DAC_cal() | коды калибровки и ручного задания ЦАП |
| 29–30 | DAC_04, DAC_20 | значения соответствующих регистров |
| 31–32 | count_load, time_dac | положение и длительность разгона в тиках |
| 33–34 | эффективные dac_go/dac_stop + 4 | 0.1 мА после ограничений алгоритма; GUI переводит в мА |
| 35 | kod | целочисленное положение, используемое Anal_output |
| 36–39 | ADC_table[0..3] | значения таблицы АЦП в исходном масштабе прошивки |
| 40 | ЗПТ1: U1 + U2, ПМ67 регистр 306 / индекс 305 | исходное 16-битное слово без пересчёта |
| 41 | ЗПТ2: U3 + U4, ПМ67 регистр 9 / индекс 8 | исходное 16-битное слово без пересчёта |
Напряжения принимаются из технологических CAN-кадров с нулевыми индексами
305 и 8. Учитываются все три позиции и биты маски 0x8000/0x4000/0x2000.
Они хранятся отдельно от массива modbus[0..127], обновляются и при выключенном
логгере. Запись содержит последние принятые значения; до первого приёма — 0.
При потере связи остаётся последнее значение: отдельного признака свежести нет.
Масштаб и знаковость физического напряжения не заданы исходной таблицей;
SetGUI показывает исходное беззнаковое слово, коэффициент задаётся в интерфейсе.
**Отправленный код ЦАП не является измеренным током выхода.** В этом проекте
не установлено, какой вход аппаратно измеряет ток ЦАП. При включённом
`cCalibrDac` отправляется `DAC_cal()`, а расчётное задание 0x1C остаётся
результатом алгоритма разгона. Для диагностики это различие сохранено.
ADC_table также уже обрабатывается существующим измерительным кодом;
это не обязательно необработанный регистр ADCRESULT.
Управляющая логика не исправлялась. Например, существующая строка
`if(dac_stop>16) dac_go=16;` в Load_runner сохранена; журнал показывает
фактически получившиеся эффективные уставки, чтобы выявить такое поведение.
## Протокол расширения Modbus
Технологические адреса 0..127 сохранены. Новая область использует полный
16-битный адрес; исходная реализация игнорировала старший байт.
Сначала GUI читает 16 слов 0x1000 и проверяет сигнатуру, версию, размер записи
и тип платы. До успешной проверки расширенные записи запрещены.
Обычный ответ расширения не содержит исторических хвостовых нулей.
Между ответом и следующим запросом GUI выдерживает паузу RTU.
FC03, 0x1000, 16 слов:
| Смещение | Значение |
|---|---|
| 0,1 | 0x554D, версия 3 |
| 2,3 | состояние и число записей выбранного источника |
| 4,5 | 42 слова в записи, 760 записей в банке |
| 6 | период периодических снимков, мс |
| 7,8 | счётчик времени, младшее/старшее слово |
| 9,10 | Desk (требуется 6 / dsk_LOAD), Mode |
| 11 | частота временной базы, 1000 Гц |
| 12 | поколение архива, mod 65536 |
| 13 | число записей архива |
| 14 | оставшиеся миллисекунды постинтервала |
| 15 | состояние текущего регистратора независимо от выбора источника |
Состояния: 0 — ещё не запущен, 1 — запись, 3 — остановлен/архив.
FC06:
- 0x1000: 1 — новый текущий журнал, 0 — остановить его;
- 0x1001: период 1..1000, менять только при остановленном журнале;
- 0x1002: хронологический индекс первой записи окна 0..759;
- 0x1003: источник окна, 0 — текущий остановленный банк, 1 — архив отключения.
FC03, 0x1010, до 120 слов: окно от установленного индекса; для целых записей v3 читать 42 или 84 слова.
CAN допускает 42/84 и прежние размеры 40/80/120; RTU допускает 1..120 слов.
Чтение текущего банка этим окном во время записи не выдаёт изменяющиеся
данные. GUI сначала останавливает его; архив можно читать при работающем
текущем банке. После всех блоков GUI повторно проверяет поколение архива;
при замене во время чтения результат не подменяет предыдущий график.
FC03, 0x1100, ровно 124 слова: онлайн-блок. Слова 0,1 — 32-битный номер
первой записи, 2 — число записей 0..2, 3 — поколение архива, далее до двух
записей по 42 слова. Неиспользованные слова равны нулю. Окно онлайн не
зависит от курсора/выбора архива. Разделение 0x1010 и 0x1100 предотвращает
пересечение двух окон.
Недопустимые диапазоны и значения возвращают исключения Modbus 2/3.
CRC и разбор стандартного ответа GUI используют существующее общее ядро.
SetGUI распознаёт v2 (40 слов, 800 записей) и v3 (42 слова, 760 записей).
Для v2 новые напряжения недоступны (NaN), для v3 доступны графики и CSV.
CAN-валидация общей библиотеки расширена размерами 42/84 слова.
Исходники протокола подключаются к прошивке из templates/c/set-protocol.
## Проверка и запуск
Полная сборка исправления: `./build_logger.ps1`. По умолчанию используется
`../newProject/SETGUI/third_party/templates`; другую копию можно указать
параметром `-TemplatesRoot`. В ней нужны `c/set-protocol/src/ump_protocol.c`
и `c/set-protocol/ports/tms320f28335/ump_tms28335.c` (порт УМП v3).
Само наличие папки templates не гарантирует наличие этого порта.
Результат — `Bin/LoggerFix/UKSSTMS320F28335_logger_fix.bin` (SCI8 boot),
рядом OUT и MAP. Старые образы в Bin не заменяются.
Скрипт использует TI C2000 22.6 COFF, оптимизацию размера и секции функций;
таблица `.cinit` размещена в RAML4 вместе с константами, код — в RAML0.
Для сборки из CCS добавьте `Source/Internal/shared_ump.c` в проект и каталоги
`<templates>/c/set-protocol`, `<templates>/c/set-protocol/ports/tms320f28335`
в include path; используйте параметры оптимизации из скрипта.
При загрузке `main()` вызывает `ump_log_init()` до включения прерываний.
Это обязательно для TI COFF: стартовый код не обнуляет неинициализированные
переменные `.ebss`. Без явной инициализации состояние, счётчики и номера
банков могут содержать остаточные значения RAM. Очистка `.logg` функцией
`clear_mem()` эти переменные не затрагивает. Повторный запуск записи через
FC06 не вызывает загрузочную инициализацию и сохраняет архив и шкалу времени.
Регрессия `python tests/ump_logger/run_init_test.py` (GCC в PATH) проверяет
запуск с ненулевой RAM и отрицательный контроль без инициализации;
внешняя библиотека `templates/c/set-protocol` для этого теста не нужна.
Изменены исходники прошивки и SetGUI. Готовый образ в Bin не обновлялся.
Для платы необходима сборка штатным TI C2000/CCS, проверка размещения .text,
.stack, .ebss и .logg по MAP, прошивка и испытание на стенде.
Автотест C в tests/ump_logger компилирует непосредственно log_to_mem.c
с подменой GPIO/IRQ. Проверяет кольцо, граничные адреса, обе команды
отключения, защиту триггера от переполнения, переключение банков,
сохранность архива во время дальнейшей записи и контрольные поля CAN/ЦАП.
Это проверка алгоритма на компьютере, не проверка таймингов и 16-битной ABI
TI. Отдельно выполнена синтаксическая проверка изменённых C-файлов Clang
с исходными заголовками и декларациями TI-интринсиков.
Тесты SetGUI: tests/test_ump_logger.py и tests/test_periph28335_tab.py.
Они проверяют единицы мА, битовые сигналы, временные метки, несовместимую
прошивку, порядок команд, архив при активной записи, замену поколения,
дубликаты/пропуски онлайн, потерю связи и флажки графиков.
Проверка на стенде: включить запись → подать CAN-пуск → изменить уставку →
подать откл. → через секунду прочитать архив → сверить код ЦАП, ток внешним
измерителем и физические входы/выходы; затем повторить с разрывом RS.
Период 1 мс проверить отдельно под максимальной CAN-нагрузкой.
Для сборки v3 нужен templates/main начиная с коммита c0ee7c4
(поддержка CAN-чтения 42/84 слов и порт TMS320F28335).
## Пересечение образа 34a95bc5 с параметрами EEPROM
Образ `UKSSTMS320F28335_34a95bc5.bin` имеет размер 32518 байт.
`Save_params` записывает 129 слов с адреса `0x3FFF-(128+1)`;
драйвер EEPROM умножает адрес на 2. Параметры начинаются с байта 32508.
Последние 10 байт BIN пересекаются с параметрами: два последних адреса
таблицы переходов `ump_log_read` (регистры 0x100E/0x100F) и завершающее
нулевое слово загрузочной таблицы. Сохранение параметров повреждает эту
часть образа для последующей загрузки. Это установленный дефект образа;
причину таймаута на конкретной плате нужно подтвердить повторной проверкой.
В исправлении временный снимок RS перенесён со стека в статический буфер:
обработчики RS вызываются последовательно из main, а перед возвратом
снимок полностью кодируется в собственный буфер UART. CAN имеет свой буфер.
Сборка `build_logger.ps1` использует параметры CCS Debug (-O1, speed=3)
и создаёт отдельный `Bin/LoggerEepromFix/UKSSTMS320F28335_logger_eeprom_fix.bin`.
Проверенный размер — 32494 байта, запас до параметров — 14 байт.
Оба сценария сборки вызывают `check_firmware.ps1` до публикации BIN.
Проверяются размер, формат SCI8, полнота блоков и конец загрузочной таблицы.
При превышении границы остаётся только файл `.pending`; готовый BIN
не публикуется. Проверка: `python tests/ump_logger/test_firmware_image.py`.
После перепрошивки требуется проверка на плате; проверка на ПК её не заменяет.

View File

@@ -0,0 +1,115 @@
# Контроль роста ЗПТ при пуске УМП
УМП с адресом 5 (`Mode=5`) контролирует ЗПТ1 — CAN-индекс 305
(регистр ПМ67 306). УМП 6 контролирует ЗПТ2 — CAN-индекс 8
(регистр ПМ67 9). Масштаб исходного слова: 1 единица = 1 В.
## Условия и последовательность
Начальный безопасный код задания соответствует 4 мА по `DAC_min()`.
Рост напряжения считается достаточным при ЗПТ **не меньше 30 В**.
Проверяется расчётное задание ЦАП, а не измеренный выходной ток.
Ручная калибровка не подменяет задание при активной команде пуска
или удерживаемом STOP.
Если очередной шаг рампы требует **строго больше 6 мА**, а свежее
CAN-напряжение меньше 30 В, шаг не передаётся в ЦАП. Вместо него:
1. Снимается START, включается STOP, снимается разрешение RES_OUT_2.
2. Положение рампы обнуляется, передаётся код 4 мА без подмены калибровкой.
3. STOP остаётся включённым **1000 мс от момента его установки**.
4. Когда код 4 мА отправлен, прошла секунда и есть свежее ЗПТ,
снимается STOP, сразу выставляется START, затем разрешение.
5. Новая рампа начинается с нулевого положения с исходными уставками
`DAC_go`/`DAC_stop` (штатные значения могут начинать рост с 6 мА).
Первый START входит в лимит: **всего 5 попыток**, не 5 дополнительных.
После пятой неудачной попытки удерживаются STOP и 4 мА, разрешение снято,
шестой START не выдаётся. Ошибка снимается командой `cUMPstart=0`;
затем можно подать новый пуск. Команда RESET имеет приоритет перед START.
Отпускание RESET с оставшимся START=1 само по себе не перезапускает УМП.
Выходами и рампой управляет один обработчик Timer1 (1 мс). Основной цикл
больше не формирует независимые фронты START/STOP. Расчёт/отправка ЦАП
остались с периодом 5 мс. Импульс START длится до 1000 мс, но защита
или RESET прекращают его раньше.
## Отсутствие CAN
Таймаут по умолчанию **600 мс**, диапазон настройки **1…60000 мс**.
Свежесть подтверждается только получением нужного ЗПТ в полном
технологическом CAN-кадре с соответствующим битом маски. Другое
напряжение, сервисные запросы, команды и произвольные CAN-пакеты
таймаут не сбрасывают. До первого значения напряжение считается неизвестным.
При таймауте работающая рампа удерживает последнее положение и отправленный
код. Попытка не считается неудачной, STOP по одному таймауту не включается.
После свежего ЗПТ рост продолжается; если оно меньше 30 В при задании
больше 6 мА, выполняется защитный STOP. Если обмен исчез во время
сброса, STOP держится и после секунды — до свежего напряжения.
Первый пуск также ждёт свежего значения.
Настройка хранится в технологическом регистре `0x52` платы нагрузки.
Значение 0 в старом EEPROM заменяется на 600 мс при запуске.
Для сохранения изменения используйте штатную команду сохранения параметров.
## Диагностика и эмуляция в GUI
Во вкладке **Логгер УМП** добавлены:
- **Защита ЗПТ: прочитать** — состояние защиты, число попыток, напряжение.
- **Эмуляция: нет CAN** — получение своего ЗПТ игнорируется платой;
после заданного таймаута рампа удерживается.
- **Эмуляция: ЗПТ не растёт** — для проверки защиты используется 0 В,
хотя настоящие кадры продолжают поступать. Реальные напряжения в
журнале не подменяются. Этот режим действительно вызывает STOP/пуски.
- **Задать таймаут** — запись значения в плату с обязательным чтением обратно.
Кнопки эмуляции включаются после проверки сигнатуры прошивки. Их положение
меняется только после подтверждённого чтения обратно. Два режима можно
включать независимо; при отсутствии свежести проверка роста приостановлена.
Эмуляция живёт только в RAM, не сохраняется в EEPROM и выключена после
перезагрузки. GUI показывает активную эмуляцию отдельно от реального ЗПТ.
При онлайн-чтении GUI опрашивает защиту каждые 500 мс и показывает
**«НЕИСПРАВНОСТЬ: ЗПТ не достигло 30 В за 5 попыток»**.
Старые прошивки без блока защиты продолжают обычное онлайн-чтение;
эмуляция для них недоступна.
Технологические регистры только для чтения: `0x7C` — статус,
`0x7D` — число попыток. Оба включены в быстрый CAN-цикл.
Статус: бит 0 — ошибка пяти попыток, бит 1 — нет свежего ЗПТ,
бит 2 — сброс перед повтором, бит 3 — работа рампы,
биты 4/5 — активная эмуляция отсутствия CAN/роста ЗПТ.
Локальный блок RTU и служебного CAN: FC03 `0x1300`, ровно 8 слов:
| Смещение | Значение |
|---|---|
| 0 | Сигнатура `0x5550` |
| 1 | Версия 1 |
| 2 | Эмуляция: бит 0 — нет CAN, бит 1 — нет роста |
| 3 | Таймаут, мс |
| 4 | Статус защиты |
| 5 | Число попыток |
| 6 | Последнее реальное CAN-напряжение, В |
| 7 | Возраст значения, мс; 65535 до первого значения |
FC06 допускает запись только `0x1302` (0…3) и `0x1303` (1…60000).
Диагностический обмен не обновляет возраст технологического напряжения.
## Проверки
`python tests/load_control/run_test.py` компилирует непосредственно
`DAC.c` с подменой GPIO/IRQ. Проверяются выбор ЗПТ, маски CAN, таймаут,
удержание кода, граница 30 В, порядок STOP/START, точная пауза 1000 мс,
лимит пяти пусков, RESET, эмуляция и невозможность подмены 4 мА калибровкой.
GUI: `tests/test_ump_voltage_protection.py` в SETGUI плюс регрессии логгера.
Сборка: `build_logger.ps1 -OutputDirectory Bin/VoltageProtection
-ImageName UKSSTMS320F28335_voltage_protection`. Размер проверяется до
публикации BIN; для AT25256B предел — 32508 байт. В режиме оптимизации
функции разнесены по секциям, чтобы линкер удалял неиспользуемые функции.
Это проверки на компьютере. Физический ток 4 мА, уровни разрешения,
STOP и интервал 1 с нужно проверить на стенде с установленной прошивкой.

View File

@@ -69,6 +69,18 @@
*/
/* Serial EEPROM is NOT CPU-addressable RAM/Flash. Do not add a fake MEMORY
* region at address zero: SPI boot copies its table into the RAM areas below.
* Export its physical layout as absolute byte/word symbols for .map/debugging.
* The final SCI8 image size (including boot headers) is checked after hex2000. */
#include "Source/Internal/Include/eeprom_config.h"
#include "include/balsam167_eeprom_layout.h"
_EEPROM_TOTAL_BYTES = BALSAM167_EEPROM_BYTES;
_EEPROM_FIRMWARE_LIMIT_BYTES = BALSAM167_EEPROM_FIRMWARE_BYTES;
_EEPROM_PARAMS_START_WORD = BALSAM167_EEPROM_PARAMS_START_WORD;
_EEPROM_PARAMS_START_BYTE = BALSAM167_EEPROM_FIRMWARE_BYTES;
_EEPROM_PARAMS_END_BYTE = BALSAM167_EEPROM_PARAMS_END_WORD * 2;
MEMORY
{
PAGE 0: /* Program Memory */
@@ -128,7 +140,8 @@ SECTIONS
{
/* Allocate program areas: */
.cinit : > RAML0 PAGE = 0
/* Keep initialization tables out of the code RAM block. */
.cinit : > RAML4 PAGE = 0
.pinit : > RAML0 PAGE = 0
.text : > RAML0 PAGE = 0
codestart : > BEGIN PAGE = 0

View File

@@ -1,5 +1,5 @@
#include "DSP2833x_Device.h" // DSP281x Headerfile Include File
#include "DSP2833x_Examples.h" // DSP281x Examples Include File
#include "DSP2833x_Examples.h" // DSP281x Examples Include File
#include "DSP2833x_SWPrioritizedIsrLevels.h"
#include "ADC.h"

View File

@@ -21,12 +21,110 @@ unsigned long WAKEpowse;
unsigned long IMPowse;
unsigned int period_dac, time_dac;
/* Âñå âûõîäû ÓÌÏ è ðàìïà ïðèíàäëåæàò îäíîìó îáðàáîò÷èêó Timer1.
* Îñíîâíîé öèêë áîëüøå íå âûäà¸ò START: èíà÷å îí ìîæåò óâèäåòü êîðîòêèé
* ñïàä êîìàíäû, êîòîðûé ïðîïóñòèò ðàñ÷¸ò ÖÀÏ ñ ïåðèîäîì 5 ìñ. */
#define LOAD_IDLE 0U
#define LOAD_RUN 1U
#define LOAD_RELOAD 2U
#define LOAD_FAULT 3U
#define LOAD_MAX_ATTEMPTS 5U
#define LOAD_VOLTAGE_MIN 30U
#define LOAD_PULSE_MS 1000U
static unsigned int load_state, load_attempts, load_inhibit;
static unsigned int load_count_dac, load_count_ramp, load_init_count;
static unsigned int load_zero_sent, load_stop_asserted, load_initialized;
static float load_go, load_end;
/* 16-áèòíûå ïîëÿ îáùèå ñ CAN ISR. Ñíèìîê è óâåëè÷åíèå âîçðàñòà âûïîëíÿþòñÿ
* ïîä êîðîòêîé áëîêèðîâêîé IRQ; îòïðàâêà SPI ïîä áëîêèðîâêîé íå âûïîëíÿåòñÿ. */
static volatile unsigned int load_voltage, load_voltage_age, load_voltage_seen;
static volatile unsigned int load_simulation;
void Load_control_init(void)
{
load_state = LOAD_IDLE; load_attempts = 0; load_inhibit = 0;
load_count_dac = 0; load_count_ramp = 0; load_init_count = 1;
load_zero_sent = 0; load_stop_asserted = 0; load_initialized = 0;
load_go = 0; load_end = 0;
load_voltage = 0; load_voltage_age = 0; load_voltage_seen = 0;
load_simulation = 0;
IMPowse = 0; WAKEpowse = 0; period_dac = 0; time_dac = 0;
}
/* Âîçðàñò ñáðàñûâàåò òîëüêî íóæíîå íàïðÿæåíèå, à íå ëþáîé CAN-ïàêåò.
* ÓÌÏ 5: ÇÏÒ1, èíäåêñ 305; ÓÌÏ 6: ÇÏÒ2, èíäåêñ 8. Ìàñøòàá 1 Â/åä.
* Ìàñêè ñëîòîâ ñîõðàíÿþò àäðåñà äàæå äëÿ ïðîïóùåííûõ ñëîâ êàäðà. */
void Load_voltage_can(unsigned int header, unsigned int a,
unsigned int b, unsigned int c)
{
unsigned int address = header & 0x1FFFU;
unsigned int selected, i, mask = 0x8000U, data[3];
if (Desk != dsk_LOAD || (load_simulation & 1U)) return;
if (Mode == adr_LOA1) selected = 305U;
else if (Mode == adr_LOA2) selected = 8U;
else return;
data[0] = a; data[1] = b; data[2] = c;
for (i = 0; i < 3; i++, address++, mask >>= 1) {
if ((header & mask) && address == selected) {
load_voltage = data[i];
load_voltage_age = 0;
load_voltage_seen = 1;
}
}
}
/* STOP óäåðæèâàåòñÿ âåñü ñáðîñ, âêëþ÷àÿ îòïðàâêó êîäà 4 ìÀ â ÖÀÏ.
* Ïîâòîðíûé ïóñê ðàçðåø¸í òîëüêî ïîñëå ýòîé îòïðàâêè è 1000 ìñ STOP.
* Ýòî ïîäòâåðæäåíèå ïðîãðàììíîé îòïðàâêè, íå èçìåðåíèå ôèçè÷åñêîãî òîêà. */
static void load_stop(unsigned int state)
{
clear_START_DPTB();
set_STOP_DPTB();
clear_RES_OUT_2();
load_stop_asserted = 1;
load_state = state;
load_count_ramp = 0;
load_zero_sent = 0;
IMPowse = LOAD_PULSE_MS;
}
static void load_start(void)
{
/* Óñòàâêè ôèêñèðóþòñÿ äëÿ êàæäîé ïîïûòêè. Âíóòðåííèé íîëü = 4 ìÀ.
* Èñïðàâëåíà îïå÷àòêà ñòàðîãî îãðàíè÷åíèÿ: îãðàíè÷èâàåì êîíåö ðàìïû,
* à íå çàìåíÿåì íà÷àëüíóþ óñòàâêó íà 16 (÷òî äàâàëî ñêà÷îê äî 20 ìÀ). */
load_go = (float)DAC_go - 4.0;
load_end = (float)DAC_stop - 4.0;
if (load_go < 0) load_go = 0;
if (load_go > 5) load_go = 5;
if (load_end > 16) load_end = 16;
if (load_end <= load_go) load_end = load_go + 1;
ump_dac_go10 = (unsigned int)((load_go + 4.0) * 10.0);
ump_dac_stop10 = (unsigned int)((load_end + 4.0) * 10.0);
load_count_ramp = 0;
load_attempts++;
/* STOP îòïóñêàåì íåïîñðåäñòâåííî ïåðåä START, ðàçðåøåíèå — ïîñëå íåãî.
* Çàäàíèå îñòà¸òñÿ 4 ìÀ äî ïåðâîãî øàãà íîâîé ðàìïû. */
clear_STOP_DPTB();
load_stop_asserted = 0;
set_START_DPTB();
set_RES_OUT_2();
IMPowse = LOAD_PULSE_MS;
load_state = LOAD_RUN;
}
void Setup_DAC_time(void)
{
WAKEpowse = 3L * DAC_FREQ +1;
period_dac = READY_FREQ / DAC_FREQ;
time_dac = LOAD_TIME * DAC_FREQ;
/* Ñòàðûå EEPROM èìåþò íîëü â íîâîì ïàðàìåòðå: èñïîëüçóåì 600 ìñ.
* 1..60000 ìñ ìîæíî ìåíÿòü ÷åðåç ðåãèñòð 0x52 è ñîõðàíÿòü øòàòíî. */
if ((unsigned int)LOAD_CAN_TIMEOUT == 0U ||
(unsigned int)LOAD_CAN_TIMEOUT > 60000U) LOAD_CAN_TIMEOUT = 600;
LOAD_STATUS = 0; LOAD_ATTEMPTS = 0;
load_initialized = 1;
}
void dOUT(int x)
@@ -63,7 +161,7 @@ void Init_DAC(void)
toggle_RES_OUT_1();
}
void Anal_output(long vrot, long maxx)
static void anal_output(long vrot, long maxx, int calibration)
{
long out;
static int x;
@@ -72,7 +170,7 @@ void Anal_output(long vrot, long maxx)
x=0;// !x; òùåòíî áûòèå
if(cCalibrDac) out=DAC_cal();
if(calibration && cCalibrDac) out=DAC_cal();
out = out & 0xFFF;
@@ -99,70 +197,145 @@ Log_to_mem(modbus[0x1D]);
}
void Load_runner()
/* Ñîõðàí¸í ïóáëè÷íûé èíòåðôåéñ; çàùèòíûé ñáðîñ âûçûâàåò âíóòðåííþþ
* ôóíêöèþ ñ calibration=0, ÷òîáû ðó÷íàÿ êàëèáðîâêà íå ïîäìåíèëà 4 ìÀ. */
void Anal_output(long vrot, long maxx)
{
static unsigned int count_dac=0, count_load=0, x=1;
static unsigned int preStart=0;
static float dac_go,dac_stop;
float sinus=0;
int kod;
if (maxx > 0) anal_output(vrot, maxx, 1);
}
if(IMPowse) IMPowse--;
if(++count_dac >= period_dac)
{
count_dac=0;
void Load_runner(void)
{
unsigned int saved, commands, voltage, fresh, timeout;
unsigned int start, reset, active = 0;
float sinus = 0;
if(WAKEpowse)
{
--WAKEpowse;
/* ISR ðàáîòàåò 1 êÃö, íî GPIO/ÖÀÏ íåëüçÿ îáñëóæèâàòü äî çàãðóçêè
* ïàðàìåòðîâ. Ýòî òàêæå èñêëþ÷àåò ïðåæíåå äåëåíèå íà time_dac=0. */
if (!load_initialized || !READY || !period_dac || !time_dac) return;
saved = __disable_interrupts();
commands = (unsigned int)Commands;
voltage = (load_simulation & 2U) ? 0U : load_voltage;
timeout = (unsigned int)LOAD_CAN_TIMEOUT;
if (!timeout || timeout > 60000U) timeout = 600U;
/* Äî ïåðâîãî ïàêåòà çíà÷åíèå 0 íå ñ÷èòàåòñÿ ñâåæèì èçìåðåíèåì.
* Íàñûùåíèå âîçðàñòà èñêëþ÷àåò ëîæíîå âîññòàíîâëåíèå ïîñëå ïåðåïîëíåíèÿ. */
fresh = load_voltage_seen && load_voltage_age < timeout;
if (load_voltage_age < 65535U) load_voltage_age++;
__restore_interrupts(saved);
start = commands & 0x80U; reset = commands & 0x40U;
if (IMPowse) IMPowse--;
if( (WAKEpowse == DAC_FREQ/2*6)||
(WAKEpowse == DAC_FREQ/2*5)||
(WAKEpowse == DAC_FREQ/2*4)||
(WAKEpowse == DAC_FREQ/2*3)||
(WAKEpowse == DAC_FREQ/2*2)||
(WAKEpowse == DAC_FREQ/2*1) )
{
Init_DAC(); x=1;
} }
/* Îòñóòñòâèå êîìàíäû ïóñêà — íà÷àëî íîâîãî ñåàíñà, ñáðàñûâàåò îøèáêó.
* RESET âñåãäà ñòàðøå START; îòïóñêàíèå RESET ïðè îñòàâøåìñÿ START
* íå äà¸ò íåîæèäàííîãî ïîâòîðíîãî ïóñêà: ñíà÷àëà òðåáóåòñÿ START=0. */
if (!start) {
if (load_state != LOAD_IDLE) load_stop(LOAD_IDLE);
load_attempts = 0; load_inhibit = 0;
} else if (reset) {
if (load_state != LOAD_FAULT && load_state != LOAD_IDLE)
load_stop(LOAD_IDLE);
load_inhibit = 1;
}
if (reset && !load_stop_asserted) load_stop(LOAD_IDLE);
else
{
if(cUMPstart)
{
if(!preStart)
{
dac_go=DAC_go-4;
dac_stop=DAC_stop-4;
if(dac_go<0) dac_go=0;
if(dac_go>5) dac_go=5;
if(dac_stop>16) dac_go=16;
if(dac_stop<=dac_go) dac_stop=dac_go+1;
}
/* Ïîâòîðíûé START äîïóñêàåòñÿ ïîñëå ñáðîñà ÖÀÏ, îêîí÷àíèÿ STOP è
* âîññòàíîâëåíèÿ íóæíîãî CAN-íàïðÿæåíèÿ. Òàéìàóò ñàì íå òðàòèò ïîïûòêó. */
if (start && !reset && !load_inhibit && !WAKEpowse && fresh &&
load_zero_sent && !IMPowse &&
(load_state == LOAD_IDLE || load_state == LOAD_RELOAD)) load_start();
if (load_state == LOAD_RUN && !IMPowse) clear_START_DPTB();
if(count_load > (time_dac/2))count_load++;
if (++load_count_dac >= period_dac) {
load_count_dac = 0;
if (WAKEpowse) {
--WAKEpowse;
if (WAKEpowse && !(WAKEpowse % (DAC_FREQ / 2))) {
Init_DAC(); load_init_count = 1;
}
} else {
active = load_state == LOAD_RUN;
if (active) {
/* Ïðè òàéìàóòå ñîõðàíÿåì ïîëîæåíèå È îòïðàâëåííîå çàäàíèå,
* íå äåëàåì STOP è íå ïðîäîëæàåì ðàçãîí áåç îáðàòíîé ñâÿçè. */
if (fresh) {
if (load_count_ramp > time_dac / 2) load_count_ramp++;
if (++load_count_ramp > time_dac) load_count_ramp = time_dac;
}
sinus = ((load_end - load_go) / 16.0 * load_count_ramp) +
(load_go / 16.0 * time_dac);
/* Ïðîâåðÿåì ñëåäóþùèé øàã ÄÎ ïåðåäà÷è ÖÀÏ. 6 ìÀ äîïóñòèìû,
* ñòðîãî >6 ìÀ è <30  òðåáóþò íåìåäëåííîãî STOP.
* Ïåðâàÿ ïîïûòêà âõîäèò â ëèìèò 5; øåñòîãî START íå áóäåò. */
if (fresh && voltage < LOAD_VOLTAGE_MIN &&
sinus * 16.0 > 2.0 * time_dac) {
load_stop(load_attempts >= LOAD_MAX_ATTEMPTS ?
LOAD_FAULT : LOAD_RELOAD);
active = 0; sinus = 0;
}
} else {
load_count_ramp = 0;
load_init_count = (load_init_count + 1) & 0x3FFU;
}
/* Âî âðåìÿ çàùèòû è ïóñêà ðó÷íîé êîä êàëèáðîâêè çàïðåù¸í.
* Êàëèáðîâêà ñîõðàíåíà òîëüêî ïðè ñíÿòîì START è ñâîáîäíîì STOP.
* Íóëåâîé êîä çàäàíèÿ çäåñü îçíà÷àåò òîê 4 ìÀ ïî DAC_min(). */
ump_dac_ramp = load_count_ramp;
ump_dac_duration = time_dac;
ump_dac_position = (unsigned int)sinus;
if (active && !fresh) {
/* Óäåðæèâàåì ÖÀÏ. Äàæå cInitDac íå ìåíÿåò òîê â ïàóçå CAN. */
} else if ((!load_init_count || cInitDac) && !load_stop_asserted) {
Init_DAC(); load_init_count = 1; cInitDac = 0;
} else {
anal_output((int)sinus, time_dac,
!start && !load_stop_asserted);
/* A manual calibration frame is not a confirmed 4 mA reload.
* START must wait for a forced baseline frame after it. */
if (!active) load_zero_sent = !(!start && !load_stop_asserted && cCalibrDac);
}
}
}
/* Äèàãíîñòèêà äîñòóïíà îáû÷íûì Modbus/CAN, íåçàâèñèìî îò ëîããåðà:
* áèò 0 — îøèáêà ïÿòè ïóñêîâ; áèò 1 — íåò ñâåæåãî íàïðÿæåíèÿ;
* áèò 2 — ñáðîñ ïåðåä ïîâòîðîì; áèò 3 — ðàáîòà ðàìïû.
* Îøèáêà óäåðæèâàåòñÿ ñî STOP, ïîêà îïåðàòîð íå ñíèìåò START. */
LOAD_STATUS = (load_state == LOAD_FAULT ? 1U : 0U) |
(!fresh ? 2U : 0U) |
(load_state == LOAD_RELOAD ? 4U : 0U) |
(load_state == LOAD_RUN ? 8U : 0U) |
(load_simulation << 4);
LOAD_ATTEMPTS = load_attempts;
}
if(++count_load > time_dac) count_load = time_dac;
sinus = ((dac_stop - dac_go) / 16.0 * count_load) + (dac_go / 16.0 * time_dac);
// sinus = (10.0 / 16.0 * count_load) + (2.0 / 16.0 * time_dac);
}
else
{ count_load = 0;
sinus=0;
x = (x+1)&0x3FF;
}
preStart = cUMPstart;
if(!x || cInitDac)
{
Init_DAC(); x=1; cInitDac=0;
}
else
{
kod = (int)sinus;
Anal_output(kod, time_dac);
} } } }
/* Local versioned block, shared by RTU and service CAN. Probe its signature
* before writes: old firmware returns exception 2 instead of starting tests.
* Simulation is RAM-only, zeroed at boot, and never copied into EEPROM.
* bit 0 ignores ZPT reception (age reaches the configured timeout);
* bit 1 substitutes 0 V only for protection, leaving real logged CAN intact. */
unsigned int Load_protection_prepare(unsigned int function, unsigned int address,
unsigned int value, unsigned int *out, unsigned int *error)
{
unsigned int saved = __disable_interrupts();
*error = 2;
if (Desk == dsk_LOAD && address == 0x1300U && function == 3 && value == 8) {
out[0] = 0x5550U; out[1] = 1;
out[2] = load_simulation; out[3] = (unsigned int)LOAD_CAN_TIMEOUT;
out[4] = (unsigned int)LOAD_STATUS; out[5] = load_attempts;
out[6] = load_voltage; out[7] = load_voltage_seen ? load_voltage_age : 65535U;
*error = 0;
__restore_interrupts(saved);
return 8;
}
if (Desk == dsk_LOAD && function == 6) {
if (address == 0x1302U && value <= 3U) {
load_simulation = value;
*error = 0;
} else if (address == 0x1303U && value >= 1U && value <= 60000U) {
LOAD_CAN_TIMEOUT = value; *error = 0;
} else if (address == 0x1302U || address == 0x1303U) *error = 3;
}
out[0] = address; out[1] = value;
__restore_interrupts(saved);
return 2;
}

View File

@@ -3,5 +3,16 @@ void Anal_output(long vrot, long maxx);
void Init_DAC(void);
void Setup_DAC_time(void);
extern unsigned long IMPowse;
/* Ñ÷¸ò÷èê ïóñêîâîãî èìïóëüñà è âûäåðæêè èíèöèàëèçàöèè äîñòóïíû ëîããåðó. */
extern unsigned long IMPowse, WAKEpowse;
extern unsigned int period_dac, time_dac;
/* Call once before IRQ; complete technological CAN packets update voltage. */
void Load_control_init(void);
void Load_voltage_can(unsigned int header, unsigned int a,
unsigned int b, unsigned int c);
/* 0x1300/8 words: signature, version, simulation, timeout, status, attempts,
* voltage, age. Only 0x1302 (simulation) and 0x1303 (timeout) are writable. */
unsigned int Load_protection_prepare(unsigned int function, unsigned int address,
unsigned int value, unsigned int *out, unsigned int *error);

View File

@@ -1,12 +1,3 @@
/****************************************************************/
/* TMS320C32 */
/* ====== BIOS, КЛАИН, КЛВСП ====== */
/* ЦНИИ СЭТ (с) 1998-2000 г. */
/****************************************************************
RS485.h
****************************************************************
* Процедуры работы с UART *
****************************************************************/
#ifndef _RS485
#define _RS485
@@ -19,6 +10,10 @@
//#include "cntrl_adr.h"
//#include "params.h"
#ifndef RS232_USE_FIFO
#define RS232_USE_FIFO 1
#endif
#define COM_1 1
#define COM_2 2
@@ -67,6 +62,10 @@ typedef struct
int RS_FlagSkiping;
unsigned long curr_baud;
unsigned long time_wait_rs_out;
#if RS232_USE_FIFO
volatile unsigned int fifo_tx_active, fifo_rx_guard;
volatile unsigned long fifo_rx_errors, fifo_overflows;
#endif
} RS_DATA;
@@ -115,7 +114,13 @@ void RS_SetLineSpeed(RS_DATA *rs_arr, unsigned long speed);
// Îæèäàíèå çàâåðøåíèà ïåðåäà÷è UART
// wait for TRDY =1 for empty state
#if RS232_USE_FIFO
void RS_FifoWait(RS_DATA *rs_arr);
void RS_FifoTick1ms(void);
#define RS_Wait4OK(x) RS_FifoWait(x)
#else
#define RS_Wait4OK(x) while(!(x->SciRegs->SCICTL2.bit.TXEMPTY))
#endif
/** Ïåðåêëþ÷åíèå ëèíèè íà ïðèåì */
#define RS_Line_to_receive(x) if(x->commnumber==COM_2) GpioDataRegs.GPBDAT.bit.GPIO34 = 1;

View File

@@ -1,12 +1,3 @@
/****************************************************************/
/* TMS320C32 */
/* ====== BIOS, ÊËÀÈÍ, ÊËÂÑÏ ====== */
/* ÖÍÈÈ ÑÝÒ (ñ) 1998-2000 ã. */
/****************************************************************/
/* Bios_dsp.h */
/****************************************************************/
/* Îñíîâíûå êîììàíäû BIOS */
/****************************************************************/
#ifndef _BIOS_DSP
#define _BIOS_DSP

View File

@@ -10,8 +10,8 @@
4876, 5005, 4876, 4847, 1898, 1873, 2535, 2502, // Áîðò 1
// ÓÌÏ UA UC IA IC 20mA O 4mA O 20mA I 4mA I
3820, 3790, 3505, 3380, 1736, 683, 854, 14, // Αξπς 0 1062 1980
3835, 3785, 3522, 3332, 1745, 689, 860, 17, // Αξπς 1 1720 2405
7580, 7540, 2310, 2420, 1736, 683, 854, 14, // Αξπς 0 1062 1980
7580, 7540, 2310, 2420, 1745, 689, 860, 17, // Αξπς 1 1720 2405
// ÁÊÑÑÄ 100 Ohm 150 Ohm
1281, 1272, 0, 0, 622, 2263, 0, 0,

View File

@@ -1,13 +1,3 @@
/****************************************************************/
/* TMS320C32 */
/* ====== BIOS, КЛАИН, КЛВСП ====== */
/* ЦНИИ СЭТ (с) 1998-2000 г. */
/****************************************************************
cntrl_adr.h
****************************************************************
* Адрес контроллера *
****************************************************************/
#ifndef _CNTRL_ADR
#define _CNTRL_ADR

View File

@@ -1,3 +1,6 @@
void InitCan(int Port, int DevNum);
void CAN_send(int Port, int data[], int Addr);
extern int CAN_input_data[];
/* Íåáëîêèðóþùàÿ ïåðåäà÷à îòâåòîâ ëîããåðà îòäåëüíûì CAN mailbox. */
void UMP_CAN_service(void);

View File

@@ -0,0 +1,15 @@
#ifndef BALSAM167_EEPROM_CONFIG_H
#define BALSAM167_EEPROM_CONFIG_H
/* Build-time checkbox: 0 = AT25256B (32 KiB), 1 = M95M02-DR (256 KiB).
* This must match the soldered part BEFORE startup loads saved parameters.
* CCS: change the value below, then Project > Clean and Rebuild.
* Command-line builds may override EEPROM_M95M02 for that build only.
* A GUI checkbox cannot change SPI ROM boot or startup initialization.
*/
#ifndef EEPROM_M95M02
#define EEPROM_M95M02 0
#endif
#if EEPROM_M95M02 != 0 && EEPROM_M95M02 != 1
#error EEPROM_M95M02_must_be_0_or_1
#endif
#endif

View File

@@ -0,0 +1,28 @@
#ifndef BALSAM167_GAS_H
#define BALSAM167_GAS_H
#include "eeprom_config.h"
#include <stdint.h>
/* Board profile 167/v1, word addresses, independent of the wire transport.
* The original register and UMP addresses remain valid in both builds.
* Only the physically fitted M95M02 version exposes the additional regions. */
#if EEPROM_M95M02
#define GAS167_REG_BASE 0x5000U
#define GAS167_REG_COUNT 128U
#define GAS167_INFO_BASE 0x5F00U
#define GAS167_INFO_WORDS 8U
#define GAS167_MAX_WORDS 124U
#define GAS167_PROFILE_VERSION 1U
#define GAS167_CAPABILITIES 7U /* bit 0 RTU, bit 1 service CAN, bit 2 FC06 */
/* Called by the main-loop transports under their snapshot IRQ lock.
* Capacity: at least GAS167_MAX_WORDS uint16_t words.
* RTU reads: 1..124 words; paired service CAN reads: 2..124, even.
* Successful reads return their count. Writes/errors return address/value.
* error uses Modbus codes 0 (success), 1 (function), 2 (address), 3 (value).
* No EEPROM I/O, allocation, or changes to the existing logger. */
int gas167_contains(uint16_t address);
unsigned gas167_prepare(unsigned function, uint16_t address, uint16_t value,
int can, uint16_t *reply, unsigned *error);
#endif
#endif

View File

@@ -1,13 +1,3 @@
/****************************************************************/
/* TMS320C32 */
/* ====== BIOS, КЛАИН, КЛВСП ====== */
/* ЦНИИ СЭТ (с) 1998-2001г. */
/****************************************************************/
/* log_to_mem.h
****************************************************************
* Запись логов в памyть *
****************************************************************/
#ifndef _LOG_TO_MEM
#define _LOG_TO_MEM
@@ -42,6 +32,24 @@ extern LOG Log;
/* Î÷èñòêà ïàìàòè (îáíóëåíèå) */
void clear_mem();
/* Ëîããåð ÓÌÏ: îòäåëüíîå àäðåñíîå ïðîñòðàíñòâî Modbus, áåç èçìåíåíèÿ
* 128 òåõíîëîãè÷åñêèõ ðåãèñòðîâ. Äâà áàíêà ïî 760 çàïèñåé:
* òåêóùèé êîëüöåâîé æóðíàë è çàôèêñèðîâàííûé ôðàãìåíò îòêëþ÷åíèÿ. */
#define UMP_LOG_BASE 0x1000U
#define UMP_LOG_DATA 0x1010U
#define UMP_LOG_WORDS 42U
#define UMP_LOG_CAPACITY 760U
#define UMP_LOG_LIVE_RECORDS (120U / UMP_LOG_WORDS)
#define UMP_LOG_LIVE 0x1100U
extern unsigned int ump_dac_ramp, ump_dac_duration, ump_dac_go10, ump_dac_stop10, ump_dac_position;
void ump_log_init(void);
void ump_log_tick(void);
void ump_log_io(void);
void ump_log_can(unsigned int header, unsigned int a, unsigned int b, unsigned int c);
void ump_log_rs(void);
unsigned int ump_log_read(unsigned int address);
int ump_log_write(unsigned int address, unsigned int value);
#ifdef __cplusplus
}
#endif

View File

@@ -1,4 +1,3 @@
// <20><><E2>
#ifndef _MEASURE
#define _MEASURE

View File

@@ -95,6 +95,11 @@
#define DAC_go modbus[0x50] // íà÷àëî çàðàäà
#define DAC_stop modbus[0x51] // êîíåö çàðàäà
/* LOAD-only persistent CAN timeout (ms), read-only status and attempts. */
#define LOAD_CAN_TIMEOUT modbus[0x52]
#define LOAD_STATUS modbus[0x7C]
#define LOAD_ATTEMPTS modbus[0x7D]
#define Cancount (modbus+0x60) // ïàóçà ìåæäó I ïîñûëêàìè CAN
#define Bright (modbus+0x62) // àðêîñòü ñèãíàëüíûõ ëàìïî÷åê
#define Brightness modbus[0x62] // àðêîñòü ñèãíàëüíûõ ëàìïî÷åê

View File

@@ -1,24 +1,20 @@
/*=====================================================================
File name : SPISE2P.H
Originator : Settu Duraisamy
C2000 Applications Team
Texas Instruments
Description :
Header file containing object definitions, proto type
declaration and default object initializers for
SPI Serial EEPROM driver using VSPI
Date : 30/6/2003 (DD/MM/YYYY)
=======================================================================*/
#ifndef __SPISE2P_H__
#define __SPISE2P_H__
/* Physical EEPROM layout shared with the linker and SETGUI. */
#include "eeprom_config.h"
#include "include/balsam167_eeprom_layout.h"
// ¨ìêîñòü ïàìàòè â áàéòàõ
#define SEEPROM_LEN 0x10000
/* Preserve compact 16-bit arithmetic for the original 32-KiB build.
* Only the large part needs 32-bit word addresses and transfer lengths. */
#if EEPROM_M95M02
typedef unsigned long SE2P_SIZE;
#else
typedef unsigned int SE2P_SIZE;
#endif
#define SEEPROM_LEN BALSAM167_EEPROM_BYTES
#define NULL 0
@@ -73,8 +69,10 @@ typedef struct {
/* Object declaration */
typedef struct {
SE2P_DATA *msgPtr;
unsigned int csr; /* control/status register */
/* Main loop publishes the descriptor before setting csr; Timer2 consumes it.
* Both accesses are volatile so optimization cannot publish the request first. */
SE2P_DATA * volatile msgPtr;
volatile unsigned int csr; /* control/status register */
void (*init)(void *);
void (*tick)(void *);
void (*csset)(void);
@@ -100,12 +98,12 @@ void spiSe2pWrite(SPISE2P_DRV *se2p, SE2P_DATA *data);
void spiSe2pRead(SPISE2P_DRV *se2p, SE2P_DATA *data);
#if(SPISE2P_DATA_WIDTH==SIXTEEN_BIT)
#define PROM_LEN 0x8000
#define PAGE_LEN 0x20
#define PROM_LEN BALSAM167_EEPROM_WORDS
#define PAGE_LEN (BALSAM167_EEPROM_PAGE_BYTES / 2)
#define WORD_LEN 2
#else
#define PROM_LEN 0x4000
#define PAGE_LEN 0x40
#define PROM_LEN BALSAM167_EEPROM_BYTES
#define PAGE_LEN BALSAM167_EEPROM_PAGE_BYTES
#define WORD_LEN 1
#endif
@@ -120,7 +118,7 @@ void InitSeeprom(void);
** adres = 0..0x4000, åñëè äëèíà ñëîâà 16 áèò **
** buf - óêàçàòåëü íà ïàìàòü, îòêóäà ïèñàòü. **
** size - äëèíà áëîêà â áàéòàõ. Ïî-ëþáîìó â áàéòàõ! */
void Seeprom_write(unsigned int adres, unsigned int buf[], unsigned int size);
void Seeprom_write(SE2P_SIZE adres, unsigned int buf[], SE2P_SIZE size);
/* ×òåíèå áëîêà èç SEEPROM. Ïàðàìåòðû òàêîâû: **
** adres - àäðåñ â åïðîìêå, îòêóäà ÷èòàòü. **
@@ -128,7 +126,7 @@ void Seeprom_write(unsigned int adres, unsigned int buf[], unsigned int size);
** adres = 0..0x4000, åñëè äëèíà ñëîâà 16 áèò **
** buf - óêàçàòåëü íà ïàìàòü, êóäà ÷èòàòü. **
** size - äëèíà áëîêà â áàéòàõ. Ïî-ëþáîìó â áàéòàõ! */
void Seeprom_read(unsigned int adres, unsigned int buf[], unsigned int size);
void Seeprom_read(SE2P_SIZE adres, unsigned int buf[], SE2P_SIZE size);
#endif

View File

@@ -0,0 +1,9 @@
/* Shared logger protocol; application owns IRQ protection and CAN scheduling. */
#ifndef UMP_CAN_PROTOCOL_H
#define UMP_CAN_PROTOCOL_H
#include "log_to_mem.h"
#include "ump_tms28335.h"
#define UMP_CAN_MARKER UMP_MARKER
#define UMP_CAN_MAX_WORDS UMP_MAX_WORDS
#define ump_can_prepare ump_tms28335_prepare
#endif

View File

@@ -1,13 +1,3 @@
/****************************************************************/
/* TMS320C32 */
/* ====== BIOS, ÊËÀÈÍ, ÊËÂÑÏ ====== */
/* ÖÍÈÈ ÑÝÒ (ñ) 1998-2000 ã. */
/****************************************************************
RS485.ñ
****************************************************************
* Ïðîöåäóðû ðàáîòû ñ UART *
****************************************************************/
//#include "big_dsp_module.h"
@@ -31,6 +21,11 @@ static char size_cmd15=1;
void RS_RX_Handler(RS_DATA *rs_arr);
void RS_TX_Handler(RS_DATA *rs_arr);
#if RS232_USE_FIFO
static int RS_FifoStart(RS_DATA *, unsigned int *, unsigned long, int);
static void RS_FifoTx(RS_DATA *);
static void RS_FifoAbort(RS_DATA *);
#endif
/** Îáðàáîò÷èê ïðåðûâàíèé UART - ïðèíàòî */
interrupt void RSA_RX_Handler(void)
@@ -115,6 +110,24 @@ void RS_RX_Handler(RS_DATA *rs_arr)
for(;;) // 'goto' ýòî íå îïåðàòîð àçûêà Ñ
{
#if RS232_USE_FIFO
if (rs_arr->commnumber == COM_1) {
unsigned int received;
if (rs_arr->SciRegs->SCIFFRX.bit.RXFFOVF || rs_arr->SciRegs->SCIRXST.bit.RXERROR) {
RS_FifoAbort(rs_arr); return;
}
if (!rs_arr->SciRegs->SCIFFRX.bit.RXFFST) {
rs_arr->SciRegs->SCIFFRX.bit.RXFFINTCLR=1;
PieCtrlRegs.PIEACK.bit.ACK9 |= 1;
return;
}
received=rs_arr->SciRegs->SCIRXBUF.all; /* one pop, data + FE/PE */
if (received & 0xC000U) { RS_FifoAbort(rs_arr); return; }
if (rs_arr->fifo_rx_guard) { rs_arr->fifo_rx_guard=4; continue; }
Rc=received & 255U;
} else
#endif
{
if(!rs_arr->SciRegs->SCIRXST.bit.RXRDY) // Receiver ready flag
{
PieCtrlRegs.PIEACK.bit.ACK9 |= 1;
@@ -132,6 +145,8 @@ void RS_RX_Handler(RS_DATA *rs_arr)
continue;
}
}
if(rs_arr->RS_DataReady) continue; // Íå çàáðàëè äàííûå
if (rs_arr->RS_Flag9bit==1) // äëà RS485????????
@@ -244,6 +259,9 @@ void RS_RX_Handler(RS_DATA *rs_arr)
/** Îáðàáîò÷èê ïðåðûâàíèé UART - ïîñëàíî */
void RS_TX_Handler(RS_DATA *rs_arr)
{
#if RS232_USE_FIFO
if (rs_arr->commnumber == COM_1) { RS_FifoTx(rs_arr); return; }
#endif
char RS_BytePtr;
// unsigned int i;
@@ -288,6 +306,7 @@ void RS_TX_Handler(RS_DATA *rs_arr)
PieCtrlRegs.PIEACK.bit.ACK9 |= 1;
// rs_arr->SciRegs->SCIFFTX.bit.TXINTCLR=1; // Clear INT flag
}
/** Èíèöèàëèçàöèà ìàññèâà äëèí êîìàíä */
@@ -339,6 +358,9 @@ void RS_SetBitMode(RS_DATA *rs_arr,int n)
@see RS_BSend, RS_TRANSMIT_INTR */
int RS_Send(RS_DATA *rs_arr,unsigned int *pBuf,unsigned long len)
{
#if RS232_USE_FIFO
if (rs_arr->commnumber == COM_1) return RS_FifoStart(rs_arr,pBuf,len,BM_CHAR32);
#endif
unsigned int i;
for (i=0; i <= 30000; i++){} /* Ïàóçà äëà PC */
@@ -369,11 +391,15 @@ int RS_Send(RS_DATA *rs_arr,unsigned int *pBuf,unsigned long len)
RS_Line_to_receive(rs_arr); /* ðåæèì ïðèåìà RS485 */
}
return 0;
}
// Ïîñûëêà áëîêà óïàêîâàííûõ áàéòîâ
int RS_BSend(RS_DATA *rs_arr,unsigned int *pBuf, unsigned long len)
{
#if RS232_USE_FIFO
if (rs_arr->commnumber == COM_1) return RS_FifoStart(rs_arr,pBuf,len,BM_PACKED);
#endif
RS_Line_to_send(rs_arr); // ðåæèì ïåðåäà÷è RS485
@@ -391,6 +417,7 @@ int RS_BSend(RS_DATA *rs_arr,unsigned int *pBuf, unsigned long len)
SCI_send(rs_arr,HIBYTE(*pBuf));// Ïåðåäàåì ïåðâûé áàéò
return 0;
}
/** Óñòàíàâëèâàåò ñêîðîñòü îáìåíà.
@@ -484,7 +511,20 @@ void setup_uart(char commnumber, unsigned long speed_baud)
SciRegs->SCICTL1.bit.TXENA=1;
SciRegs->SCICTL1.bit.RXENA=1;
SciRegs->SCIFFTX.bit.SCIFFENA=0; // fifo off
#if RS232_USE_FIFO
if (commnumber == COM_1) {
SciRegs->SCIFFTX.all=0xC008U; /* enhancement, reset held, TX level 8, IRQ off */
SciRegs->SCIFFRX.all=0x0061U; /* reset held, RX level 1, IRQ on */
SciRegs->SCIFFCT.all=0;
SciRegs->SCIFFRX.bit.RXFFOVRCLR=1;
SciRegs->SCIFFTX.bit.TXFFINTCLR=1;
SciRegs->SCIFFTX.bit.TXFIFOXRESET=1;
SciRegs->SCIFFRX.bit.RXFIFORESET=1;
rs_arr->fifo_tx_active=rs_arr->fifo_rx_guard=0;
rs_arr->fifo_rx_errors=rs_arr->fifo_overflows=0;
} else
#endif
SciRegs->SCIFFTX.bit.SCIFFENA=0; // fifo off
SciRegs->SCIFFRX.bit.RXFFIL=1; // Äëèíà íàèìåíüøåé êîìàíäû
setup_arr_cmd_length();
@@ -557,3 +597,117 @@ void test_rs_live(RS_DATA *rs_arr)
RS_Line_to_receive(rs_arr); // ðåæèì ïðèåìà RS485
RS_SetBitMode(rs_arr,9);
}*/ }
#if RS232_USE_FIFO
/* FIFO is exclusively SCI-A / RS232. SCI-B keeps the legacy path. */
void RS_FifoWait(RS_DATA *rs_arr)
{
if (rs_arr->commnumber != COM_1) {
while (!rs_arr->SciRegs->SCICTL2.bit.TXEMPTY) { }
return;
}
while (rs_arr->fifo_tx_active || rs_arr->SciRegs->SCIFFTX.bit.TXFFST ||
!rs_arr->SciRegs->SCICTL2.bit.TXEMPTY) { }
}
static void RS_FifoTx(RS_DATA *rs_arr)
{
unsigned int data;
if (!rs_arr->fifo_tx_active) {
rs_arr->SciRegs->SCIFFTX.bit.TXFFIENA=0;
} else if (rs_arr->RS_SendLen == rs_arr->RS_SLength) {
/* Level 0 interrupt: FIFO drained, last symbol may still be shifting.
* Do not finish on TXFFST alone. At most one symbol remains. */
if (rs_arr->SciRegs->SCIFFTX.bit.TXFFST) {
rs_arr->SciRegs->SCIFFTX.bit.TXFFINTCLR=1;
PieCtrlRegs.PIEACK.bit.ACK9 |= 1;
return;
}
rs_arr->SciRegs->SCIFFTX.bit.TXFFIENA=0;
while (!rs_arr->SciRegs->SCICTL2.bit.TXEMPTY) { }
if (rs_arr->RS_SendBlockMode == BM_CHAR32) {
RS_SetBitMode(rs_arr,9);
rs_arr->flag_TIMEOUT_to_Send=false;
}
rs_arr->SciRegs->SCIFFRX.bit.RXFIFORESET=0;
rs_arr->SciRegs->SCIFFRX.bit.RXFFOVRCLR=1;
rs_arr->SciRegs->SCIFFRX.bit.RXFFINTCLR=1;
rs_arr->SciRegs->SCIFFRX.bit.RXFIFORESET=1;
enableUARTInt(rs_arr);
rs_arr->SciRegs->SCIFFRX.bit.RXFFIENA=1;
rs_arr->fifo_tx_active=0;
} else {
while (rs_arr->RS_SendLen < rs_arr->RS_SLength &&
rs_arr->SciRegs->SCIFFTX.bit.TXFFST < 16) {
if (rs_arr->RS_SendBlockMode == BM_CHAR32)
data=*rs_arr->pRS_SendPtr++;
else if (rs_arr->RS_SendLen & 1U)
data=LOBYTE(*rs_arr->pRS_SendPtr++);
else data=HIBYTE(*rs_arr->pRS_SendPtr);
SCI_send(rs_arr,data);
rs_arr->RS_SendLen++;
}
rs_arr->SciRegs->SCIFFTX.bit.TXFFIL=
rs_arr->RS_SendLen == rs_arr->RS_SLength ? 0 : 8;
}
rs_arr->SciRegs->SCIFFTX.bit.TXFFINTCLR=1;
PieCtrlRegs.PIEACK.bit.ACK9 |= 1;
}
static int RS_FifoStart(RS_DATA *rs_arr,unsigned int *buffer,unsigned long count,int mode)
{
unsigned int saved;
if (!count) return 0;
if (!buffer) return -1;
RS_FifoWait(rs_arr); /* before replacing the previous transfer's counters */
saved=__disable_interrupts();
rs_arr->SciRegs->SCIFFTX.bit.TXFFIENA=0;
rs_arr->SciRegs->SCIFFRX.bit.RXFFIENA=0;
enableUARTIntW(rs_arr);
RS_SetBitMode(rs_arr,8);
rs_arr->pRS_SendPtr=buffer;
rs_arr->RS_SLength=count;
rs_arr->RS_SendLen=0;
rs_arr->RS_SendBlockMode=mode;
rs_arr->fifo_tx_active=1;
RS_FifoTx(rs_arr); /* prime before enabling a possibly immediate TX IRQ */
rs_arr->SciRegs->SCIFFTX.bit.TXFFIENA=1;
__restore_interrupts(saved);
if (count == 1 && mode == BM_CHAR32) RS_FifoWait(rs_arr);
return 0;
}
static void RS_FifoAbort(RS_DATA *rs_arr)
{
rs_arr->fifo_rx_errors++;
if (rs_arr->SciRegs->SCIFFRX.bit.RXFFOVF) rs_arr->fifo_overflows++;
rs_arr->RS_DataReady=0; rs_arr->BS_LoadOK=0;
rs_arr->RS_PrevCmd=0; rs_arr->RS_Cmd=0;
rs_arr->RS_Flag9bit=0; rs_arr->RS_FlagSkiping=1;
rs_arr->fifo_rx_guard=4;
rs_arr->SciRegs->SCIFFRX.bit.RXFIFORESET=0;
rs_arr->SciRegs->SCIFFRX.bit.RXFFOVRCLR=1;
rs_arr->SciRegs->SCIFFRX.bit.RXFFINTCLR=1;
if (rs_arr->SciRegs->SCIRXST.bit.RXERROR) {
rs_arr->SciRegs->SCICTL1.bit.SWRESET=0;
rs_arr->SciRegs->SCICTL1.bit.SWRESET=1;
}
rs_arr->SciRegs->SCIFFRX.bit.RXFIFORESET=1;
PieCtrlRegs.PIEACK.bit.ACK9 |= 1;
}
void RS_FifoTick1ms(void)
{
unsigned int saved=__disable_interrupts();
RS_DATA *p=&rs_a;
if (p->SciRegs && p->fifo_rx_guard) {
if (p->SciRegs->SCIFFRX.bit.RXFFST) p->fifo_rx_guard=4;
else if (--p->fifo_rx_guard == 0) {
p->RS_HeaderCnt=0;p->RS_RecvLen=0;
p->RS_FlagBegin=1;p->RS_FlagSkiping=0;
RS_SetBitMode(p,9); /* fresh address after 3..4 ms of idle */
}
}
__restore_interrupts(saved);
}
#endif

View File

@@ -1,13 +1,3 @@
/****************************************************************/
/* TMS320C32 */
/* ====== BIOS, ÊËÀÈÍ, ÊËÂÑÏ ====== */
/* ÖÍÈÈ ÑÝÒ (ñ) 1998-2000 ã. */
/****************************************************************
Bios.c
**************************************************************
Îñíîâíûå êîììàíäû BIOS *
äëà ðàáîòû ñ RS232
****************************************************************/
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "RS485.h"
#include "bios_dsp.h"
@@ -408,7 +398,16 @@ void extendbios(RS_DATA *rs_arr)
switch ( code )
{
// Ïðîøèâàåì EPROM Èç RAM
case 4: Seeprom_write(Address1,(unsigned int*)Address2,Length);
#if EEPROM_M95M02
/* 0x44 is intentionally rejected by old firmware. Conversely this build
* rejects legacy code 4, preventing writes with the wrong GUI profile. */
case 0x44:
#else
case 4:
#endif
if (!Length || Address1 >= BALSAM167_EEPROM_FIRMWARE_BYTES/2UL ||
Length > BALSAM167_EEPROM_FIRMWARE_BYTES-Address1*2UL) return;
Seeprom_write(Address1,(unsigned int*)Address2,Length);
break;
// ×èòàåì èç EPROM â RAM
case 5: Seeprom_read(Address1,(unsigned int*)Address2,Length);

View File

@@ -1,13 +1,3 @@
/****************************************************************/
/* TMS320C32 */
/* ====== BIOS, КЛАИН, КЛВСП ====== */
/* ЦНИИ СЭТ (с) 1998-2000 г. */
/****************************************************************
cntrl_adr.c
****************************************************************
* Адрес контроллера *
****************************************************************/
#include "cntrl_adr.h"
#define ADDR_FOR_ALL_DEF 10

View File

@@ -11,6 +11,10 @@
#include "RS485.h"
#include "message.h"
#include "peripher.h"
#include "log_to_mem.h"
#include "DAC.h"
#include "ump_can_protocol.h"
#include "gas167.h"
// Prototype statements for functions found within this file.
@@ -30,6 +34,16 @@ int CanTimeOutErrorTR = 0;
int wait=0;
/* MBOX2 âûäåëåí ïîä îòâåòû ðåãèñòðàòîðà; øòàòíûé MBOX0 ïðîäîëæàåò
* ïåðåäàâàòü òåõíîëîãè÷åñêèå äàííûå íåçàâèñèìî. ISR òîëüêî ñòàâèò çàïðîñ,
* à ñíèìîê è îòïðàâêà êîðîòêèìè øàãàìè âûïîëíÿþòñÿ â îñíîâíîì öèêëå. */
static volatile unsigned int ump_can_pending;
static volatile unsigned int ump_can_tag, ump_can_address, ump_can_value;
static unsigned int ump_can_reply[UMP_CAN_MAX_WORDS];
static unsigned int ump_can_length, ump_can_index, ump_can_reply_tag;
static unsigned int ump_can_waiting;
static unsigned long ump_can_sent_at;
void InitCan(int Port, int DevNum)
{
struct ECAN_REGS ECanShadow;
@@ -61,6 +75,7 @@ void InitCan(int Port, int DevNum)
// Specify that 8 bits will be sent/received
ECanMboxes->MBOX0.MSGCTRL.all = 0x00000008;
ECanMboxes->MBOX1.MSGCTRL.all = 0x00000008;
ECanMboxes->MBOX2.MSGCTRL.all = 0x00000008;
// Disable all Mailboxes
// Required before writing the MSGIDs
@@ -72,11 +87,12 @@ void InitCan(int Port, int DevNum)
// çàäàåì àäðåñ 1 àùèêa íà ïðèåì
ECanMboxes->MBOX1.MSGID.all = id + DevNum; //ïîìåíàòü!!!! 1 è 0!!!
// çàäàåì ðåæèìû ðàáîòû àùèêa 0 íà ïåðåäà÷ó, îñòàëüíûå íà ïðèåì
ECanRegs->CANMD.all = 0xFFFFFFFE;
// MBOX0 è MBOX2 ïåðåäàþò äàííûå; MBOX1 ïðèíèìàåò êîìàíäû.
ECanMboxes->MBOX2.MSGID.all = id + 0x20 + DevNum;
ECanRegs->CANMD.all = 0xFFFFFFFA;
// âûáèðàåì òîëüêî 2 àùèêa äëà ðàáîòû, îñòàëüíûå çàïðåùàåì
ECanRegs->CANME.all = 0x00000003;
// Âêëþ÷àåì òðè mailbox: òåëåìåòðèÿ, êîìàíäû è îòâåòû ëîããåðà.
ECanRegs->CANME.all = 0x00000007;
// Clear all TAn bits
ECanRegs->CANTA.all = 0xFFFFFFFF;
@@ -196,6 +212,18 @@ void Handlai(volatile struct ECAN_MBOXES * ECanMboxes)
hiword = ECanMboxes->MBOX1.MDH.all;
loword = ECanMboxes->MBOX1.MDL.all;
/* Ñëóæåáíûé çàïðîñ ëîããåðà íå ÿâëÿåòñÿ êîìàíäîé ÓÌÏ è ñàì íå äîëæåí
* çàïîëíÿòü æóðíàë CAN-ñîáûòèÿìè ïðè îíëàéí-÷òåíèè. Êîðîòêèå êàäðû
* îòáðàñûâàþòñÿ: íåçàïîëíåííûå áàéòû mailbox ìîãëè îñòàòüñÿ îò ïðîøëîãî. */
if ((unsigned int)(hiword >> 16) == UMP_CAN_MARKER) {
if (ECanMboxes->MBOX1.MSGCTRL.bit.DLC == 8 && (hiword & 0xFF00UL)) {
ump_can_tag = (unsigned int)hiword;
ump_can_address = (unsigned int)(loword >> 16);
ump_can_value = (unsigned int)loword;
ump_can_pending = 1;
}
return;
}
adr = (hiword >> 16);
bit[0] = adr & 0x8000;
@@ -208,10 +236,19 @@ void Handlai(volatile struct ECAN_MBOXES * ECanMboxes)
Data[1] = (loword>>16) & 0xffff;
Data[2] = (loword ) & 0xffff;
if(bit[0]) if(adr < ANSWER_LEN) modbus[adr] = Data[0]; adr++;
if(bit[1]) if(adr < ANSWER_LEN) modbus[adr] = Data[1]; adr++;
if(bit[2]) if(adr < ANSWER_LEN) modbus[adr] = Data[2];
if(bit[0]) if(adr < ANSWER_LEN &&
!(Desk == dsk_LOAD && (adr == 0x7CU || adr == 0x7DU))) modbus[adr] = Data[0]; adr++;
if(bit[1]) if(adr < ANSWER_LEN &&
!(Desk == dsk_LOAD && (adr == 0x7CU || adr == 0x7DU))) modbus[adr] = Data[1]; adr++;
if(bit[2]) if(adr < ANSWER_LEN &&
!(Desk == dsk_LOAD && (adr == 0x7CU || adr == 0x7DU))) modbus[adr] = Data[2];
/* Ôèêñèðóåì ïðèìåí¸ííóþ êîìàíäó äî âûõîäà èç îáðàáîò÷èêà CAN. */
/* A short frame cannot confirm voltage freshness. Service frames
* UMP_MARKER return above and do not refresh this timeout. */
if (ECanMboxes->MBOX1.MSGCTRL.bit.DLC == 8)
Load_voltage_can((unsigned int)(hiword >> 16), Data[0], Data[1], Data[2]);
ump_log_can((unsigned int)(hiword >> 16), Data[0], Data[1], Data[2]);
led2_toggle();
}
@@ -257,3 +294,61 @@ interrupt void CANa_reset_err(void)
//===========================================================================
// No more.
//===========================================================================
/* Îäèí âûçîâ îáñëóæèâàåò ìàêñèìóì îäèí êàäð è íèêîãäà íå æä¸ò ACK â öèêëå.
* Ñíèìîê ôèêñèðóåòñÿ îäèí ðàç íà çàïðîñ: CAN-ôðàãìåíòû íå ñìåøèâàþò
* çíà÷åíèÿ äî/ïîñëå ïåðåêëþ÷åíèÿ êîëüöåâîãî áàíêà. Íîâûå çàïðîñû çàáèðàåì
* ïîñëå çàâåðøåíèÿ ïðåäûäóùåãî îòâåòà. GUI äåðæèò òîëüêî îäèí çàïðîñ. */
void UMP_CAN_service(void)
{
unsigned int saved, tag, address, value, error;
uint32_t hiword, loword;
if (ump_can_waiting) {
if (ECanaRegs.CANTA.all & 4UL) {
ECanaRegs.CANTA.all = 4UL;
ump_can_waiting = 0;
} else if ((ECanaRegs.CANAA.all & 4UL) ||
((unsigned long)CpuTimer1.InterruptCount - ump_can_sent_at > 250UL)) {
/* Íåò ïîäòâåðæäåíèÿ øèíû: îòìåíÿåì òîëüêî ñëóæåáíûé mailbox.
* GUI îáíàðóæèò íåïîëíûé îòâåò ïî òàéì-àóòó; óïðàâëåíèå MBOX0
* è ïðè¸ì êîìàíä MBOX1 ïðîäîëæàþòñÿ. */
ECanaRegs.CANTRR.all = 4UL;
/* Äî ôàêòè÷åñêîãî çàâåðøåíèÿ îòìåíû mailbox íå ïåðåèñïîëüçóåì. */
if (!(ECanaRegs.CANAA.all & 4UL)) return;
ECanaRegs.CANAA.all = 4UL;
ump_can_waiting = 0;
ump_can_length = 0;
} else return;
}
if (ump_can_index >= ump_can_length && ump_can_pending) {
saved = __disable_interrupts();
tag = ump_can_tag; address = ump_can_address; value = ump_can_value;
ump_can_pending = 0;
if (address >= 0x1300U && address < 0x1308U)
ump_can_length = Load_protection_prepare(tag & 0xFF, address, value, ump_can_reply, &error);
#if EEPROM_M95M02
else if (gas167_contains(address))
ump_can_length = gas167_prepare(tag & 0xFF, address, value, 1, ump_can_reply, &error);
#endif
else ump_can_length = ump_can_prepare(tag & 0xFF, address, value, ump_can_reply, &error);
ump_can_reply_tag = (tag & 0xFF00) | error;
ump_can_index = 0;
__restore_interrupts(saved);
}
if (ump_can_index >= ump_can_length) return;
/* Ïåðåä ñëåäóþùèì ôðàãìåíòîì óñòóïàåì øòàòíîé òåëåìåòðèè MBOX0. */
if (ECanaRegs.CANTRS.all & 1UL) return;
if (!ump_tms28335_fragment(ump_can_reply, ump_can_length, ump_can_index/2,
ump_can_reply_tag >> 8, ump_can_reply_tag & 255U, &loword, &hiword)) {
ump_can_length = 0;
return;
}
ECanaRegs.CANTA.all = 4UL; ECanaRegs.CANAA.all = 4UL;
ECanaMboxes.MBOX2.MDH.all = hiword;
ECanaMboxes.MBOX2.MDL.all = loword;
ump_can_sent_at = CpuTimer1.InterruptCount;
ECanaRegs.CANTRS.all = 4UL;
ump_can_waiting = 1;
ump_can_index += 2;
}

63
Source/Internal/gas167.c Normal file
View File

@@ -0,0 +1,63 @@
#include "gas167.h"
#if EEPROM_M95M02
#include "package.h"
extern int modbus[];
extern int Desk;
extern void ump_log_rs(void);
static const uint16_t gas167_info[GAS167_INFO_WORDS] = {
0x4741U, 0x5331U, GAS167_PROFILE_VERSION, 167U,
GAS167_REG_BASE, GAS167_REG_COUNT, GAS167_CAPABILITIES, 1U
};
int gas167_contains(uint16_t address)
{
return (uint16_t)(address - GAS167_REG_BASE) < GAS167_REG_COUNT ||
(uint16_t)(address - GAS167_INFO_BASE) < GAS167_INFO_WORDS;
}
static unsigned gas167_write(uint16_t offset, uint16_t value)
{
/* Match the existing native Modbus write policy. These status words
* cannot be overwritten and an invalid timeout cannot bypass protection. */
if (Desk == dsk_LOAD && (offset == 0x7CU || offset == 0x7DU)) return 2;
if (Desk == dsk_LOAD && offset == 0x52U &&
(value == 0U || value > 60000U)) return 3;
/* C28x int is one register word; reads always expose the raw uint16_t. */
modbus[offset] = (int)value;
if (offset == 127U) ump_log_rs();
return 0;
}
unsigned gas167_prepare(unsigned function, uint16_t address, uint16_t value,
int can, uint16_t *reply, unsigned *error)
{
uint16_t offset;
unsigned i, available;
int info;
if (!reply || !error) return 0;
*error = 0;
info = (uint16_t)(address - GAS167_INFO_BASE) < GAS167_INFO_WORDS;
offset = (uint16_t)(address - (info ? GAS167_INFO_BASE : GAS167_REG_BASE));
available = info ? GAS167_INFO_WORDS : GAS167_REG_COUNT;
if (function != 3U && function != 6U) *error = 1;
else if (offset >= available) *error = 2;
else if (function == 6U) {
*error = info ? 2U : gas167_write(offset, value);
} else if (!value || value > GAS167_MAX_WORDS || (can && (value & 1U))) {
*error = 3;
} else if (value > available - offset) {
*error = 2;
} else {
/* Validate the entire block before reading. A block cannot cross a
* region boundary, wrap at 0xFFFF, or leak the hidden parameter word. */
for (i = 0; i < value; ++i)
reply[i] = info ? gas167_info[offset+i] : (uint16_t)modbus[offset+i];
return value;
}
reply[0] = address;
reply[1] = value;
return 2;
}
#endif

View File

@@ -1,13 +1,12 @@
/****************************************************************/
/* TMS320C32 */
/* ====== BIOS, КЛАИН, КЛВСП ====== */
/* ЦНИИ СЭТ (с) 1998-2001г. */
/****************************************************************/
/* log_to_mem.c
****************************************************************
* Запись логов в памyть *
****************************************************************/
#include "DSP2833x_Device.h"
#include "filter_bat2.h"
#include "measure.h"
#include "package.h"
#include "RS485.h"
#include "message.h"
#include "peripher.h"
#include "DAC.h"
#include "ADC.h"
#include "log_to_mem.h"
int no_write = 0,
@@ -32,3 +31,266 @@ void clear_mem()
for (i=Log.Start; i<Log.Finis; i++)
*(volatile int *)i = 0;
}
/* Two RAM banks: freeze after 10% of bank capacity is recorded after stop. */
static volatile unsigned int ump_state, ump_count, ump_cursor, ump_next;
static volatile unsigned int ump_period = 20, ump_divider;
static volatile unsigned long ump_time, ump_sequence;
static unsigned int ump_bank, ump_archive_bank = 1;
static unsigned int ump_archive_count, ump_archive_next, ump_generation;
static unsigned int ump_source, ump_post;
#define UMP_POST_POINTS (UMP_LOG_CAPACITY / 10U)
static void ump_freeze(void);
static unsigned int ump_can_header, ump_can_data[3], ump_can_count;
/* Latest PM67 sums: register 306 (index 305), register 9 (index 8). */
static unsigned int ump_pm67_voltage[2];
static unsigned int ump_prev_commands, ump_prev_inputs, ump_prev_outputs;
extern int CanTimeOutErrorTR;
/* Äèàãíîñòèêà âíóòðåííèõ ïåðåìåííûõ ðàçãîíà. Îáíîâëÿåòñÿ ñàìèì Load_runner,
* íå ïåðåñ÷èòûâàåò è íå èçìåíÿåò óïðàâëÿþùèé àëãîðèòì. */
unsigned int ump_dac_ramp, ump_dac_duration, ump_dac_go10, ump_dac_stop10, ump_dac_position;
/* Called once at boot, before enabling interrupts. TI COFF startup does
* not clear uninitialized globals in .ebss. Do not use for record restart:
* restart must preserve the archive, time and latest received voltages. */
void ump_log_init(void)
{
unsigned int i;
ump_state = 0; ump_count = 0; ump_cursor = 0; ump_next = 0;
ump_period = 20; ump_divider = 0;
ump_time = 0; ump_sequence = 0;
ump_bank = 0; ump_archive_bank = 1;
ump_archive_count = 0; ump_archive_next = 0; ump_generation = 0;
ump_source = 0; ump_post = 0;
ump_can_header = 0; ump_can_count = 0;
for (i = 0; i < 3; i++) ump_can_data[i] = 0;
for (i = 0; i < 2; i++) ump_pm67_voltage[i] = 0;
ump_prev_commands = 0; ump_prev_inputs = 0; ump_prev_outputs = 0;
ump_dac_ramp = 0; ump_dac_duration = 0; ump_dac_go10 = 0;
ump_dac_stop10 = 0; ump_dac_position = 0;
}
/* Ëîãè÷åñêèå óðîâíè âõîäîâ ïëàòû íàãðóçêè: ôèçè÷åñêèé íîëü îçíà÷àåò 1.
* ×òåíèå GPIO íåïîñðåäñòâåííî çäåñü ïîçâîëÿåò çàïèñàòü âõîä äî ñëåäóþùåãî
* îáíîâëåíèÿ ðåãèñòðà Inputs â îñíîâíîì öèêëå. */
static unsigned int ump_inputs(void)
{
return (!GpioDataRegs.GPADAT.bit.GPIO6) |
((!GpioDataRegs.GPADAT.bit.GPIO8) << 1) |
((!GpioDataRegs.GPADAT.bit.GPIO11) << 2);
}
/* START/STOP àêòèâíû åäèíèöåé; RES_OUT_2 àêòèâåí ôèçè÷åñêèì íóë¸ì. */
static unsigned int ump_outputs(void)
{
return GpioDataRegs.GPBDAT.bit.GPIO62 |
(GpioDataRegs.GPBDAT.bit.GPIO58 << 1) |
((!GpioDataRegs.GPADAT.bit.GPIO3) << 2);
}
/* Âûçûâàåòñÿ òîëüêî âíóòðè êîðîòêîé êðèòè÷åñêîé ñåêöèè. Âñå òðè èñòî÷íèêà
* çàïèñåé (main, CAN ISR, timer ISR) èñïîëüçóþò îäíó áëîêèðîâêó IRQ ñ
* âîññòàíîâëåíèåì ïðåæíåãî ñîñòîÿíèÿ, âêëþ÷àÿ âûçîâû èç ïðåðûâàíèÿ. */
static void ump_capture(unsigned int reason)
{
volatile unsigned int *p;
unsigned int i, commands, inputs, outputs;
if (ump_state != 1 || Desk != dsk_LOAD || !READY) return;
if (no_write || never_write) { ump_state = 3; return; }
commands = Commands;
inputs = ump_inputs(); outputs = ump_outputs();
/* Freeze only an actual running-to-stopped output transition.
* STOP is set before RES_OUT_2 is cleared in main; an interrupt can
* observe these writes separately, so require its level, not its edge.
* Repeated reset/STOP pulses while already stopped leave the archive. */
if (!ump_post && (ump_prev_outputs & 4U) && !(outputs & 4U) &&
(outputs & 2U)) {
/* Keep 90% including the trigger; reserve 10% for later records. */
if (ump_count >= UMP_LOG_CAPACITY - UMP_POST_POINTS)
ump_count = UMP_LOG_CAPACITY - UMP_POST_POINTS - 1;
ump_post = UMP_POST_POINTS;
reason |= 0x100;
}
ump_prev_commands = commands; ump_prev_inputs = inputs; ump_prev_outputs = outputs;
/* Every stored point counts, including CAN and I/O, except the trigger. */
if (ump_post && !(reason & 0x100) && --ump_post == 0) reason = 5;
p = logs_block + ((unsigned long)ump_bank * UMP_LOG_CAPACITY + ump_next) * UMP_LOG_WORDS;
p[0] = (unsigned int)ump_time; p[1] = (unsigned int)(ump_time >> 16);
p[2] = reason; p[3] = commands;
p[4] = inputs; p[5] = outputs;
p[6] = (unsigned int)IMPowse; p[7] = (unsigned int)WAKEpowse;
p[8] = modbus[0x7B]; p[9] = modbus[0x1C];
for (i = 0; i < 4; i++) { p[10+i] = sens_data[i]; p[14+i] = modbus[i]; }
p[18] = ump_can_header;
p[19] = ump_can_data[0]; p[20] = ump_can_data[1]; p[21] = ump_can_data[2];
p[22] = ump_can_count; p[23] = CanTimeOutErrorTR;
/* Èñõîäíûå óñòàâêè — ìÀ; ýôôåêòèâíûå óñòàâêè ïîñëå îãðàíè÷åíèé — 0.1 ìÀ.
* p[8] — îòïðàâëåííûé êîä, à p[9] — ðàñ÷¸òíîå çàäàíèå, ÍÅ èçìåðåíèå òîêà. */
p[24] = DAC_go; p[25] = DAC_stop;
p[26] = DAC_min(); p[27] = DAC_max(); p[28] = DAC_cal();
p[29] = DAC_04; p[30] = DAC_20;
p[31] = ump_dac_ramp; p[32] = ump_dac_duration;
p[33] = ump_dac_go10; p[34] = ump_dac_stop10; p[35] = ump_dac_position;
for (i = 0; i < 4; i++) p[36+i] = ADC_table[i];
p[40] = ump_pm67_voltage[0]; p[41] = ump_pm67_voltage[1];
ump_next++;
if (ump_next == UMP_LOG_CAPACITY) ump_next = 0;
if (ump_count < UMP_LOG_CAPACITY) ump_count++;
ump_sequence++;
if (reason == 5) ump_freeze();
}
/* Çàâåðø¸ííûé áàíê áîëüøå íå èçìåíÿåòñÿ äî ñëåäóþùåãî îòêëþ÷åíèÿ.
* Íîìåð ïîêîëåíèÿ ïîçâîëÿåò GUI îáíàðóæèòü çàìåíó àðõèâà âî âðåìÿ ÷òåíèÿ. */
static void ump_freeze(void)
{
ump_archive_bank = ump_bank;
ump_archive_count = ump_count; ump_archive_next = ump_next;
ump_generation++;
ump_bank ^= 1;
ump_count = 0; ump_next = 0; ump_post = 0;
}
void ump_log_tick(void)
{
unsigned int saved = __disable_interrupts();
if (ump_state == 1) {
ump_time++;
if (++ump_divider >= ump_period) { ump_divider = 0; ump_capture(1); }
}
__restore_interrupts(saved);
}
/* Äîïîëíèòåëüíûé ñíèìîê òîëüêî ïðè èçìåíåíèè êîìàíä, âõîäîâ èëè âûõîäîâ.
* Ýòî íå çàìåíÿåò ïåðèîäè÷åñêóþ çàïèñü àíàëîãîâûõ âåëè÷èí â òàéìåðå. */
void ump_log_io(void)
{
unsigned int saved;
if (ump_state != 1 || Desk != dsk_LOAD) return;
saved = __disable_interrupts();
if (Commands != ump_prev_commands || ump_inputs() != ump_prev_inputs ||
ump_outputs() != ump_prev_outputs) ump_capture(3);
__restore_interrupts(saved);
}
/* Âûçûâàåòñÿ ïîñëå ïðèìåíåíèÿ ñëîâ ïðèíÿòîãî CAN-êàäðà: ñíèìîê ñîäåðæèò
* íîâûå êîìàíäû, à òàêæå èñõîäíûé àäðåñ/ìàñêó è âñå òðè ñëîâà êàäðà. */
void ump_log_can(unsigned int header, unsigned int a, unsigned int b, unsigned int c)
{
unsigned int saved, i, address, mask, data[3];
if (Desk != dsk_LOAD) return;
saved = __disable_interrupts();
data[0] = a; data[1] = b; data[2] = c;
address = header & 0x1FFFU;
mask = 0x8000U;
/* Track reception even while recording is stopped. Each mask bit
* refers to its own address, including disabled words in between. */
for (i = 0; i < 3; i++, address++, mask >>= 1) {
if (!(header & mask)) continue;
if (address == 305U) ump_pm67_voltage[0] = data[i];
if (address == 8U) ump_pm67_voltage[1] = data[i];
}
if (ump_state != 1) { __restore_interrupts(saved); return; }
ump_can_header = header;
ump_can_data[0] = a; ump_can_data[1] = b; ump_can_data[2] = c;
ump_can_count++;
ump_capture(2);
__restore_interrupts(saved);
}
void ump_log_rs(void)
{
unsigned int saved = __disable_interrupts();
ump_capture(4);
__restore_interrupts(saved);
}
/* Óïðàâëåíèå æóðíàëîì îòäåëåíî îò òåõíîëîãè÷åñêèõ êîìàíä: íà÷àëî çàïèñè
* ÍÅ çàïóñêàåò ÓÌÏ. Âûáîð àðõèâà íå îñòàíàâëèâàåò òåêóùóþ çàïèñü. */
int ump_log_write(unsigned int address, unsigned int value)
{
unsigned int saved, valid = 1;
saved = __disable_interrupts();
if (address == UMP_LOG_BASE && value == 0) {
ump_state = 3; ump_post = 0;
} else if (address == UMP_LOG_BASE && value == 1 && Desk == dsk_LOAD && READY && ump_state != 1) {
ump_count = 0; ump_next = 0; ump_cursor = 0; ump_divider = 0; ump_post = 0;
ump_source = 0;
ump_prev_commands = Commands;
ump_prev_inputs = ump_inputs(); ump_prev_outputs = ump_outputs();
no_write = 0; never_write = 0;
ump_state = 1;
ump_capture(1);
}
else if (address == UMP_LOG_BASE+1 && ump_state != 1 && value >= 1 && value <= 1000)
ump_period = value;
else if (address == UMP_LOG_BASE+2 && value < UMP_LOG_CAPACITY)
ump_cursor = value;
else if (address == UMP_LOG_BASE+3 && value <= 1) ump_source = value;
else valid = 0;
__restore_interrupts(saved);
return valid;
}
/* Ïðåîáðàçîâàíèå õðîíîëîãè÷åñêîãî èíäåêñà â ôèçè÷åñêóþ ïîçèöèþ êîëüöà.
* Äëÿ àðõèâà ñîõðàíåíû ñîáñòâåííûå count/next, íåçàâèñèìûå îò æèâîãî áàíêà. */
static unsigned int ump_word(unsigned int archived, unsigned int record, unsigned int word)
{
unsigned int count = archived ? ump_archive_count : ump_count;
unsigned int next = archived ? ump_archive_next : ump_next;
unsigned int bank = archived ? ump_archive_bank : ump_bank;
unsigned int slot;
if (record >= count) return 0;
slot = next + UMP_LOG_CAPACITY - count + record;
while (slot >= UMP_LOG_CAPACITY) slot -= UMP_LOG_CAPACITY;
return logs_block[((unsigned long)bank * UMP_LOG_CAPACITY + slot) * UMP_LOG_WORDS + word];
}
/* Âåñü Modbus-áëîê ÷èòàåòñÿ âûçûâàþùèì êîäîì ïîä îäíîé áëîêèðîâêîé IRQ.
* Ïîýòîìó timestamp/äàííûå è çàãîëîâîê îíëàéí-áëîêà îòíîñÿòñÿ ê îäíîìó
* ñîñòîÿíèþ êîëüöà, äàæå åñëè â ýòîò ìîìåíò ïðèõîäèò íîâàÿ CAN-êîìàíäà. */
unsigned int ump_log_read(unsigned int address)
{
unsigned int offset, count;
unsigned long first;
switch (address) {
case UMP_LOG_BASE: return 0x554D;
case UMP_LOG_BASE+1: return 3;
case UMP_LOG_BASE+2: return ump_source ? 3 : ump_state;
case UMP_LOG_BASE+3: return ump_source ? ump_archive_count : ump_count;
case UMP_LOG_BASE+4: return UMP_LOG_WORDS;
case UMP_LOG_BASE+5: return UMP_LOG_CAPACITY;
case UMP_LOG_BASE+6: return ump_period;
case UMP_LOG_BASE+7: return (unsigned int)ump_time;
case UMP_LOG_BASE+8: return (unsigned int)(ump_time >> 16);
case UMP_LOG_BASE+9: return Desk;
case UMP_LOG_BASE+10: return Mode;
case UMP_LOG_BASE+11: return (unsigned int)READY_FREQ;
case UMP_LOG_BASE+12: return ump_generation;
case UMP_LOG_BASE+13: return ump_archive_count;
/* Preserve the legacy millisecond status field as an upper estimate.
* Additional event records may finish the post interval sooner. */
case UMP_LOG_BASE+14:
first = (unsigned long)ump_post * ump_period;
return first > 65535UL ? 65535U : (unsigned int)first;
case UMP_LOG_BASE+15: return ump_state;
}
if (address >= UMP_LOG_DATA && address < UMP_LOG_DATA+120 && (ump_source || ump_state != 1)) {
offset = address - UMP_LOG_DATA;
return ump_word(ump_source, ump_cursor + offset / UMP_LOG_WORDS, offset % UMP_LOG_WORDS);
}
/* Ïîñëåäíèå òðè çàïèñè äëÿ îíëàéí-ãðàôèêà, áåç îñòàíîâêè è áåç
* èçìåíåíèÿ êóðñîðà àðõèâíîãî ÷òåíèÿ. Ïåðâûå äâà ñëîâà — èõ íîìåð. */
if (address >= UMP_LOG_LIVE && address < UMP_LOG_LIVE+124) {
count = ump_count < UMP_LOG_LIVE_RECORDS ? ump_count : UMP_LOG_LIVE_RECORDS;
first = ump_sequence - count;
offset = address - UMP_LOG_LIVE;
if (offset == 0) return (unsigned int)first;
if (offset == 1) return (unsigned int)(first >> 16);
if (offset == 2) return count;
if (offset == 3) return ump_generation;
offset -= 4;
if (offset / UMP_LOG_WORDS < count)
return ump_word(0, ump_count - count + offset / UMP_LOG_WORDS, offset % UMP_LOG_WORDS);
}
return 0;
}

View File

@@ -39,8 +39,6 @@ void main()
{
int i,j,mask;
static unsigned int cancount[2], cancell[2], rscount;
static int preCstart=1,preCstop=1;
int umpstart,umpstop;
RS_DATA * rs;
int presbyt=0;
@@ -82,6 +80,8 @@ void main()
unsetup_leds_line();
clear_mem();
ump_log_init();
Load_control_init(); /* Explicit initialization before IRQ. */
set_cntrl_addr(Mode,16);
timer_Init();
EnableInterrupts();
@@ -109,6 +109,8 @@ void main()
while(1)
{
/* ×òåíèå ëîããåðà ïî CAN íå áëîêèðóåò öèêë óïðàâëåíèÿ. */
UMP_CAN_service();
if(CanGO)
{
CanGO=0;
@@ -175,27 +177,11 @@ void main()
presbyt = bTermoCal;
}
if(Desk==dsk_LOAD)
{
umpstart = cUMPstart;
umpstop = cUMPreset;
/* Timer1 owns START/STOP/permission and the DAC ramp together.
* Main must not re-enable the output during a protected reload. */
if(umpstart & !preCstart)
{
set_START_DPTB(); set_RES_OUT_2();
IMPowse = READY_FREQ;
}
preCstart = umpstart;
if(umpstop & !preCstop)
{
set_STOP_DPTB(); clear_RES_OUT_2();
IMPowse = READY_FREQ;
}
preCstop = umpstop;
if(!IMPowse) { clear_START_DPTB(); clear_STOP_DPTB(); }
}
/* Ñíèìîê ïîñëå îáíîâëåíèÿ âõîäîâ è ôîðìèðîâàíèÿ ïóñêîâûõ âûõîäîâ. */
ump_log_io();
for(i=0;i<2;i++)
{

View File

@@ -130,6 +130,9 @@ interrupt void cpu_timer1_isr_SENS(void)
EALLOW;
CpuTimer1.InterruptCount++;
#if RS232_USE_FIFO
RS_FifoTick1ms();
#endif
IER |= M_INT13; // Set "global" priority
IER &= MINT13; // Set "global" priority
EINT;
@@ -151,6 +154,8 @@ interrupt void cpu_timer1_isr_SENS(void)
if(Desk==dsk_LOAD)
{
Load_runner();
/* Áàçà âðåìåíè 1 ìñ; ñíèìîê ñîäåðæèò ðåçóëüòàò òåêóùåãî øàãà ÖÀÏ. */
ump_log_tick();
return;
}
@@ -412,7 +417,7 @@ void Init_packMask()
if(Desk==dsk_LOAD)
{ Maska[m_SLOW][7]|= 0x0030; // Êàëèáðîâêà ÖÀÏ
Maska[m_SLOW][5]|= 0x0003; // Íà÷àëî è êîíåö çàðàäà
Maska[m_FAST][7]|= 0xE000; // Дублировать команды
Maska[m_FAST][7]|= 0xF000; /* Protection status 0x7C + attempts 0x7D. */ // Äóáëèðîâàòü êîìàíäû
Maska[m_FAST][1]|= 0x3000; // Óïðàâëàþùèé òîê ÑÈÔÓ
} }

View File

@@ -1,3 +1,5 @@
#include "eeprom_config.h"
#include "include/balsam167_eeprom_block.h"
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "package.h"
#include "RS485.h"
@@ -17,6 +19,14 @@
#include "spise2p.h"
#include "caliber.h"
#include "log_to_mem.h"
#include "DAC.h"
#include "ump_tms28335.h"
#include "gas167.h"
#include "include/balsam167_eeprom_layout.h"
#if (ANSWER_LEN + 1) != BALSAM167_EEPROM_PARAM_WORDS
#error EEPROM_parameter_reservation_must_match_ANSWER_LEN
#endif
int modbus[ANSWER_LEN+1];
unsigned int param[ANSWER_LEN+1];
@@ -124,6 +134,7 @@ void Default_params()
// Ïðèøëî âðåìà!
DAC_go = 6; // íà÷àëî çàðàäà
LOAD_CAN_TIMEOUT = 2000; /* ms without fresh ZPT: freeze ramp. */
DAC_stop= 16; // êîíåö çàðàäà
}
@@ -139,7 +150,7 @@ void Load_params()
{
unsigned int i,crc;
Seeprom_read(0x3FFF-(ANSWER_LEN+1), param, (ANSWER_LEN+1)*2);
Seeprom_read(BALSAM167_EEPROM_PARAMS_START_WORD, param, (ANSWER_LEN+1)*2);
crc = get_crc16(param,ANSWER_LEN);
if( (crc==param[ANSWER_LEN]) &&
(crc !=0xFFFF) &&
@@ -172,7 +183,7 @@ void Save_params()
if(dif)
{
param[ANSWER_LEN] = get_crc16(param,ANSWER_LEN);
Seeprom_write(0x3FFF-(ANSWER_LEN+1),param,(ANSWER_LEN+1)*2);
Seeprom_write(BALSAM167_EEPROM_PARAMS_START_WORD,param,(ANSWER_LEN+1)*2);
} }
/***************************************************************/
@@ -182,15 +193,84 @@ void Save_params()
/***************************************************************/
/***************************************************************/
static void modbus_exception(RS_DATA *rs_arr, unsigned int function, unsigned int error)
{
unsigned int crc;
rs_arr->buffer[0] = CNTRL_ADDR;
rs_arr->buffer[1] = function | 0x80;
rs_arr->buffer[2] = error;
crc = get_crc_16(0xFFFF, rs_arr->buffer, 3);
rs_arr->buffer[3] = LOBYTE(crc); rs_arr->buffer[4] = HIBYTE(crc);
rs_arr->flag_TIMEOUT_to_Send = true;
RS_Send(rs_arr, rs_arr->buffer, 5);
}
/* UART parser has already validated CRC and accepted the device address. */
static int receive_ump(RS_DATA *rs_arr)
{
unsigned int address, value, saved, length, count, error;
/* Main-loop only; encoded into the UART buffer before the next request.
* Keep the 124-word snapshot off the shared interrupt stack. */
static uint16_t words[UMP_MAX_WORDS];
address = (rs_arr->RS_Header[2] << 8) | rs_arr->RS_Header[3];
if (address < UMP_BASE) return 0;
value = (rs_arr->RS_Header[4] << 8) | rs_arr->RS_Header[5];
/* SPI driver advances in Timer2 ISR: NEVER mask interrupts here.
* Reuse the existing snapshot buffer; the main loop owns this transaction.
* The shared validator rejects writes, wraparound and out-of-device reads. */
if (address >= 0x1300U && address < 0x1308U) {
count = Load_protection_prepare(rs_arr->RS_Header[1], address, value, words, &error);
} else if (address >= BALSAM167_EEPROM_RTU_BASE) {
error = 2;
#if EEPROM_M95M02
/* Exception 3 prevents old AT-profile clients from falling back to
* legacy PEEK after a profile mismatch. No SPI transaction is issued. */
if (!(value & BALSAM167_EEPROM_M95_MARKER)) error = 3;
#endif
count = 0;
if (balsam167_eeprom_block_valid(rs_arr->RS_Header[1], address, value)) {
#if EEPROM_M95M02
count = value & 255U;
Seeprom_read(balsam167_eeprom_block_word(address, value), words, count * 2);
#else
count = value;
Seeprom_read(address - BALSAM167_EEPROM_RTU_BASE, words, count * 2);
#endif
error = 0;
}
} else {
saved = __disable_interrupts();
#if EEPROM_M95M02
if (gas167_contains(address))
count = gas167_prepare(rs_arr->RS_Header[1], address, value, 0, words, &error);
else
#endif
count = ump_tms28335_capture(rs_arr->RS_Header[1], address, value, words, &error);
__restore_interrupts(saved);
}
length = ump_rtu_encode(CNTRL_ADDR, rs_arr->RS_Header[1], error,
words, count, rs_arr->buffer, MAX_SEND_LENGTH);
if (length) {
rs_arr->flag_TIMEOUT_to_Send = true;
RS_Send(rs_arr, rs_arr->buffer, length);
}
return 1;
}
void ReceiveCommandModbus3(RS_DATA *rs_arr)
{
unsigned int crc, Address_MB, Length_MB, i;
unsigned int crc, Address_MB, Length_MB, i, value;
if (receive_ump(rs_arr)) return;
// ïîëó÷èëè íà÷àëüíûé àäðåñ ÷òåíèà
Address_MB =/*(rs_arr->RS_Header[2] << 8) |*/ rs_arr->RS_Header[3];
Address_MB = (rs_arr->RS_Header[2] << 8) | rs_arr->RS_Header[3];
// ïîëó÷èëè êîëè÷åñòâî ñëîâ äàííûõ
Length_MB = (rs_arr->RS_Header[4] << 8) | rs_arr->RS_Header[5];
if (!Length_MB || Length_MB > 125 ||
!(Address_MB < ANSWER_LEN && Length_MB <= ANSWER_LEN-Address_MB)) {
modbus_exception(rs_arr, CMD_MODBUS_3, 2); return;
}
/////////////////////////////////////////////////
// Îòñûëêà
@@ -200,10 +280,13 @@ void ReceiveCommandModbus3(RS_DATA *rs_arr)
rs_arr->buffer[1] = CMD_MODBUS_3;
rs_arr->buffer[2] = Length_MB*2;
/* Çàùèùàåì öåëîñòíîñòü îäíîãî ñíèìêà/áëîêà; ïåðåäà÷à UART èä¸ò óæå
* ñ ðàçðåø¸ííûìè ïðåðûâàíèÿìè è íå çàäåðæèâàåò èçìåðåíèå/óïðàâëåíèå. */
for (i=0;i<Length_MB;i++)
{
rs_arr->buffer[3+i*2 ]=(Modbus[Address_MB+i].byt.byte_hi);
rs_arr->buffer[3+i*2+1]=(Modbus[Address_MB+i].byt.byte_lo);
value = modbus[Address_MB+i];
rs_arr->buffer[3+i*2] = (value >> 8) & 0xFF;
rs_arr->buffer[3+i*2+1] = value & 0xFF;
}
crc = 0xffff;
@@ -218,7 +301,10 @@ void ReceiveCommandModbus3(RS_DATA *rs_arr)
rs_arr->buffer[Length_MB*2+8] = 0;
rs_arr->flag_TIMEOUT_to_Send=true;
RS_Send(rs_arr, rs_arr->buffer, Length_MB*2+8);
/* Ðàñøèðåíèå ëîããåðà îòâå÷àåò òî÷íûì êàäðîì Modbus áåç õâîñòîâûõ
* íóëåé: îíè èíà÷å ïîïàëè áû â íà÷àëî îòâåòà ñëåäóþùåãî áëîêà GUI.
* Èñòîðè÷åñêèé ôîðìàò òåõíîëîãè÷åñêèõ ðåãèñòðîâ îñòàâëåí ïðåæíèì. */
RS_Send(rs_arr, rs_arr->buffer, Length_MB*2+8);
return;
}
@@ -226,6 +312,7 @@ void ReceiveCommandModbus3(RS_DATA *rs_arr)
void ReceiveCommandModbus6(RS_DATA *rs_arr)
{
unsigned int Address_MB, Data_MB, i;
if (receive_ump(rs_arr)) return;
/////////////////////////////////////////////////
// Îòñûëêà
@@ -236,12 +323,22 @@ void ReceiveCommandModbus6(RS_DATA *rs_arr)
// ïîëó÷èëè íà÷àëüíûé àäðåñ çàïèñè
Address_MB = (/*(rs_arr->RS_Header[2] << 8) | */rs_arr->RS_Header[3]);
Address_MB = (rs_arr->RS_Header[2] << 8) | rs_arr->RS_Header[3];
// ïîëó÷èëè ñëîâî äàííûõ
Data_MB = (rs_arr->RS_Header[4] << 8) | rs_arr->RS_Header[5];
Modbus[Address_MB].all = Data_MB;
if (Desk == dsk_LOAD && (Address_MB == 0x7CU || Address_MB == 0x7DU)) {
modbus_exception(rs_arr, CMD_MODBUS_6, 2); return;
}
if (Desk == dsk_LOAD && Address_MB == 0x52U &&
(Data_MB == 0U || Data_MB > 60000U)) {
modbus_exception(rs_arr, CMD_MODBUS_6, 3); return;
}
if (Address_MB < ANSWER_LEN) {
Modbus[Address_MB].all = Data_MB;
if (Address_MB == 127) ump_log_rs();
} else { modbus_exception(rs_arr, CMD_MODBUS_6, 2); return; }
rs_arr->flag_TIMEOUT_to_Send=true;
RS_Send(rs_arr, rs_arr->buffer, 10);

View File

@@ -0,0 +1,7 @@
/* Build the canonical sources directly; do not copy their implementations. */
#include "../firmware-info/src/firmware_info_static.c"
/* Bind only this PM35 application's identity. The shared transport still owns
* range checks, read-only access, CRC and CAN fragment packing. */
#define UMP_FIRMWARE_INFO_READ firmware_info_static_read
#include "src/ump_protocol.c"
#include "ports/tms320f28335/ump_tms28335.c"

View File

@@ -1,16 +1,3 @@
/*=================================================================
File name : SPISE2PD.C
Originator : Settu Duraisamy
C2000 Applications Team
Texas Instruments
Description : This file contains the SPI bus Serial EEPROM driver
implemented using Virtual SPI driver
Date : 6/30/2003 (DD/MM/YYYY)
====================================================================*/
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "spise2p.h"
@@ -32,12 +19,18 @@ int ccc=0;
/******* SPI bus Serial EEPROM driver Initialization routine ********/
/********************************************************************/
void Seeprom_write( unsigned int adres,
void Seeprom_write( SE2P_SIZE adres,
unsigned int buf[],
unsigned int size)
SE2P_SIZE size)
{
unsigned int len;
#if EEPROM_M95M02
/* Bound physical accesses before byte-to-word rounding. Legacy 32-KiB
* callers retain their compact driver; EXTEND is checked independently. */
if (adres >= PROM_LEN || !size || size > (PROM_LEN-adres)*2) return;
#endif
CpuTimer2.InterruptCount=0;
CpuTimer2Regs.TCR.all = 0x4020; // Use write-only instruction to set TSS bit = 0
@@ -63,12 +56,18 @@ void Seeprom_write( unsigned int adres,
CpuTimer2Regs.TCR.all = 0x4010; // Use write-only instruction to set TSS bit = 1
}
void Seeprom_read( unsigned int adres,
void Seeprom_read( SE2P_SIZE adres,
unsigned int buf[],
unsigned int size)
SE2P_SIZE size)
{
unsigned int len;
#if EEPROM_M95M02
/* Bound physical accesses before byte-to-word rounding. Legacy 32-KiB
* callers retain their compact driver; EXTEND is checked independently. */
if (adres >= PROM_LEN || !size || size > (PROM_LEN-adres)*2) return;
#endif
CpuTimer2.InterruptCount=0;
CpuTimer2Regs.TCR.all = 0x4020; // Use write-only instruction to set TSS bit = 0
@@ -257,6 +256,15 @@ void SPISE2P_DRV_tick(SPISE2P_DRV *eeprom)
case 5:
/* Send Address */
#if EEPROM_M95M02
SpiaRegs.SPICCR.all=SPISE2P_TFR8BIT;
SpiaRegs.SPITXBUF=(unsigned int)(eeprom->msgPtr->se2pAddr >> 16) << 8;
step=20;
break;
case 20:
if (!SpiaRegs.SPISTS.bit.INT_FLAG) break;
dummy=SpiaRegs.SPIRXBUF;
#endif
#if(SPISE2P_ADDR_WIDTH==SIXTEEN_BIT)
SpiaRegs.SPICCR.all= SPISE2P_TFR16BIT;
SpiaRegs.SPITXBUF=eeprom->msgPtr->se2pAddr;
@@ -387,7 +395,16 @@ void SPISE2P_DRV_tick(SPISE2P_DRV *eeprom)
case 15:
/* Send Address */
#if(SPISE2P_ADDR_WIDTH==SIXTEEN_BIT)
#if EEPROM_M95M02
SpiaRegs.SPICCR.all=SPISE2P_TFR8BIT;
SpiaRegs.SPITXBUF=(unsigned int)(eeprom->msgPtr->se2pAddr >> 16) << 8;
step=21;
break;
case 21:
if (!SpiaRegs.SPISTS.bit.INT_FLAG) break;
dummy=SpiaRegs.SPIRXBUF;
#endif
#if(SPISE2P_ADDR_WIDTH==SIXTEEN_BIT)
SpiaRegs.SPICCR.all= SPISE2P_TFR16BIT;
SpiaRegs.SPITXBUF=eeprom->msgPtr->se2pAddr;
#endif

View File

@@ -1,10 +1,10 @@
******************************************************************************
TMS320C2000 Linker PC v22.6.1
TMS320C2000 Linker PC v22.6.0
******************************************************************************
>> Linked Fri Sep 18 22:12:13 2026
>> Linked Thu Oct 1 18:01:50 2026
OUTPUT FILE NAME: <C:/Dima/Project/Balsam_167/UKSSTMS320F28335/../bin/UKSSTMS320F28335.out>
ENTRY POINT SYMBOL: "_c_int00" address: 0000b198
OUTPUT FILE NAME: <K:/git_project/Balsam_167_periph/UKSSTMS320F28335/../bin/UKSSTMS320F28335.out>
ENTRY POINT SYMBOL: "_c_int00" address: 0000b9b5
MEMORY CONFIGURATION
@@ -13,8 +13,8 @@ MEMORY CONFIGURATION
---------------------- -------- --------- -------- -------- ---- --------
PAGE 0:
ZONE0 00004000 00001000 00000000 00001000 RWIX
RAML0 00008000 00004000 000035e2 00000a1e RWIX
RAML4 0000c000 00001000 0000013a 00000ec6 RWIX
RAML0 00008000 00004000 00003b73 0000048d RWIX
RAML4 0000c000 00001000 000003f8 00000c08 RWIX
ZONE6 00100000 00100000 00000000 00100000 RWIX
FLASHH 00300000 00008000 00000000 00008000 RWIX
FLASHG 00308000 00008000 00000000 00008000 RWIX
@@ -87,7 +87,7 @@ PAGE 1:
SCIB 00007750 00000010 00000010 00000000 RWIX
SCIC 00007770 00000010 00000010 00000000 RWIX
I2CA 00007900 00000040 00000022 0000001e RWIX
RAML5 0000d000 00003000 00000f38 000020c8 RWIX
RAML5 0000d000 00003000 00000fdf 00002021 RWIX
ZONE7A 00200000 0000fc00 0000fa00 00000200 RWIX
ZONE7B 0020fc00 00000400 00000000 00000400 RWIX
FLASHB 00330000 00008000 00000000 00008000 RWIX
@@ -100,89 +100,97 @@ SECTION ALLOCATION MAP
output attributes/
section page origin length input sections
-------- ---- ---------- ---------- ----------------
.cinit 0 0000b35f 00000283
0000b35f 00000103 crc16.obj (.cinit:_crc_16_tab)
0000b462 00000043 message.obj (.cinit:_def_cal)
0000b4a5 0000003d measure.obj (.cinit)
0000b4e2 00000020 peripher.obj (.cinit)
0000b502 0000001f spise2p.obj (.cinit)
0000b521 0000001c ecan.obj (.cinit)
0000b53d 00000015 measure.obj (.cinit:_powK)
0000b552 00000013 kanal.obj (.cinit:_digits)
0000b565 00000011 pulto.obj (.cinit)
0000b576 00000010 DAC.obj (.cinit)
0000b586 0000000c log_to_mem.obj (.cinit)
0000b592 0000000a rts2800_fpu32.lib : _lock.obj (.cinit)
0000b59c 0000000a : exit.obj (.cinit)
0000b5a6 00000008 ADC.obj (.cinit)
0000b5ae 00000008 kanal.obj (.cinit:_readr)
0000b5b6 00000008 cntrl_adr.obj (.cinit)
0000b5be 00000008 main.obj (.cinit)
0000b5c6 00000005 ADC.obj (.cinit:_cwnt_ok$4)
0000b5cb 00000005 measure.obj (.cinit:_low_count)
0000b5d0 00000004 RS485.obj (.cinit)
0000b5d4 00000004 RS485.obj (.cinit:_RS_Len)
0000b5d8 00000004 bios.obj (.cinit)
0000b5dc 00000004 rts2800_fpu32.lib : errno.obj (.cinit)
0000b5e0 00000002 --HOLE-- [fill = 0]
.cinit 0 0000c000 0000028b
0000c000 00000103 crc16.obj (.cinit:_crc_16_tab)
0000c103 00000043 message.obj (.cinit:_def_cal)
0000c146 0000003d measure.obj (.cinit)
0000c183 00000020 peripher.obj (.cinit)
0000c1a3 0000001f spise2p.obj (.cinit)
0000c1c2 0000001c ecan.obj (.cinit)
0000c1de 00000015 measure.obj (.cinit:_powK)
0000c1f3 00000014 log_to_mem.obj (.cinit)
0000c207 00000013 kanal.obj (.cinit:_digits)
0000c21a 00000011 pulto.obj (.cinit)
0000c22b 00000010 DAC.obj (.cinit)
0000c23b 0000000a rts2800_fpu32.lib : _lock.obj (.cinit)
0000c245 0000000a : exit.obj (.cinit)
0000c24f 00000008 ADC.obj (.cinit)
0000c257 00000008 kanal.obj (.cinit:_readr)
0000c25f 00000008 cntrl_adr.obj (.cinit)
0000c267 00000008 main.obj (.cinit)
0000c26f 00000005 ADC.obj (.cinit:_cwnt_ok$4)
0000c274 00000005 measure.obj (.cinit:_low_count)
0000c279 00000004 RS485.obj (.cinit)
0000c27d 00000004 RS485.obj (.cinit:_RS_Len)
0000c281 00000004 bios.obj (.cinit)
0000c285 00000004 rts2800_fpu32.lib : errno.obj (.cinit)
0000c289 00000002 --HOLE-- [fill = 0]
.pinit 0 00008000 00000000 UNINITIALIZED
.text 0 00008000 0000335f
.text 0 00008000 00003b73
00008000 000008e6 measure.obj (.text)
000088e6 00000711 DSP2833x_SWPrioritizedDefaultIsr.obj (.text:retain)
00008ff7 000003c3 peripher.obj (.text)
000093ba 000003bd RS485.obj (.text)
00009777 000002bf bios.obj (.text)
00009a36 00000279 message.obj (.text)
00009caf 0000025b spise2p.obj (.text)
00009f0a 0000024d main.obj (.text)
0000a157 000001f3 ADC.obj (.text:retain)
0000a34a 000001c3 measure.obj (.text:retain)
0000a50d 00000196 ADC.obj (.text)
0000a6a3 0000016c kanal.obj (.text)
0000a80f 00000163 DAC.obj (.text)
0000a972 0000015d DSP2833x_SysCtrl.obj (.text)
0000aacf 00000151 pulto.obj (.text:retain)
0000ac20 00000139 ecan.obj (.text)
0000ad59 00000114 RS485.obj (.text:retain)
0000ae6d 0000010c DSP2833x_Xintf.obj (.text)
0000af79 00000088 rts2800_fpu32.lib : fs_div.obj (.text)
0000b001 00000075 crc16.obj (.text)
0000b076 00000075 ecan.obj (.text:retain)
0000b0eb 0000005e DSP2833x_CpuTimers.obj (.text)
0000b149 0000004f tools.obj (.text)
0000b198 00000046 rts2800_fpu32.lib : boot.obj (.text)
0000b1de 00000039 spise2p.obj (.text:retain)
0000b217 00000037 filter_bat2.obj (.text)
0000b24e 0000002a rts2800_fpu32.lib : l_div.obj (.text)
0000b278 00000028 DSP2833x_PieCtrl.obj (.text)
0000b2a0 00000020 rts2800_fpu32.lib : sqrt.obj (.text)
0000b2c0 0000001d pulto.obj (.text)
0000b2dd 0000001b rts2800_fpu32.lib : args_main.obj (.text)
0000b2f8 00000019 DSP2833x_Adc.obj (.text)
0000b311 00000019 rts2800_fpu32.lib : exit.obj (.text)
0000b32a 00000015 log_to_mem.obj (.text)
0000b33f 0000000e DSP2833x_SWPrioritizedPieVect.obj (.text)
0000b34d 00000009 rts2800_fpu32.lib : _lock.obj (.text)
0000b356 00000005 cntrl_adr.obj (.text)
0000b35b 00000004 DSP2833x_usDelay.obj (.text)
00009777 0000037f log_to_mem.obj (.text)
00009af6 00000325 message.obj (.text)
00009e1b 00000309 shared_ump.obj (.text)
0000a124 000002bf bios.obj (.text)
0000a3e3 0000025b spise2p.obj (.text)
0000a63e 0000024d main.obj (.text)
0000a88b 000001f9 ecan.obj (.text)
0000aa84 000001f3 ADC.obj (.text:retain)
0000ac77 000001c5 measure.obj (.text:retain)
0000ae3c 00000196 ADC.obj (.text)
0000afd2 0000018a DAC.obj (.text)
0000b15c 0000016c kanal.obj (.text)
0000b2c8 0000015d DSP2833x_SysCtrl.obj (.text)
0000b425 00000151 pulto.obj (.text:retain)
0000b576 00000114 RS485.obj (.text:retain)
0000b68a 0000010c DSP2833x_Xintf.obj (.text)
0000b796 00000088 rts2800_fpu32.lib : fs_div.obj (.text)
0000b81e 00000075 crc16.obj (.text)
0000b893 00000075 ecan.obj (.text:retain)
0000b908 0000005e DSP2833x_CpuTimers.obj (.text)
0000b966 0000004f tools.obj (.text)
0000b9b5 00000046 rts2800_fpu32.lib : boot.obj (.text)
0000b9fb 00000039 spise2p.obj (.text:retain)
0000ba34 00000037 filter_bat2.obj (.text)
0000ba6b 0000002a rts2800_fpu32.lib : l_div.obj (.text)
0000ba95 00000028 DSP2833x_PieCtrl.obj (.text)
0000babd 00000001 --HOLE-- [fill = 0]
0000babe 00000020 rts2800_fpu32.lib : sqrt.obj (.text)
0000bade 0000001d pulto.obj (.text)
0000bafb 0000001b rts2800_fpu32.lib : args_main.obj (.text)
0000bb16 00000019 DSP2833x_Adc.obj (.text)
0000bb2f 00000019 rts2800_fpu32.lib : exit.obj (.text)
0000bb48 0000000e DSP2833x_SWPrioritizedPieVect.obj (.text)
0000bb56 0000000b rts2800_fpu32.lib : u_div.obj (.text)
0000bb61 00000009 : _lock.obj (.text)
0000bb6a 00000005 cntrl_adr.obj (.text)
0000bb6f 00000004 DSP2833x_usDelay.obj (.text)
ramfuncs 0 0000c000 00000000 UNINITIALIZED
.econst 0 0000c000 00000112
0000c000 00000100 DSP2833x_SWPrioritizedPieVect.obj (.econst:_PieVectTableInit)
0000c100 00000009 message.obj (.econst:_$P$T0$1)
0000c109 00000006 message.obj (.econst:_$P$T1$2)
0000c10f 00000003 cntrl_adr.obj (.econst)
.econst 0 0000c28c 00000125
0000c28c 00000100 DSP2833x_SWPrioritizedPieVect.obj (.econst:_PieVectTableInit)
0000c38c 00000009 message.obj (.econst:_$P$T0$1)
0000c395 00000001 --HOLE-- [fill = 0]
0000c396 00000006 shared_ump.obj (.econst:_$P$T0$1)
0000c39c 00000006 message.obj (.econst:_$P$T1$2)
0000c3a2 00000006 shared_ump.obj (.econst:_$P$T1$2)
0000c3a8 00000006 shared_ump.obj (.econst:_$P$T2$3)
0000c3ae 00000003 cntrl_adr.obj (.econst)
.switch 0 0000c112 00000028
0000c112 00000028 spise2p.obj (.switch:_SPISE2P_DRV_tick)
.switch 0 0000c3b2 00000048
0000c3b2 00000028 spise2p.obj (.switch:_SPISE2P_DRV_tick)
0000c3da 00000020 log_to_mem.obj (.switch:_ump_log_read)
.stack 1 00000400 000003f0 UNINITIALIZED
00000400 000003f0 --HOLE--
.ebss 1 0000d000 00000f38 UNINITIALIZED
.ebss 1 0000d000 00000fdf UNINITIALIZED
0000d000 00000704 RS485.obj (.ebss)
0000d704 00000038 measure.obj (.ebss:_sens_count)
0000d73c 00000004 ADC.obj (.ebss:_adc_table_lem)
@@ -196,39 +204,42 @@ ramfuncs 0 0000c000 00000000 UNINITIALIZED
0000dc42 00000038 measure.obj (.ebss)
0000dc7a 00000006 DSP2833x_SysCtrl.obj (.ebss)
0000dc80 00000081 message.obj (.ebss:_param)
0000dd01 00000020 measure.obj (.ebss:_din_count)
0000dd21 0000001c ADC.obj (.ebss:_ADC_table)
0000dd3d 00000003 main.obj (.ebss)
0000dd40 00000048 measure.obj (.ebss:_zer_filter)
0000dd88 0000001c ADC.obj (.ebss:_prev_ok)
0000dda4 0000001c spise2p.obj (.ebss)
0000ddc0 00000046 RS485.obj (.ebss:_RS_Len)
0000de06 00000018 DSP2833x_CpuTimers.obj (.ebss)
0000de1e 00000018 measure.obj (.ebss:_sens_pair)
0000de36 0000000a pulto.obj (.ebss)
0000de40 00000040 message.obj (.ebss:_def_cal)
0000de80 00000018 measure.obj (.ebss:_sens_type)
0000de98 00000012 measure.obj (.ebss:_powK)
0000deaa 00000010 peripher.obj (.ebss)
0000deba 00000006 measure.obj (.ebss:_err_count)
0000dec0 0000000e DAC.obj (.ebss)
0000dece 0000000e ecan.obj (.ebss)
0000dedc 0000000c ADC.obj (.ebss)
0000dee8 0000000c measure.obj (.ebss:_lev_quadr)
0000def4 0000000c log_to_mem.obj (.ebss)
0000df00 00000008 measure.obj (.ebss:_ext_diag)
0000df08 00000008 measure.obj (.ebss:_ext_temp)
0000df10 00000008 measure.obj (.ebss:_zer_count)
0000df18 00000006 measure.obj (.ebss:_lev_count)
0000df1e 00000005 kanal.obj (.ebss:_readr)
0000df23 00000004 cntrl_adr.obj (.ebss)
0000df27 00000001 rts2800_fpu32.lib : errno.obj (.ebss)
0000df28 00000004 : _lock.obj (.ebss)
0000df2c 00000004 : exit.obj (.ebss)
0000df30 00000002 main.obj (.ebss:_cancell$2)
0000df32 00000002 main.obj (.ebss:_cancount$1)
0000df34 00000002 ADC.obj (.ebss:_cwnt_ok$4)
0000df36 00000002 measure.obj (.ebss:_low_count)
0000dd01 00000001 rts2800_fpu32.lib : errno.obj (.ebss)
0000dd02 00000028 log_to_mem.obj (.ebss)
0000dd2a 00000012 measure.obj (.ebss:_powK)
0000dd3c 00000004 cntrl_adr.obj (.ebss)
0000dd40 0000007c ecan.obj (.ebss:_ump_can_reply)
0000ddbc 00000004 rts2800_fpu32.lib : _lock.obj (.ebss)
0000ddc0 00000048 measure.obj (.ebss:_zer_filter)
0000de08 00000020 measure.obj (.ebss:_din_count)
0000de28 00000018 DSP2833x_CpuTimers.obj (.ebss)
0000de40 00000046 RS485.obj (.ebss:_RS_Len)
0000de86 0000001c ADC.obj (.ebss:_ADC_table)
0000dea2 0000001c ADC.obj (.ebss:_prev_ok)
0000debe 00000002 main.obj (.ebss:_cancell$2)
0000dec0 00000040 message.obj (.ebss:_def_cal)
0000df00 0000001c spise2p.obj (.ebss)
0000df1c 00000018 measure.obj (.ebss:_sens_pair)
0000df34 0000000c ADC.obj (.ebss)
0000df40 00000018 measure.obj (.ebss:_sens_type)
0000df58 00000018 ecan.obj (.ebss)
0000df70 00000010 peripher.obj (.ebss)
0000df80 0000000e DAC.obj (.ebss)
0000df8e 0000000c measure.obj (.ebss:_lev_quadr)
0000df9a 0000000a pulto.obj (.ebss)
0000dfa4 00000008 measure.obj (.ebss:_ext_diag)
0000dfac 00000008 measure.obj (.ebss:_ext_temp)
0000dfb4 00000008 measure.obj (.ebss:_zer_count)
0000dfbc 00000004 rts2800_fpu32.lib : exit.obj (.ebss)
0000dfc0 00000006 measure.obj (.ebss:_err_count)
0000dfc6 00000006 measure.obj (.ebss:_lev_count)
0000dfcc 00000005 kanal.obj (.ebss:_readr)
0000dfd1 00000003 log_to_mem.obj (.ebss:_ump_can_data)
0000dfd4 00000003 main.obj (.ebss)
0000dfd7 00000002 main.obj (.ebss:_cancount$1)
0000dfd9 00000002 ADC.obj (.ebss:_cwnt_ok$4)
0000dfdb 00000002 measure.obj (.ebss:_low_count)
0000dfdd 00000002 log_to_mem.obj (.ebss:_ump_pm67_voltage)
.logg 1 00200000 0000fa00 UNINITIALIZED
00200000 0000fa00 log_to_mem.obj (.logg)
@@ -445,7 +456,7 @@ MODULE SUMMARY
Module code initialized data uninitialized data
------ ---- ---------------- ------------------
C:\Dima\Project\Balsam_167\Debug\Source\External\v120\DSP2833x_common\source\
K:\git_project\Balsam_167_periph\Debug\Source\External\v120\DSP2833x_common\source\
DSP2833x_SWPrioritizedDefaultIsr.obj 1809 0 0
DSP2833x_SysCtrl.obj 349 0 6
DSP2833x_SWPrioritizedPieVect.obj 14 256 0
@@ -458,33 +469,34 @@ MODULE SUMMARY
+--+--------------------------------------+-------+------------------+--------------------+
Total: 2610 256 30
C:\Dima\Project\Balsam_167\Debug\Source\External\v120\DSP2833x_headers\source\
K:\git_project\Balsam_167_periph\Debug\Source\External\v120\DSP2833x_headers\source\
DSP2833x_GlobalVariableDefs.obj 0 0 2679
+--+--------------------------------------+-------+------------------+--------------------+
Total: 0 0 2679
C:\Dima\Project\Balsam_167\Debug\Source\Internal\
log_to_mem.obj 21 12 64012
measure.obj 2729 87 1212
K:\git_project\Balsam_167_periph\Debug\Source\Internal\
log_to_mem.obj 895 52 64045
measure.obj 2731 87 1212
RS485.obj 1233 8 1866
message.obj 633 82 322
message.obj 805 82 322
peripher.obj 963 32 16
ADC.obj 905 13 74
ecan.obj 622 28 148
shared_ump.obj 777 18 0
spise2p.obj 660 71 28
bios.obj 703 4 1
crc16.obj 117 259 256
main.obj 589 8 7
ecan.obj 430 28 14
DAC.obj 394 16 14
kanal.obj 364 27 21
pulto.obj 366 17 10
DAC.obj 355 16 14
tools.obj 79 0 0
filter_bat2.obj 55 0 0
cntrl_adr.obj 5 11 4
+--+--------------------------------------+-------+------------------+--------------------+
Total: 10207 675 67857
Total: 12263 733 68024
C:/Dima/Project/Balsam_167/Libraries/rts2800_fpu32.lib
K:/git_project/Balsam_167_periph/Libraries/rts2800_fpu32.lib
fs_div.obj 136 0 0
boot.obj 70 0 0
l_div.obj 42 0 0
@@ -492,13 +504,14 @@ MODULE SUMMARY
sqrt.obj 32 0 0
args_main.obj 27 0 0
_lock.obj 9 10 4
u_div.obj 11 0 0
errno.obj 0 4 1
+--+--------------------------------------+-------+------------------+--------------------+
Total: 341 24 9
Total: 352 24 9
Stack: 0 0 1008
+--+--------------------------------------+-------+------------------+--------------------+
Grand Total: 13158 955 71583
Grand Total: 15225 1013 71750
GLOBAL DATA SYMBOLS: SORTED BY DATA PAGE
@@ -593,11 +606,11 @@ address data page name
00007900 1e4 (00007900) _I2caRegs
0000c000 300 (0000c000) _PieVectTableInit
0000c28c 30a (0000c280) _PieVectTableInit
0000c10f 304 (0000c100) _ADDR_ANSWER
0000c110 304 (0000c100) _ADDR_TERMINAL
0000c111 304 (0000c100) _CNTRL_ADDR_UNIVERSAL
0000c3ae 30e (0000c380) _ADDR_ANSWER
0000c3af 30e (0000c380) _ADDR_TERMINAL
0000c3b0 30e (0000c380) _CNTRL_ADDR_UNIVERSAL
0000d040 341 (0000d040) _rs_a
@@ -648,85 +661,92 @@ address data page name
0000dc80 372 (0000dc80) _param
0000dd01 374 (0000dd00) _din_count
0000dd21 374 (0000dd00) _ADC_table
0000dd01 374 (0000dd00) _errno
0000dd02 374 (0000dd00) _no_write
0000dd03 374 (0000dd00) _never_write
0000dd04 374 (0000dd00) _flog
0000dd18 374 (0000dd00) _ump_dac_ramp
0000dd19 374 (0000dd00) _ump_dac_duration
0000dd1a 374 (0000dd00) _ump_dac_go10
0000dd1b 374 (0000dd00) _ump_dac_stop10
0000dd1c 374 (0000dd00) _ump_dac_position
0000dd22 374 (0000dd00) _Log
0000dd2a 374 (0000dd00) _powK
0000dd3c 374 (0000dd00) _ADDR_FOR_ALL
0000dd3d 374 (0000dd00) _CNTRL_ADDR
0000dd3e 374 (0000dd00) _cntr_addr_c
0000dd3f 374 (0000dd00) _cntr_addr_c_all
0000dd40 375 (0000dd40) _zer_filter
0000ddbc 376 (0000dd80) __unlock
0000ddbe 376 (0000dd80) __lock
0000dd88 376 (0000dd80) _prev_ok
0000dda4 376 (0000dd80) _ccc
0000ddc0 377 (0000ddc0) _zer_filter
0000ddc0 377 (0000ddc0) _RS_Len
0000de08 378 (0000de00) _din_count
0000de28 378 (0000de00) _CpuTimer0
0000de30 378 (0000de00) _CpuTimer1
0000de38 378 (0000de00) _CpuTimer2
0000de06 378 (0000de00) _CpuTimer0
0000de0e 378 (0000de00) _CpuTimer1
0000de16 378 (0000de00) _CpuTimer2
0000de1e 378 (0000de00) _sens_pair
0000de36 378 (0000de00) _isNumb
0000de37 378 (0000de00) _quaLamp
0000de3c 378 (0000de00) _isMask
0000de3e 378 (0000de00) _Lonely
0000de40 379 (0000de40) _RS_Len
0000de40 379 (0000de40) _def_cal
0000de86 37a (0000de80) _ADC_table
0000dea2 37a (0000de80) _prev_ok
0000de80 37a (0000de80) _sens_type
0000de98 37a (0000de80) _powK
0000deaa 37a (0000de80) _Mode
0000deab 37a (0000de80) _Desk
0000deac 37a (0000de80) _TermoAD
0000dead 37a (0000de80) _TermoRS
0000deae 37a (0000de80) _TermoSW
0000deaf 37a (0000de80) _Kurrent
0000deb0 37a (0000de80) _Kalibro
0000deb1 37a (0000de80) _Owen
0000deb2 37a (0000de80) _INcount0
0000deb3 37a (0000de80) _INcount1
0000deb4 37a (0000de80) _MUX_GPIO32
0000deb5 37a (0000de80) _MUX_GPIO48
0000deb6 37a (0000de80) _DIR_GPIO32
0000deb7 37a (0000de80) _DIR_GPIO48
0000deb8 37a (0000de80) _DigErr
0000deba 37a (0000de80) _err_count
0000dec0 37b (0000dec0) _def_cal
0000dec0 37b (0000dec0) _period_dac
0000dec1 37b (0000dec0) _time_dac
0000dec6 37b (0000dec0) _WAKEpowse
0000dec8 37b (0000dec0) _IMPowse
0000dece 37b (0000dec0) _CanTimeOutErrorTR
0000decf 37b (0000dec0) _wait
0000ded0 37b (0000dec0) _ErrorCount
0000ded2 37b (0000dec0) _MessageReceivedCount
0000ded4 37b (0000dec0) _MessageTransivedCount
0000ded6 37b (0000dec0) _TestMbox1
0000ded8 37b (0000dec0) _TestMbox2
0000deda 37b (0000dec0) _TestMbox3
0000dedc 37b (0000dec0) _COUNT_ONE_CANAL
0000dedd 37b (0000dec0) _COUNT_DISCHARGE
0000dede 37b (0000dec0) _COUNT_TRANSICIA
0000dedf 37b (0000dec0) _FILTER_CLIP
0000dee4 37b (0000dec0) _WAKE
0000dee6 37b (0000dec0) _WAKE_TIME
0000dee8 37b (0000dec0) _lev_quadr
0000def4 37b (0000dec0) _no_write
0000def5 37b (0000dec0) _never_write
0000def6 37b (0000dec0) _flog
0000def8 37b (0000dec0) _Log
0000df00 37c (0000df00) _ccc
0000df1c 37c (0000df00) _sens_pair
0000df34 37c (0000df00) _COUNT_ONE_CANAL
0000df35 37c (0000df00) _COUNT_DISCHARGE
0000df36 37c (0000df00) _COUNT_TRANSICIA
0000df37 37c (0000df00) _FILTER_CLIP
0000df3c 37c (0000df00) _WAKE
0000df3e 37c (0000df00) _WAKE_TIME
0000df00 37c (0000df00) _ext_diag
0000df08 37c (0000df00) _ext_temp
0000df10 37c (0000df00) _zer_count
0000df18 37c (0000df00) _lev_count
0000df1e 37c (0000df00) _readr
0000df23 37c (0000df00) _ADDR_FOR_ALL
0000df24 37c (0000df00) _CNTRL_ADDR
0000df25 37c (0000df00) _cntr_addr_c
0000df26 37c (0000df00) _cntr_addr_c_all
0000df27 37c (0000df00) _errno
0000df28 37c (0000df00) __unlock
0000df2a 37c (0000df00) __lock
0000df2c 37c (0000df00) __cleanup_ptr
0000df2e 37c (0000df00) __dtors_ptr
0000df36 37c (0000df00) _low_count
0000df40 37d (0000df40) _sens_type
0000df58 37d (0000df40) _CanTimeOutErrorTR
0000df59 37d (0000df40) _wait
0000df62 37d (0000df40) _ErrorCount
0000df64 37d (0000df40) _MessageReceivedCount
0000df66 37d (0000df40) _MessageTransivedCount
0000df68 37d (0000df40) _TestMbox1
0000df6a 37d (0000df40) _TestMbox2
0000df6c 37d (0000df40) _TestMbox3
0000df70 37d (0000df40) _Mode
0000df71 37d (0000df40) _Desk
0000df72 37d (0000df40) _TermoAD
0000df73 37d (0000df40) _TermoRS
0000df74 37d (0000df40) _TermoSW
0000df75 37d (0000df40) _Kurrent
0000df76 37d (0000df40) _Kalibro
0000df77 37d (0000df40) _Owen
0000df78 37d (0000df40) _INcount0
0000df79 37d (0000df40) _INcount1
0000df7a 37d (0000df40) _MUX_GPIO32
0000df7b 37d (0000df40) _MUX_GPIO48
0000df7c 37d (0000df40) _DIR_GPIO32
0000df7d 37d (0000df40) _DIR_GPIO48
0000df7e 37d (0000df40) _DigErr
0000df80 37e (0000df80) _period_dac
0000df81 37e (0000df80) _time_dac
0000df86 37e (0000df80) _WAKEpowse
0000df88 37e (0000df80) _IMPowse
0000df8e 37e (0000df80) _lev_quadr
0000df9a 37e (0000df80) _isNumb
0000df9b 37e (0000df80) _quaLamp
0000dfa0 37e (0000df80) _isMask
0000dfa2 37e (0000df80) _Lonely
0000dfa4 37e (0000df80) _ext_diag
0000dfac 37e (0000df80) _ext_temp
0000dfb4 37e (0000df80) _zer_count
0000dfbc 37e (0000df80) __cleanup_ptr
0000dfbe 37e (0000df80) __dtors_ptr
0000dfc0 37f (0000dfc0) _err_count
0000dfc6 37f (0000dfc0) _lev_count
0000dfcc 37f (0000dfc0) _readr
0000dfdb 37f (0000dfc0) _low_count
00200000 8000 (00200000) _logs_block
@@ -740,63 +760,65 @@ GLOBAL SYMBOLS: SORTED ALPHABETICALLY BY Name
page address name
---- ------- ----
0 00008000 .text
0 0000b311 C$$EXIT
0 0000af79 FS$$DIV
0 0000b24e L$$DIV
0 0000b25d L$$MOD
0 0000b26b UL$$DIV
0 0000b272 UL$$MOD
0 0000bb2f C$$EXIT
0 0000b796 FS$$DIV
0 0000ba6b L$$DIV
0 0000ba7a L$$MOD
0 0000bb56 U$$DIV
0 0000bb5b U$$MOD
0 0000ba88 UL$$DIV
0 0000ba8f UL$$MOD
0 00008fdc _ADCINT_ISR
0 00380080 _ADC_cal
1 0000dd21 _ADC_table
0 0000c10f _ADDR_ANSWER
1 0000df23 _ADDR_FOR_ALL
0 0000c110 _ADDR_TERMINAL
1 0000de86 _ADC_table
0 0000c3ae _ADDR_ANSWER
1 0000dd3c _ADDR_FOR_ALL
0 0000c3af _ADDR_TERMINAL
1 00000b00 _AdcMirror
1 00007100 _AdcRegs
0 0000a858 _Anal_output
0 00009805 _Answer
0 0000ad0d _CAN_send
0 0000b0a1 _CANa_handler
0 0000b076 _CANa_reset_err
1 0000df24 _CNTRL_ADDR
0 0000c111 _CNTRL_ADDR_UNIVERSAL
1 0000dedd _COUNT_DISCHARGE
1 0000dedc _COUNT_ONE_CANAL
1 0000dede _COUNT_TRANSICIA
0 0000b01b _Anal_output
0 0000a1b2 _Answer
0 0000aa38 _CAN_send
0 0000b8be _CANa_handler
0 0000b893 _CANa_reset_err
1 0000dd3d _CNTRL_ADDR
0 0000c3b0 _CNTRL_ADDR_UNIVERSAL
1 0000df35 _COUNT_DISCHARGE
1 0000df34 _COUNT_ONE_CANAL
1 0000df36 _COUNT_TRANSICIA
1 0000dc51 _Caliber_time
1 0000dc43 _CanGO
1 0000dc42 _CanPowse
1 0000dece _CanTimeOutErrorTR
0 0000b12a _ConfigCpuTimer
1 0000de06 _CpuTimer0
1 0000df58 _CanTimeOutErrorTR
0 0000b947 _ConfigCpuTimer
1 0000de28 _CpuTimer0
1 00000c00 _CpuTimer0Regs
1 0000de0e _CpuTimer1
1 0000de30 _CpuTimer1
1 00000c08 _CpuTimer1Regs
1 0000de16 _CpuTimer2
1 0000de38 _CpuTimer2
1 00000c10 _CpuTimer2Regs
1 0033fff8 _CsmPwl
1 00000ae0 _CsmRegs
0 0000aaa0 _CsmUnlock
0 0000b3f6 _CsmUnlock
1 0000dc52 _Curr_Edge
0 00008656 _Current_count
0 00008fcf _DATALOG_ISR
0 0000a6af _DCLK
0 0000b168 _DCLK
0 00008fb4 _DINTCH1_ISR
0 00008f99 _DINTCH2_ISR
0 00008f7e _DINTCH3_ISR
0 00008f63 _DINTCH4_ISR
0 00008f48 _DINTCH5_ISR
0 00008f2d _DINTCH6_ISR
1 0000deb6 _DIR_GPIO32
1 0000deb7 _DIR_GPIO48
0 0000a6a3 _DOUT
0 0000b35b _DSP28x_usDelay
0 00009b4e _Default_params
1 0000deab _Desk
1 0000df7c _DIR_GPIO32
1 0000df7d _DIR_GPIO48
0 0000b15c _DOUT
0 0000bb6f _DSP28x_usDelay
0 00009cba _Default_params
1 0000df71 _Desk
1 00000880 _DevEmuRegs
1 0000deb8 _DigErr
0 0000a988 _DisableDog
1 0000df7e _DigErr
0 0000b2de _DisableDog
1 00001000 _DmaRegs
0 00008f12 _ECAN0INTA_ISR
0 00008ef7 _ECAN0INTB_ISR
@@ -847,38 +869,38 @@ page address name
0 00008c9a _EQEP2_INT_ISR
1 00006b00 _EQep1Regs
1 00006b40 _EQep2Regs
0 0000b297 _EnableInterrupts
1 0000ded0 _ErrorCount
1 0000dedf _FILTER_CLIP
0 0000bab4 _EnableInterrupts
1 0000df62 _ErrorCount
1 0000df37 _FILTER_CLIP
1 00000a80 _FlashRegs
1 00006f80 _GpioCtrlRegs
1 00006fc0 _GpioDataRegs
1 00006fe0 _GpioIntRegs
1 0000dc7e _HSPCLK
0 0000accc _Handlai
0 0000a9d9 _Handlai
0 00008c7f _I2CINT1A_ISR
0 00008c64 _I2CINT2A_ISR
1 00007900 _I2caRegs
0 00008c59 _ILLEGAL_ISR
1 0000dec8 _IMPowse
1 0000df88 _IMPowse
0 00008c4c _INT13_ISR
0 00008c3f _INT14_ISR
0 00008c35 _INT_NOTUSED_ISR
1 0000deb2 _INcount0
1 0000deb3 _INcount1
0 0000b2f8 _InitAdc
0 0000ac20 _InitCan
0 0000b0eb _InitCpuTimers
0 0000aa12 _InitPeripheralClocks
0 0000b278 _InitPieCtrl
0 0000b33f _InitPieVectTable
0 0000a990 _InitPll
0 00009ee1 _InitSeeprom
0 0000aa97 _InitSysCtrl
0 0000af16 _InitXintf
0 0000ae6d _InitXintf16Gpio
0 0000aec6 _InitXintf32Gpio
0 0000a8a1 _Init_DAC
1 0000df78 _INcount0
1 0000df79 _INcount1
0 0000bb16 _InitAdc
0 0000a920 _InitCan
0 0000b908 _InitCpuTimers
0 0000b368 _InitPeripheralClocks
0 0000ba95 _InitPieCtrl
0 0000bb48 _InitPieVectTable
0 0000b2e6 _InitPll
0 0000a615 _InitSeeprom
0 0000b3ed _InitSysCtrl
0 0000b733 _InitXintf
0 0000b68a _InitXintf16Gpio
0 0000b6e3 _InitXintf32Gpio
0 0000b064 _Init_DAC
0 000085ae _Init_packMask
0 00008438 _Init_sensors
0 000083d8 _Init_sensors_more
@@ -886,43 +908,43 @@ page address name
1 0000dc60 _K_50
1 0000dc62 _K_T1
1 0000dc64 _K_T2
1 0000deb0 _Kalibro
1 0000deaf _Kurrent
1 0000df76 _Kalibro
1 0000df75 _Kurrent
1 0000dc7c _LSPCLK
0 00008c1a _LUF_ISR
0 00008bff _LVF_ISR
0 00009c6a _Load_params
0 0000a8bd _Load_runner
1 0000def8 _Log
1 0000de3e _Lonely
0 00009dd6 _Load_params
0 0000b080 _Load_runner
1 0000dd22 _Log
1 0000dfa2 _Lonely
0 00008be4 _MRINTA_ISR
0 00008bc9 _MRINTB_ISR
1 0000deb4 _MUX_GPIO32
1 0000deb5 _MUX_GPIO48
1 0000df7a _MUX_GPIO32
1 0000df7b _MUX_GPIO48
0 00008bae _MXINTA_ISR
0 00008b93 _MXINTB_ISR
1 0000d8f0 _Maska
1 00005000 _McbspaRegs
1 00005040 _McbspbRegs
1 0000ded2 _MessageReceivedCount
1 0000ded4 _MessageTransivedCount
1 0000deaa _Mode
1 0000df64 _MessageReceivedCount
1 0000df66 _MessageTransivedCount
1 0000df70 _Mode
0 00008b88 _NMI_ISR
1 0000deb1 _Owen
1 0000df77 _Owen
0 00008b7e _PIE_RESERVED
1 00380090 _PartIdRegs
1 00000ce0 _PieCtrlRegs
1 00000d00 _PieVectTable
0 0000c000 _PieVectTableInit
0 0000c28c _PieVectTableInit
0 000082ee _Power_count
1 0000dc44 _READY
0 0000a6cd _RESET
0 0000ae28 _RSA_RX_Handler
0 0000ade3 _RSA_TX_Handler
0 0000ad9e _RSB_RX_Handler
0 0000ad59 _RSB_TX_Handler
0 0000b186 _RESET
0 0000b645 _RSA_RX_Handler
0 0000b600 _RSA_TX_Handler
0 0000b5bb _RSB_RX_Handler
0 0000b576 _RSB_TX_Handler
0 00009746 _RS_BSend
1 0000ddc0 _RS_Len
1 0000de40 _RS_Len
0 000095fc _RS_RX_Handler
0 000095a4 _RS_Send
0 0000944f _RS_SetBitMode
@@ -933,45 +955,46 @@ page address name
0 0000c000 _RamfuncsLoadEnd
0 0000c000 _RamfuncsLoadStart
0 0000c000 _RamfuncsRunStart
0 00009b24 _ReceiveAnswerModbus4
0 00009aaf _ReceiveCommandModbus3
0 00009a87 _ReceiveCommandModbus6
0 00009c90 _ReceiveAnswerModbus4
0 00009c05 _ReceiveCommandModbus3
0 00009bc7 _ReceiveCommandModbus6
0 00008b56 _SCIRXINTA_ISR
0 00008b3b _SCIRXINTB_ISR
0 00008b20 _SCIRXINTC_ISR
0 00008b05 _SCITXINTA_ISR
0 00008aea _SCITXINTB_ISR
0 00008acf _SCITXINTC_ISR
0 0000a6bb _SENDBIT
0 0000b174 _SENDBIT
0 00008ab4 _SEQ1INT_ISR
0 00008a99 _SEQ2INT_ISR
0 00008a7e _SPIRXINTA_ISR
0 00009cbe _SPISE2P_DRV_csclr
0 00009cc3 _SPISE2P_DRV_csset
0 00009cc8 _SPISE2P_DRV_init
0 00009cfa _SPISE2P_DRV_tick
0 0000a3f2 _SPISE2P_DRV_csclr
0 0000a3f7 _SPISE2P_DRV_csset
0 0000a3fc _SPISE2P_DRV_init
0 0000a42e _SPISE2P_DRV_tick
0 00008a63 _SPITXINTA_ISR
1 0000dc7a _SYSCLKOUT
0 00009a5e _Save_params
0 00009b1e _Save_params
1 00007050 _SciaRegs
1 00007750 _ScibRegs
1 00007770 _ScicRegs
0 00009e9e _Seeprom_read
0 00009e5b _Seeprom_write
0 00009a36 _SendCommandModbus4
0 0000a972 _ServiceDog
0 0000a84e _Setup_DAC_time
0 0000a5d2 _Seeprom_read
0 0000a58f _Seeprom_write
0 00009af6 _SendCommandModbus4
0 0000b2c8 _ServiceDog
0 0000b011 _Setup_DAC_time
1 00007040 _SpiaRegs
1 00007010 _SysCtrlRegs
0 00008a48 _TINT0_ISR
1 0000dc45 _TPL_CANS
0 00008111 _Temper_count
1 0000deac _TermoAD
1 0000dead _TermoRS
1 0000deae _TermoSW
1 0000ded6 _TestMbox1
1 0000ded8 _TestMbox2
1 0000deda _TestMbox3
1 0000df72 _TermoAD
1 0000df73 _TermoRS
1 0000df74 _TermoSW
1 0000df68 _TestMbox1
1 0000df6a _TestMbox2
1 0000df6c _TestMbox3
0 0000a88b _UMP_CAN_service
0 00008a3d _USER10_ISR
0 00008a32 _USER11_ISR
0 00008a27 _USER12_ISR
@@ -984,10 +1007,10 @@ page address name
0 000089da _USER7_ISR
0 000089cf _USER8_ISR
0 000089c4 _USER9_ISR
1 0000dee4 _WAKE
1 0000df3c _WAKE
0 000089a9 _WAKEINT_ISR
1 0000dee6 _WAKE_TIME
1 0000dec6 _WAKEpowse
1 0000df3e _WAKE_TIME
1 0000df86 _WAKEpowse
0 00008990 _XINT1_ISR
0 00008977 _XINT2_ISR
0 0000895c _XINT3_ISR
@@ -1004,131 +1027,156 @@ abs ffffffff ___TI_prof_data_size
abs ffffffff ___TI_prof_data_start
abs ffffffff ___binit__
abs ffffffff ___c_args__
0 0000b35f ___cinit__
0 0000b35f ___etext__
0 0000c000 ___cinit__
0 0000bb73 ___etext__
abs ffffffff ___pinit__
0 00008000 ___text__
0 0000b2dd __args_main
1 0000df2c __cleanup_ptr
1 0000df2e __dtors_ptr
1 0000df2a __lock
0 0000b355 __nop
0 0000b351 __register_lock
0 0000b34d __register_unlock
0 0000bafb __args_main
1 0000dfbc __cleanup_ptr
1 0000dfbe __dtors_ptr
1 0000ddbe __lock
0 0000bb69 __nop
0 0000bb65 __register_lock
0 0000bb61 __register_unlock
1 00000400 __stack
1 0000df28 __unlock
0 0000b311 _abort
1 0000ddbc __unlock
0 0000bb2f _abort
1 0000d740 _adc_filter
0 0000a157 _adc_isr
0 0000aa84 _adc_isr
1 0000d73c _adc_table_lem
0 0000b198 _c_int00
0 0000b9b5 _c_int00
1 0000dc47 _cal_addr
0 00008053 _calc_sensor_koef
1 0000dda4 _ccc
1 0000df00 _ccc
1 0000dc4b _chk
0 0000b32a _clear_mem
0 00009ae1 _clear_mem
0 00009526 _clear_timer_rs_live
1 0000df25 _cntr_addr_c
1 0000df26 _cntr_addr_c_all
0 0000aacf _cpu_timer1_isr_PULT
0 0000a34a _cpu_timer1_isr_SENS
0 0000b1de _cpu_timer2_isr
1 0000dd3e _cntr_addr_c
1 0000dd3f _cntr_addr_c_all
0 0000b425 _cpu_timer1_isr_PULT
0 0000ac77 _cpu_timer1_isr_SENS
0 0000b9fb _cpu_timer2_isr
1 0000dac0 _crc_16_tab
0 0000951a _create_uart_vars
0 0000a814 _dOUT
0 0000a820 _dSEND
0 0000afd7 _dOUT
0 0000afe3 _dSEND
1 0000dc68 _def_FILTERBAT
1 0000de40 _def_cal
1 0000dec0 _def_cal
1 0000dab0 _digits
1 0000dd01 _din_count
1 0000de08 _din_count
0 0000803e _er_anal
1 0000deba _err_count
1 0000df27 _errno
0 0000b313 _exit
1 0000df00 _ext_diag
1 0000df08 _ext_temp
0 000099c6 _extendbios
0 0000b217 _filterbat
1 0000dfc0 _err_count
1 0000dd01 _errno
0 0000bb31 _exit
1 0000dfa4 _ext_diag
1 0000dfac _ext_temp
0 0000a373 _extendbios
0 0000ba34 _filterbat
1 0000dc41 _flag_DEBUG
1 0000def6 _flog
1 0000dd04 _flog
0 0000921c _get_Buttons
0 000090ff _get_Mode
0 0000996e _get_command
0 0000b03c _get_crc16
0 0000b02b _get_crc_16
0 0000b001 _get_crc_16b
0 0000a31b _get_command
0 0000b859 _get_crc16
0 0000b848 _get_crc_16
0 0000b81e _get_crc_16b
0 00008022 _im_calc
0 0000996d _init
0 0000b15a _init_zone7
0 0000992a _initload
1 0000de3c _isMask
1 0000de36 _isNumb
0 0000a6e0 _kanal_Send
1 0000df18 _lev_count
1 0000dee8 _lev_quadr
0 000098e2 _load
0 0000a31a _init
0 0000b977 _init_zone7
0 0000a2d7 _initload
1 0000dfa0 _isMask
1 0000df9a _isNumb
0 0000b199 _kanal_Send
1 0000dfc6 _lev_count
1 0000df8e _lev_quadr
0 0000a28f _load
1 00200000 _logs_block
1 0000df36 _low_count
0 00009f37 _main
1 0000dfdb _low_count
0 0000a66b _main
1 0000dbc0 _modbus
1 0000def5 _never_write
1 0000def4 _no_write
1 0000dd03 _never_write
1 0000dd02 _no_write
1 0000dc53 _okay
1 0000d900 _out_filter
1 0000dc80 _param
0 0000b149 _pause_us
0 00009869 _peek
0 0000b966 _pause_us
0 0000a216 _peek
1 0000dc4a _period_blink
1 0000dec0 _period_dac
1 0000df80 _period_dac
1 0000dc49 _period_ready
0 0000982d _poke
1 0000de98 _powK
0 0000a1da _poke
1 0000dd2a _powK
1 0000dc48 _pow_addr
1 0000dd88 _prev_ok
1 0000de37 _quaLamp
0 00009802 _read_memory
1 0000df1e _readr
1 0000dea2 _prev_ok
1 0000df9b _quaLamp
0 0000a1af _read_memory
1 0000dfcc _readr
0 00008000 _reset_errs
1 0000d040 _rs_a
1 0000d3c0 _rs_b
0 000088e6 _rsvd_ISR
0 00009801 _run
0 0000a1ae _run
0 000090db _select_tpl_255
0 0000904b _select_tpl_canal
1 0000d704 _sens_count
1 0000de1e _sens_pair
1 0000de80 _sens_type
0 0000b356 _set_cntrl_addr
0 0000a50d _setup_adc
1 0000df1c _sens_pair
1 0000df40 _sens_type
0 0000bb6a _set_cntrl_addr
0 0000ae3c _setup_adc
0 000093e8 _setup_arr_cmd_length
0 00009029 _setup_leds_line
0 00009469 _setup_uart
1 0000dc4c _sig
0 00009cb7 _spiSe2pFree
0 00009cb3 _spiSe2pRead
0 00009caf _spiSe2pWrite
0 0000b2a0 _sqrt
0 0000a3eb _spiSe2pFree
0 0000a3e7 _spiSe2pRead
0 0000a3e3 _spiSe2pWrite
0 0000babe _sqrt
0 000093ba _test_rs_live
0 00009800 _tflash
0 0000a1ad _tflash
1 0000dc4d _time_1_5sec
1 0000dc4f _time_3sec
1 0000dc4e _time_5msec
1 0000dc50 _time_5sec
1 0000dec1 _time_dac
0 00009f0a _timer_Init
1 0000df81 _time_dac
0 0000a63e _timer_Init
1 0000dc46 _tpl_cans
0 00009ff0 _ump_can_fragment
0 0000a110 _ump_can_id
0 0000a0c8 _ump_can_request
0 00009ec3 _ump_crc
1 0000dd19 _ump_dac_duration
1 0000dd1a _ump_dac_go10
1 0000dd1c _ump_dac_position
1 0000dd18 _ump_dac_ramp
1 0000dd1b _ump_dac_stop10
0 00009a92 _ump_log_can
0 00009a5e _ump_log_init
0 00009a30 _ump_log_io
0 00009982 _ump_log_read
0 00009944 _ump_log_rs
0 00009920 _ump_log_tick
0 000098a5 _ump_log_write
0 00009e70 _ump_prepare
0 0000a083 _ump_rtu
0 00009ede _ump_rtu_encode
0 00009f69 _ump_rtu_response
0 0000a063 _ump_tms28335_capture
0 0000a028 _ump_tms28335_fragment
0 00009fd3 _ump_tms28335_prepare
0 00009fb2 _ump_tms28335_rtu
0 00009e1e _ump_validate
0 00008ff7 _unsetup_leds_line
0 0000977b _upload
1 0000decf _wait
0 0000a80f _wast
0 0000b2c0 _what_is
0 00009778 _write_memory
0 00009777 _xflash
1 0000df10 _zer_count
1 0000dd40 _zer_filter
0 0000a128 _upload
1 0000df59 _wait
0 0000afd2 _wast
0 0000bade _what_is
0 0000a125 _write_memory
0 0000a124 _xflash
1 0000dfb4 _zer_count
1 0000ddc0 _zer_filter
abs ffffffff binit
0 0000b35f cinit
0 0000b35f etext
0 0000c000 cinit
0 0000bb73 etext
abs ffffffff pinit
@@ -1246,115 +1294,138 @@ page address name
0 000095a4 _RS_Send
0 000095fc _RS_RX_Handler
0 00009746 _RS_BSend
0 00009777 _xflash
0 00009778 _write_memory
0 0000977b _upload
0 00009800 _tflash
0 00009801 _run
0 00009802 _read_memory
0 00009805 _Answer
0 0000982d _poke
0 00009869 _peek
0 000098e2 _load
0 0000992a _initload
0 0000996d _init
0 0000996e _get_command
0 000099c6 _extendbios
0 00009a36 _SendCommandModbus4
0 00009a5e _Save_params
0 00009a87 _ReceiveCommandModbus6
0 00009aaf _ReceiveCommandModbus3
0 00009b24 _ReceiveAnswerModbus4
0 00009b4e _Default_params
0 00009c6a _Load_params
0 00009caf _spiSe2pWrite
0 00009cb3 _spiSe2pRead
0 00009cb7 _spiSe2pFree
0 00009cbe _SPISE2P_DRV_csclr
0 00009cc3 _SPISE2P_DRV_csset
0 00009cc8 _SPISE2P_DRV_init
0 00009cfa _SPISE2P_DRV_tick
0 00009e5b _Seeprom_write
0 00009e9e _Seeprom_read
0 00009ee1 _InitSeeprom
0 00009f0a _timer_Init
0 00009f37 _main
0 0000a157 _adc_isr
0 0000a34a _cpu_timer1_isr_SENS
0 0000a50d _setup_adc
0 0000a6a3 _DOUT
0 0000a6af _DCLK
0 0000a6bb _SENDBIT
0 0000a6cd _RESET
0 0000a6e0 _kanal_Send
0 0000a80f _wast
0 0000a814 _dOUT
0 0000a820 _dSEND
0 0000a84e _Setup_DAC_time
0 0000a858 _Anal_output
0 0000a8a1 _Init_DAC
0 0000a8bd _Load_runner
0 0000a972 _ServiceDog
0 0000a988 _DisableDog
0 0000a990 _InitPll
0 0000aa12 _InitPeripheralClocks
0 0000aa97 _InitSysCtrl
0 0000aaa0 _CsmUnlock
0 0000aacf _cpu_timer1_isr_PULT
0 0000ac20 _InitCan
0 0000accc _Handlai
0 0000ad0d _CAN_send
0 0000ad59 _RSB_TX_Handler
0 0000ad9e _RSB_RX_Handler
0 0000ade3 _RSA_TX_Handler
0 0000ae28 _RSA_RX_Handler
0 0000ae6d _InitXintf16Gpio
0 0000aec6 _InitXintf32Gpio
0 0000af16 _InitXintf
0 0000af79 FS$$DIV
0 0000b001 _get_crc_16b
0 0000b02b _get_crc_16
0 0000b03c _get_crc16
0 0000b076 _CANa_reset_err
0 0000b0a1 _CANa_handler
0 0000b0eb _InitCpuTimers
0 0000b12a _ConfigCpuTimer
0 0000b149 _pause_us
0 0000b15a _init_zone7
0 0000b198 _c_int00
0 0000b1de _cpu_timer2_isr
0 0000b217 _filterbat
0 0000b24e L$$DIV
0 0000b25d L$$MOD
0 0000b26b UL$$DIV
0 0000b272 UL$$MOD
0 0000b278 _InitPieCtrl
0 0000b297 _EnableInterrupts
0 0000b2a0 _sqrt
0 0000b2c0 _what_is
0 0000b2dd __args_main
0 0000b2f8 _InitAdc
0 0000b311 C$$EXIT
0 0000b311 _abort
0 0000b313 _exit
0 0000b32a _clear_mem
0 0000b33f _InitPieVectTable
0 0000b34d __register_unlock
0 0000b351 __register_lock
0 0000b355 __nop
0 0000b356 _set_cntrl_addr
0 0000b35b _DSP28x_usDelay
0 0000b35f ___cinit__
0 0000b35f ___etext__
0 0000b35f cinit
0 0000b35f etext
0 0000c000 _PieVectTableInit
0 000098a5 _ump_log_write
0 00009920 _ump_log_tick
0 00009944 _ump_log_rs
0 00009982 _ump_log_read
0 00009a30 _ump_log_io
0 00009a5e _ump_log_init
0 00009a92 _ump_log_can
0 00009ae1 _clear_mem
0 00009af6 _SendCommandModbus4
0 00009b1e _Save_params
0 00009bc7 _ReceiveCommandModbus6
0 00009c05 _ReceiveCommandModbus3
0 00009c90 _ReceiveAnswerModbus4
0 00009cba _Default_params
0 00009dd6 _Load_params
0 00009e1e _ump_validate
0 00009e70 _ump_prepare
0 00009ec3 _ump_crc
0 00009ede _ump_rtu_encode
0 00009f69 _ump_rtu_response
0 00009fb2 _ump_tms28335_rtu
0 00009fd3 _ump_tms28335_prepare
0 00009ff0 _ump_can_fragment
0 0000a028 _ump_tms28335_fragment
0 0000a063 _ump_tms28335_capture
0 0000a083 _ump_rtu
0 0000a0c8 _ump_can_request
0 0000a110 _ump_can_id
0 0000a124 _xflash
0 0000a125 _write_memory
0 0000a128 _upload
0 0000a1ad _tflash
0 0000a1ae _run
0 0000a1af _read_memory
0 0000a1b2 _Answer
0 0000a1da _poke
0 0000a216 _peek
0 0000a28f _load
0 0000a2d7 _initload
0 0000a31a _init
0 0000a31b _get_command
0 0000a373 _extendbios
0 0000a3e3 _spiSe2pWrite
0 0000a3e7 _spiSe2pRead
0 0000a3eb _spiSe2pFree
0 0000a3f2 _SPISE2P_DRV_csclr
0 0000a3f7 _SPISE2P_DRV_csset
0 0000a3fc _SPISE2P_DRV_init
0 0000a42e _SPISE2P_DRV_tick
0 0000a58f _Seeprom_write
0 0000a5d2 _Seeprom_read
0 0000a615 _InitSeeprom
0 0000a63e _timer_Init
0 0000a66b _main
0 0000a88b _UMP_CAN_service
0 0000a920 _InitCan
0 0000a9d9 _Handlai
0 0000aa38 _CAN_send
0 0000aa84 _adc_isr
0 0000ac77 _cpu_timer1_isr_SENS
0 0000ae3c _setup_adc
0 0000afd2 _wast
0 0000afd7 _dOUT
0 0000afe3 _dSEND
0 0000b011 _Setup_DAC_time
0 0000b01b _Anal_output
0 0000b064 _Init_DAC
0 0000b080 _Load_runner
0 0000b15c _DOUT
0 0000b168 _DCLK
0 0000b174 _SENDBIT
0 0000b186 _RESET
0 0000b199 _kanal_Send
0 0000b2c8 _ServiceDog
0 0000b2de _DisableDog
0 0000b2e6 _InitPll
0 0000b368 _InitPeripheralClocks
0 0000b3ed _InitSysCtrl
0 0000b3f6 _CsmUnlock
0 0000b425 _cpu_timer1_isr_PULT
0 0000b576 _RSB_TX_Handler
0 0000b5bb _RSB_RX_Handler
0 0000b600 _RSA_TX_Handler
0 0000b645 _RSA_RX_Handler
0 0000b68a _InitXintf16Gpio
0 0000b6e3 _InitXintf32Gpio
0 0000b733 _InitXintf
0 0000b796 FS$$DIV
0 0000b81e _get_crc_16b
0 0000b848 _get_crc_16
0 0000b859 _get_crc16
0 0000b893 _CANa_reset_err
0 0000b8be _CANa_handler
0 0000b908 _InitCpuTimers
0 0000b947 _ConfigCpuTimer
0 0000b966 _pause_us
0 0000b977 _init_zone7
0 0000b9b5 _c_int00
0 0000b9fb _cpu_timer2_isr
0 0000ba34 _filterbat
0 0000ba6b L$$DIV
0 0000ba7a L$$MOD
0 0000ba88 UL$$DIV
0 0000ba8f UL$$MOD
0 0000ba95 _InitPieCtrl
0 0000bab4 _EnableInterrupts
0 0000babe _sqrt
0 0000bade _what_is
0 0000bafb __args_main
0 0000bb16 _InitAdc
0 0000bb2f C$$EXIT
0 0000bb2f _abort
0 0000bb31 _exit
0 0000bb48 _InitPieVectTable
0 0000bb56 U$$DIV
0 0000bb5b U$$MOD
0 0000bb61 __register_unlock
0 0000bb65 __register_lock
0 0000bb69 __nop
0 0000bb6a _set_cntrl_addr
0 0000bb6f _DSP28x_usDelay
0 0000bb73 ___etext__
0 0000bb73 etext
0 0000c000 _RamfuncsLoadEnd
0 0000c000 _RamfuncsLoadStart
0 0000c000 _RamfuncsRunStart
0 0000c10f _ADDR_ANSWER
0 0000c110 _ADDR_TERMINAL
0 0000c111 _CNTRL_ADDR_UNIVERSAL
0 0000c000 ___cinit__
0 0000c000 cinit
0 0000c28c _PieVectTableInit
0 0000c3ae _ADDR_ANSWER
0 0000c3af _ADDR_TERMINAL
0 0000c3b0 _CNTRL_ADDR_UNIVERSAL
0 00380080 _ADC_cal
1 00000400 __stack
1 000007f0 __STACK_END
@@ -1444,77 +1515,82 @@ page address name
1 0000dc7c _LSPCLK
1 0000dc7e _HSPCLK
1 0000dc80 _param
1 0000dd01 _din_count
1 0000dd21 _ADC_table
1 0000dd40 _zer_filter
1 0000dd88 _prev_ok
1 0000dda4 _ccc
1 0000ddc0 _RS_Len
1 0000de06 _CpuTimer0
1 0000de0e _CpuTimer1
1 0000de16 _CpuTimer2
1 0000de1e _sens_pair
1 0000de36 _isNumb
1 0000de37 _quaLamp
1 0000de3c _isMask
1 0000de3e _Lonely
1 0000de40 _def_cal
1 0000de80 _sens_type
1 0000de98 _powK
1 0000deaa _Mode
1 0000deab _Desk
1 0000deac _TermoAD
1 0000dead _TermoRS
1 0000deae _TermoSW
1 0000deaf _Kurrent
1 0000deb0 _Kalibro
1 0000deb1 _Owen
1 0000deb2 _INcount0
1 0000deb3 _INcount1
1 0000deb4 _MUX_GPIO32
1 0000deb5 _MUX_GPIO48
1 0000deb6 _DIR_GPIO32
1 0000deb7 _DIR_GPIO48
1 0000deb8 _DigErr
1 0000deba _err_count
1 0000dec0 _period_dac
1 0000dec1 _time_dac
1 0000dec6 _WAKEpowse
1 0000dec8 _IMPowse
1 0000dece _CanTimeOutErrorTR
1 0000decf _wait
1 0000ded0 _ErrorCount
1 0000ded2 _MessageReceivedCount
1 0000ded4 _MessageTransivedCount
1 0000ded6 _TestMbox1
1 0000ded8 _TestMbox2
1 0000deda _TestMbox3
1 0000dedc _COUNT_ONE_CANAL
1 0000dedd _COUNT_DISCHARGE
1 0000dede _COUNT_TRANSICIA
1 0000dedf _FILTER_CLIP
1 0000dee4 _WAKE
1 0000dee6 _WAKE_TIME
1 0000dee8 _lev_quadr
1 0000def4 _no_write
1 0000def5 _never_write
1 0000def6 _flog
1 0000def8 _Log
1 0000df00 _ext_diag
1 0000df08 _ext_temp
1 0000df10 _zer_count
1 0000df18 _lev_count
1 0000df1e _readr
1 0000df23 _ADDR_FOR_ALL
1 0000df24 _CNTRL_ADDR
1 0000df25 _cntr_addr_c
1 0000df26 _cntr_addr_c_all
1 0000df27 _errno
1 0000df28 __unlock
1 0000df2a __lock
1 0000df2c __cleanup_ptr
1 0000df2e __dtors_ptr
1 0000df36 _low_count
1 0000dd01 _errno
1 0000dd02 _no_write
1 0000dd03 _never_write
1 0000dd04 _flog
1 0000dd18 _ump_dac_ramp
1 0000dd19 _ump_dac_duration
1 0000dd1a _ump_dac_go10
1 0000dd1b _ump_dac_stop10
1 0000dd1c _ump_dac_position
1 0000dd22 _Log
1 0000dd2a _powK
1 0000dd3c _ADDR_FOR_ALL
1 0000dd3d _CNTRL_ADDR
1 0000dd3e _cntr_addr_c
1 0000dd3f _cntr_addr_c_all
1 0000ddbc __unlock
1 0000ddbe __lock
1 0000ddc0 _zer_filter
1 0000de08 _din_count
1 0000de28 _CpuTimer0
1 0000de30 _CpuTimer1
1 0000de38 _CpuTimer2
1 0000de40 _RS_Len
1 0000de86 _ADC_table
1 0000dea2 _prev_ok
1 0000dec0 _def_cal
1 0000df00 _ccc
1 0000df1c _sens_pair
1 0000df34 _COUNT_ONE_CANAL
1 0000df35 _COUNT_DISCHARGE
1 0000df36 _COUNT_TRANSICIA
1 0000df37 _FILTER_CLIP
1 0000df3c _WAKE
1 0000df3e _WAKE_TIME
1 0000df40 _sens_type
1 0000df58 _CanTimeOutErrorTR
1 0000df59 _wait
1 0000df62 _ErrorCount
1 0000df64 _MessageReceivedCount
1 0000df66 _MessageTransivedCount
1 0000df68 _TestMbox1
1 0000df6a _TestMbox2
1 0000df6c _TestMbox3
1 0000df70 _Mode
1 0000df71 _Desk
1 0000df72 _TermoAD
1 0000df73 _TermoRS
1 0000df74 _TermoSW
1 0000df75 _Kurrent
1 0000df76 _Kalibro
1 0000df77 _Owen
1 0000df78 _INcount0
1 0000df79 _INcount1
1 0000df7a _MUX_GPIO32
1 0000df7b _MUX_GPIO48
1 0000df7c _DIR_GPIO32
1 0000df7d _DIR_GPIO48
1 0000df7e _DigErr
1 0000df80 _period_dac
1 0000df81 _time_dac
1 0000df86 _WAKEpowse
1 0000df88 _IMPowse
1 0000df8e _lev_quadr
1 0000df9a _isNumb
1 0000df9b _quaLamp
1 0000dfa0 _isMask
1 0000dfa2 _Lonely
1 0000dfa4 _ext_diag
1 0000dfac _ext_temp
1 0000dfb4 _zer_count
1 0000dfbc __cleanup_ptr
1 0000dfbe __dtors_ptr
1 0000dfc0 _err_count
1 0000dfc6 _lev_count
1 0000dfcc _readr
1 0000dfdb _low_count
1 00200000 _logs_block
1 0033fff8 _CsmPwl
1 00380090 _PartIdRegs
@@ -1528,4 +1604,4 @@ abs ffffffff ___pinit__
abs ffffffff binit
abs ffffffff pinit
[391 symbols]
[419 symbols]

View File

@@ -40,12 +40,13 @@ Source="Source\Internal\pulto.c"
Source="Source\Internal\RS485.c"
Source="Source\Internal\spise2p.c"
Source="Source\Internal\tools.c"
Source="Source\Internal\shared_ump.c"
Source="F28335.cmd"
Source="Source\External\v120\DSP2833x_headers\cmd\DSP2833x_Headers_nonBIOS.cmd"
["Debug" Settings]
FinalBuildCmd=$(Proj_dir)\bin\hex2000.exe $(Proj_dir)\bin\UKSSTMS320F28335.out -boot -sci8 -map $(Proj_dir)\bin\UKSSTMS320F28335.map -o $(Proj_dir)\bin\UKSSTMS320F28335.hex -i
FinalBuildCmd=$(Proj_dir)\bin\hex2000.exe $(Proj_dir)\bin\UKSSTMS320F28335.out -boot -sci8 -map $(Proj_dir)\bin\UKSSTMS320F28335.map -o $(Proj_dir)\bin\UKSSTMS320F28335.bin -b
FinalBuildCmd=cmd /c ""$(Proj_dir)\build_bin.bat""
["Compiler" Settings: "Debug"]
Options=-g -pdsw225 -o1 -fr"$(Proj_dir)\Debug" -fs"$(Proj_dir)\Asm" -i"$(Proj_dir)\Source\External\v120\DSP2833x_headers\include" -i"$(Proj_dir)\Source\Internal\Include" -i"$(Proj_dir)\Source\External\v120\DSP2833x_common\include" -d"_DEBUG" -d"LARGE_MODEL" -md -ml -v28 --float_support=fpu32

View File

@@ -1,5 +1,13 @@
<?xml version="1.0" encoding="UTF-8" ?>
<?ccsproject version="1.0"?>
<projectOptions>
<ccsVersion value="12.3.0"/>
<deviceVariant value="TMS320C28XX.TMS320F28335"/>
<deviceFamily value="C2000"/>
<deviceEndianness value="little"/>
<codegenToolVersion value="22.6.0.LTS"/>
<isElfFormat value="false"/>
<rts value=""/>
<isTargetManual value="false"/>
<connection value="common/targetdb/connections/SAU510USBIsoPlusV2_Connection.xml"/>
</projectOptions>

File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More